Не могу заставить светодиод гореть через NrF

Помогите пожалуйста. Хочу заставить лампочку гореть, после того как нажал-отпустил кнопку, и нажал-отпустил перестала гореть и всё через NRF24 модули связи. Весь интернет перешарил, у Алексгайвера такого нет, только демонстрация нажал кнопку горит, отпустил погасла.
Код передатчика

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10);  // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = { "1Node", "2Node", "3Node", "4Node", "5Node", "6Node" };  //возможные номера труб

int valX = A3;  // значения с джойстика по оси Х
int valY = A1;  // значения с джойстика по оси Y
int button = 7;   // кнопка у джойстика
bool flag = false;

int transmit_data[3];  // массив, хранящий передаваемые данные ( 3 значения с джойстика )

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(0x60);             //выбираем канал (в котором нет шумов!)
  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] = analogRead(valX);   // присваиваем массиву 0 значение с джойстика по оси X
  transmit_data[1] = analogRead(valY);   // присваиваем массиву 1 значение с джойстика по оси Y

  bool btnState = !digitalRead(button);
  if (btnState && !flag) {  // обработчик нажатия
    flag = true;
    Serial.println("press");
  }
  if (!btnState && flag) {  // обработчик отпускания
    flag = false;  
    Serial.println("release");
  }
    
  transmit_data[2] = flag

  radio.write(&transmit_data, sizeof(transmit_data));  // отправить по радио
  Serial.print(transmit_data[0]);
  Serial.println(transmit_data[1]);
  Serial.println(transmit_data[2]);

}

Код приёмника

#include "GyverMotor.h"
#include "RF24.h"
#include "nRF24L01.h"
#include <SPI.h>
#include <Servo.h>

GMotor motorR(DRIVER3WIRE, 4, 2, 3);
GMotor motorL(DRIVER3WIRE, 7, 8, 6);

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node",
                     "4Node", "5Node", "6Node"}; //возможные номера труб

int recieved_data[4]; // массив принятых данных
int valX;             // данные с джойстика по оси X
int valY;             // данный с джойстика по оси Y
boolean butt_flag = 0;

int led = A0;
int sig = A1; // сигнальная лампа для связи

Servo servo;

void setup() {
  // Пины D5 и D6 - 7.8 кГц
  TCCR0B = 0b00000010; // x8
  TCCR0A = 0b00000011; // fast pwm
  // Пины D3 и D11 - 62.5 кГц
  TCCR2B = 0b00000001; // x1
  TCCR2A = 0b00000011; // fast pwm
  Serial.begin(9600);  //открываем порт для связи с ПК
  servo.attach(5);
    
  pinMode(sig, OUTPUT); // настроить пин реле как выход
  pinMode(led, OUTPUT); // совещение
    
  motorR.setDirection(REVERSE);
  motorL.setDirection(REVERSE);
  motorR.setMode(AUTO);
  motorL.setMode(AUTO);
  motorR.setSpeed(0);
  motorL.setSpeed(0);
  motorL.setMinDuty(1);
  motorR.setSmoothSpeed(30);
  motorL.setSmoothSpeed(30);
    
  radio.begin(); //активировать модуль
  radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32); //размер пакета, в байтах
  radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0
  radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
  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(); //начинаем слушать эфир, мы приёмный модуль
  servo.write(90);
}
void loop() {
  byte pipeNo;
  while (radio.available(&pipeNo)) { // слушаем эфир со всех труб
    radio.read(&recieved_data, sizeof(recieved_data)); // чиатем входящий сигнал
    valX = recieved_data[0]; // назначить массив принятых данных 0 на данные с
                             // джойстика по оси Х
    valY = recieved_data[1]; // назначить массив принятых данных 1 на данные с
                             // джойстика по оси Y
    butt_flag = recieved_data[2];  // освещение
    // джойстик на А0 и А1
    int signalX = 255 - valX / 2;
      
    motorL.smoothTick(signalX);
    motorR.smoothTick(signalX);
    valY = map(valY, 950, 0, 40, 122);
    servo.write(valY);
      
    digitalWrite(sig, butt_flag);
    digitalWrite(led, butt_flag);
      
  }
}

В чем тут может проблема?

Надо вводить флаг триггера,так скать.
При каждом событии “нажатие” этот флаг инвертируется.
Хошь на стороне передатчика,хошь на стороне приёмника.

1 лайк

А по подробнее можно. Я как новичок, стараюсь по видео сделать, и сам что то доделать. Во флажке вроде команда стоит !flag. Или что то не допонимаю :thinking:

Нет в языке Си никаких команд.
По видео лучше не учись, учись по книгам.

Вы тоже где-то слышали, что “Ардуино - это просто”? Вас обманули :wink:

1 лайк

Ну начинается. Проще сказать по книге, советов надавать…Я думал поможете внести поправки в код

У нас тут для этого отдельный раздел имеется.

Это ваш flag отвечает за сам факт нажатия. Чтобы это событие не повторялось пока кнопка в нажатом состоянии.
1. Если кнопка нажалась и flag(0),то ставим flag(1)
2. Если кнопка отпустилась, то ставим flag(0).
Это изначально.
Добавляем флаг,допустим, svet. В блоке кода,где обрабатываем нажатие инвертируем svet.
Получаем:
Flag svet
0 0
1 1
0 1
1 0
Разжевал как мог. Дальше только за Вас написать код)

2 лайка

Без “видосика” не щитаеццо :smiley:

1 лайк

Могу скинуть,но меня забанят за распространение порнографии. Стыдоба-то какая,мамочки!:grin:
Зато сразу понятно какой штекер в какой разъём и какую прошивку заливать.

Еще одно ваше заблуждение - “форум нужен для того, чтобы помогать…”. Вас и тут обманули, форумы нужны для общения по интересам. Конкретно на этом форуме помогают тем, кто хочет научиться программировать. Те, кто хочет по-быстрому обточить чужой код и запилить приблуду нам не интересны :wink:

А что, читать Вы не умеете? Хреново :frowning: Попробуйте научиться.

Так был бы Ваш код - помогли бы. А код-то гиверовский, вот к гиверу и обращайтесь.

У него кстати, собственный форум есть. Чиркните там в личку Arhat109, скажете ему, что были здесь и я Вас обидел, может и поможет.

1 лайк

Тогда все. Сливай воду, суши весла, склеивай ласты.

2 лайка

так бы и сказали, что не умеете. И причем тут чужой код. Я свой написал. не получилось. Что нашел в интернете, скопировал, сам пытаюсь доделать, не получается.
Одному помогли с кодом алексгавером, а тут прям налетели

Спасибо. Вот ему респект

Да не,тут реальные спецы) я так,любитель. Просто очень часто сюда заходят личности…не совсем понимающие чего им надо и права качают. Так что ежели кто и ругается,надо прислушаться, а не выплёскивать негатив. Почитай на досуге форум, сам поймешь)

Так и говорим, записывайте!


if (butt == 1 && butt_flag == 0) {  // обработчик нажатия
    butt_flag = 1;
    Serial.println("Button pressed");
    
  }
  if (butt == 0 && butt_flag == 1) {   // обработчик отпускания
    butt_flag = 0;
    Serial.println("Button released");
  }
  transmit_data[2] = butt_flag;

Переделал. Так же

А где в блоке условия в строчках флаг,о котором я говорил?
Вот так попробовать стоит:

Естессно, объявить не забыть.
Вот этот флаг и отправляйте приёмнику.

1 лайк

Выручил, спасибо большое :sunglasses: