IR, Nrf24l01+, задержка пакета
- Войдите на сайт для отправки комментариев
Имеется:
1. приёмник: UNO R3, ИК приемник, Nrf24l01+
2. излучатель: Nano, ИК диод, Nrf24l01+
В програмирование не очень силён. Схема следующая: первый модуль принимает сигнал, далее передает на второй, второй модуль через ИК диод повторяет. По сути это ИК повторитель.
Схема вообщем то работает, но... сейчас работает так:
1. Включаем излучатель
2. Включаем приёмник
3. Нажимаем кнопку пульта допустим "1", приёмник принимает, корректно дешифрует полученный сигнал, но на излучатель не отправляет.
4. Нажимаем кнопку пульта допустим "2", приёмник принимает, корректно дешифрует полученный сигнал, но на излучатель отправляет код кнопки "1" и т.д. При нажатии новой кнопки происходит отправка ранее нажатой.
Лечится это кнопкой сброса на модуле приемника. После работает все как надо.
Код приемника:
#include <SPI.h> #include "RF24.h" #include <IRremote.h> int RECV_PIN = 4; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; RF24 radio(9, 10); int pipe = 0xF0F0F0F000LL; void setup(){ Serial.begin(9600); irrecv.enableIRIn(); radio.begin(); radio.setDataRate(RF24_2MBPS); // radio.setDataRate(RF24_1MBPS); // radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openWritingPipe(pipe); } void loop() { if (irrecv.decode(&results)) if (results.value!=4294967295) //отсекаем команду повтора кнопки { radio.write(&results.value, 4); Serial.print(results.value); Serial.print(" 4="); Serial.print(results.value, 4); Serial.print(" hex="); Serial.println(results.value, HEX); irrecv.resume(); } else irrecv.resume(); }
Код излучателя:
#include <SPI.h> #include "RF24.h" #include <IRremote.h> IRsend irsend; unsigned long IR_Button; RF24 radio(9,10); int pipe = 0xF0F0F0F000LL; void setup() { Serial.begin(9600); radio.begin(); radio.setDataRate(RF24_2MBPS); // radio.setDataRate(RF24_1MBPS); // radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openReadingPipe(1,pipe); radio.startListening(); void loop() { IR_Button=0; while (radio.available()) { radio.read(&IR_Button, 4), irsend.sendNEC(IR_Button, 32); Serial.print(IR_Button); Serial.print(" 4="); Serial.print(IR_Button, 4); Serial.print(" hex="); Serial.println(IR_Button, HEX); } }
Как исправить этот косяк, в чем ошибка?
Строка 40 в первом скетче сработает в двух случаях, если код еще не принят (звоночек), а также если принят код повтора (это нормально), потому я бы разнес эти вещи, иначе если код уже начал приниматься, а мы получили resume и это не есть гуд. МОжет это и не причина, но не причина, чтобы получить удар ниже пояса в неопределенный момент.
Как вариант, можно сделать так: