Всем доброго дня! Контекст такой - есть две Ардуино, которые требуется соединить "в одну сторону" с помощью приемника и передатчика на 433МГц. Не знаю насколько это принципиально, но использую библиотеки VirtualWire и передаю свою структуру данных длиной 6 байт на скорости 4000 б/с. Если я в loop() без каких либо перерывов на стороне передатчика отправляю данные, а в loop() на стороне приемника их принимаю (тоже без других подпроцессов) - все хорошо, данные передаются (видимо в какие-то моменты циклы приема передачи совпадают). Но если я нагружаю приемник и прередатчик какой-то логикой, когда между передачей появляются нерегуляргые задержки, а между сеансами приема - другие нерегулярные задержки, циклы практически не совпадают и пакеты не ловятся. Если хотя бы на одной стороне задержки убрать - ловиться нормально. Значит причина в несинхронности сеансов. Возможно ли на принимающей стороне повесить сигнал приемника на прерывание (свободный пин с прерыванием есть)? Какую библиотеку для работы с приемником использовать (VirtualWire подойдет)?
Да, спасибо за исчерпывающий совет. На этом можно закрывать ветку. Но если у кого-то будут конкретные предложения - код ниже Код (C++): #include <VirtualWire.h> #include <EasyTransferVirtualWire.h> byte unique_device_id = 2; // номер устройства EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE { byte device_id; // код отправителя byte destination_id; // код полчателя, 0 - все, 1- мастер, 2-слейв 1,.. byte packet_id; // ID пакета byte command; // тип команды управления, 0 - все выключить, 1 - управление анимацией unsigned int data; // передаваемые данные от 0 до 65535 }; SEND_DATA_STRUCTURE mydata; const int receive_pin = 3; //код для приемника volatile unsigned long previousMillis = 0; // момент последнего изменения состояния void setup() { ET.begin(details(mydata)); vw_set_rx_pin(receive_pin); //код приемника vw_setup(4000); // Скорость приёма vw_rx_start(); // Запуск режима приёма mydata.device_id = unique_device_id; mydata.destination_id = 2; mydata.command = 0; mydata.data = 0; Serial.begin(9600); Serial.println("Started."); randomSeed(analogRead(0)); } void loop() { timer_LED_State(); recMyData(); //код приемника } void recMyData() { if (ET.receiveData()) // получили пакет данных, обрабатываем { Serial.print("Got: "); Serial.print("Device ID: "); Serial.print(mydata.device_id); Serial.print(" Destination ID: "); Serial.print(mydata.destination_id); Serial.print(" Packet ID: "); Serial.print(mydata.packet_id); Serial.print(" Command: "); Serial.print(mydata.command); Serial.print(" Data: "); Serial.print(mydata.data); Serial.println(); } } void timer_LED_State() { int interval = 100; unsigned long currentMillis = millis(); // текущее время в миллисекундах if ((currentMillis - previousMillis) > interval) { previousMillis = currentMillis; // сохраняем последний момент, когда менялось состояние светодиода int d = random(100); delay(d); //тут начинаются процессы, которые я заменил задержкой и которые можно/нужно прервать при поступлении нового сигнала с приемника } }
https://www.airspayce.com/mikem/arduino/VirtualWire/ Тут хвалятся, что RadioHead совместима и более продвинута. Английский ! Без инфы об радио-девайсах трудно что советовать.
Возможно, только вы ни слова ни сказали про используемое оборудование. parovoZZ и не только вам про это же сказали... Какой интерфейс используется радиоканалом, тем прерыванием и пользуйтесь.
Спасибо, буду пробовать. Про оборудование действительно не подумал написать так как все брал на Амперке и почему-то подумал что само собой разумеется. Пардоньте Беспроводной приёмник на 433 МГц http://amperka.ru/collection/wireless/product/rf-433-receiver Беспроводной передатчик на 433 МГц http://amperka.ru/collection/wireless/product/rf-433-transmitter Arduino Nano http://amperka.ru/collection/arduino/product/arduino-nano
Где-то уже говорил про них - какашка, которую не исправить... Перечень недовольства даже не буду прикладывать... Первое - необходимость согласования (50/50) для устойчивой связи. Использую HC-12 - в разы удобнее и практичнее, но дороже...