Здравствуйте. Подскажите, пожалуйста. Использую передатчик FS1000A и приемник XY-MK-5V. подключил описывающую работу с ними библиотеку VirtualWire и структурирующую данные библиотеку EasyTransfer. Скетч приемника - Код (C++): #include <EasyTransferVirtualWire.h> #include <EEPROM.h> #include <VirtualWire.h> #include <VirtualWire_Config.h> const int led_pin = 13; const int receive_pin = 2; unsigned int unique_device_id = 0; #define SVET 7 //create object EasyTransferVirtualWire ET; char buf[120]; struct SEND_DATA_STRUCTURE{ //наша структура данны. она должна быть определена одинаково на приёмнике и передатчике //кроме того, размер структуры не должен превышать 26 байт (ограничение VirtualWire) unsigned int device_id; unsigned int destination_id; unsigned int packet_id; byte command; int data; }; //переменная с данными нашей структуры SEND_DATA_STRUCTURE mydata; //ниже пару функций для записи данных типа unsigned int в EEPROM void EEPROMWriteInt(int p_address, unsigned int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void setup() { pinMode(SVET, OUTPUT); pinMode(led_pin, OUTPUT); Serial.begin(9600); // Debugging only ET.begin(details(mydata)); // Initialise the IO and ISR vw_set_rx_pin(receive_pin); vw_setup(2000); // Скорость приёма vw_rx_start(); // Запуск режима приёма // Device ID Serial.print("Getting Device ID... "); unique_device_id=EEPROMReadInt(0); if (unique_device_id<10000 || unique_device_id>60000) { Serial.print("N/A, updating... "); unique_device_id=random(10000, 60000); EEPROMWriteInt(0, unique_device_id); } Serial.println(unique_device_id); } void loop() { if(ET.receiveData()) // получили пакет данных, обрабатываем { digitalWrite(led_pin, HIGH); 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(); digitalWrite(led_pin, LOW); bool running = false; if(mydata.data == 1) { running=!running; digitalWrite (SVET, running); } } } диод, управляемый вот этим кодом Код (C++): bool running = false; if(mydata.data == 1) { running=!running; digitalWrite (SVET, running); загорается, но не гаснет. В чем проблема?
Исходя из логики заложенной в програму так и должно быть. Есть условие при выполнении которого индикация включается, но нет условия при котором нужно его выключить. попробуй так: Код (C++): if (mydata.data == 1) { digitalWrite (SVET, HIGH); } else if (mydata.data != 1) { (SVET, LOW); }
bool running =false; каждый раз создается переменная, каждый раз ей присваивается false, каждый раз по условию false меняется на true. Вынесите объявление переменной из функции и заработает как надо.