Друзья. Зашёл в тупик с кодом. В общем есть 3 ардуино на NRF. 2 из них передатчик и 1 приёмник. На тех что передатчик по кнопке. Обрабатывает их приёмник - кто быстрее нажал у таго и загорается сигнал на приёмнике. И пока не пройдёт 5 сек не реагирует на нажатия другого. Это всё работает как надо. Но мне надо чтобы и на кнопках загорался светодиод. Причём также - пока одна кнопка в течении 5 секунд горит, другая не нажимается. Не знаю как осилить эту задачу. Код прикладываю Код (C++): //ПЕРЕДАТЧИК #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> long r; RF24 radio(9,10); void RGB() { } void setup() { r = 0; radio.begin(); radio.setChannel(15); radio.setDataRate (RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.openWritingPipe(0x0123456789LL); pinMode(A0,INPUT_PULLUP); pinMode(2, OUTPUT); } void loop() { // Кнопка 1 if ((!digitalRead(A0)) == true) { r = 1; radio.write(&r,sizeof(r)); digitalWrite(2,HIGH); delay(5100); digitalWrite(2,LOW); RGB(); delay(100); } } Код (C++): //ПРИЁМНИК #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> RF24 radio(9,10); long y; void setup() { radio.begin(); radio.setChannel(15); radio.setDataRate (RF24_250KBPS); radio.setPALevel(RF24_PA_LOW); radio.openWritingPipe(0x0123456789LL); Serial.begin (9600); mp3_set_serial (Serial); Serial.begin(9600); y = 0; pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); radio.startListening(); mp3_set_volume (10); } void loop() { radio.read(&y,sizeof(y)); if (y == 1) { Serial.println("1"); digitalWrite(A0,HIGH); mp3_play (1); delay(5000); mp3_stop (); delay(100); void(* resetFunc) (void) = 0; resetFunc(); } if (y == 2) { Serial.println("2"); digitalWrite(A1,HIGH); mp3_play (2); delay(5000); mp3_stop (); delay(100); void(* resetFunc) (void) = 0; resetFunc(); } digitalWrite(A0,LOW); digitalWrite(A1,LOW); }
Не глядя в ваш код могу сказать. Ваша задача не имеет решения. Как может передатчик что-то "знать" про кнопку другого передатчика ?
Я совсем недавно пробую себя в этой сфере. А если обратно передавать? Или может между собой связь? Или в передатчики ещё модуль какой-нибудь воткнуть?
Я бы сделал так в коде приемника 1— в сетапе А0 и А1 в состояние LOW 2— в лупе перед вторым if написать else типо так else if (y==2) далее по тексту
Не работал с модулем NRF. Поэтому спрашиваю - Модули-то все одинаковые на Ардуинах ? Они же не бывают только приемник / передатчик. Они - приёмопередатчик. Требуется только программа. Связь передатчиков между собой - избыточна. Должна быть "звезда"- все через центр (транкинг-связь). Центр принял с устройства 1, отправил подтверждение на уст. 1 и сообщение на уст. 2. На уст. 2 засветился огонек и заблокировалась передача на время. И наоборот.
Вам нужно избавиться от delay. Для каждого СД нужно засекать время его включения. А в другом if проверять не прошло ли время горения и, если прошло, выключить СД
delay то здесь какраз кстати.Он и будет блокировать программу от всех телодвижений пока принят сигнал и горит светодиод. Как гриться кто первый включил тот молодец а кто нет-сами знаете
Вот как можно отправить на активный передатчик обратно какое-нибудь значение, которое включит СД и также не позволит не активному передатчику не включать СД на заданное время? Или это невозможно?
Очевидно придется отправлять двум адресатам - активному и неактивному. Активному - подтверждение, неактивному - предупреждение.