Скетч для NRF24L01

gfg_gfg

✩✩✩✩✩✩✩
1 Дек 2020
2
0
Приветствую ардуинщики. В теме ардуино я не совсем новичок,но и до среднего уровня врядли дохожу.
Вообщем делаю рюкзак для велосипедиста с поворотниками. Разумеется "беспроводной". Соеденяю две ардуинки с помощью NRF24l01.
Скетч взял и переработал с уроков Alex-а,но никак не могу довести его до ума.На передатчике стоит выключатель, а на приёмнике две адресные матрицы 8x8 соединённые вместе. Вообщем проблема в том,что когда переходишь выключатель в ON матрицы забираются,но вот при переводе его в OFF. Матрицам глубоко пофиг и они продолжают гореть. Как сделать этот выключатель на 1-ной плате я понимаю и даже делаю. Но вот при соединении двух мозга не хватает... Помогите пожалуйста.))
 

DAK

★✩✩✩✩✩✩
8 Окт 2020
212
49
Скетч бросьте, поглядеть, на обе платы.
 

Nikanor

★✩✩✩✩✩✩
1 Окт 2020
57
13
да и схему показать, чтобы потом вопросов не было.
 

DAK

★✩✩✩✩✩✩
8 Окт 2020
212
49
Схема наверное очень классная, надо где то в ON ПЕРЕЙТИ выключатель и после чего матрицы начинают заБИРАТЬСЯ... прям Т9 жжёт, не удержался, прям интересно стало как там скетч переработали, наверное надо предложить сделать отдельный проект для велосипедистов. Матрица + микрофон... Посигналил сзади, а тем с ранца жест неприличный, ещё датчик ускорения прикрутить, резко останавливаешься, там сразу стоп загорается, ну и картинки классные, чтоб все на тачке ездили и засматривались на такой мега ранец и попутно не замечали других участников движения. Хотя наверное это немного противозаконно использовать такого рода приблуды, хотя о чём это я, всем же пох....
 

gfg_gfg

✩✩✩✩✩✩✩
1 Дек 2020
2
0
Скетч бросьте, поглядеть, на обе платы.
Приёмник:
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 128
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"


RF24 radio(9, 10);
//RF24 radio(9,53);

byte recieved_data[3];
byte LED_PIN = 6;


byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
 

  radio.begin();
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);   
  radio.enableAckPayload();   
  radio.setPayloadSize(32);   

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x65);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
  strip.begin();
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
    digitalWrite(LED_PIN, recieved_data[0]);
    //то бишь 0 или 1
    for (int i = 0; i < LED_COUNT; i++)
  {
    strip.setPixelColor(i, strip.Color(255, 0, 0)); // Красный цвет.
  }
  // Передаем цвета ленте.
  strip.show();
  // Ждем 500 мс.
  delay(500);
 
 
  }
}
Передатчик:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

byte button = 3;  // кнопка на 3 цифровом


byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  pinMode(button, INPUT_PULLUP); // настроить пин кнопки

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x65);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {

  transmit_data[0] = !digitalRead(button); // инвертированный (!) сигнал с кнопки

  for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
    if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; // запомнить последнее изменение
    }
  }

  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
    flag = 0; //опустить флаг
    radio.powerDown(); // выключить передатчик
  }

}
 

DAK

★✩✩✩✩✩✩
8 Окт 2020
212
49
там где приёмник между 45 и 46 строкой
выведите в ком порт recieved_data[0], оно хоть изменяется?, led_pin что запитывает, как включен? не через мосфит случайно? если да, то есть ли сопротивление между затвором и стоком? У меня стоит 510 КОм, можно 10, можно хоть сколько, но если его нет, то при выключении питания у меня мосфит не вырубало, но я использовал оптопару, а как у Вас я не знаю, надо схему глядеть и если значение выходит нормальное, надо думать о схемотехники
 

Старик Похабыч

★★★★★★✩
14 Авг 2019
2,333
635
Москва
Приемник. Что по вашему делает эта строка ?
digitalWrite(LED_PIN, recieved_data[0]);

Для того, что бы погасить ленту, надо все светодиоды "зажечь" абсолютно черным цветом, т.е. RGB(0,0,0) или, как в этой библиотеке, strip.Color(0, 0, 0)
У вас же лента просто загорается и все. Нигде не гаснет.
 
  • Лойс +1
Реакции: DAK

DAK

★✩✩✩✩✩✩
8 Окт 2020
212
49
Точно, только сейчас увидел, что strip при инициализации юзает этот самый led_pin. Надо просто условие в 46 строке...