Не выключается диод

Тема в разделе "Arduino & Shields", создана пользователем Vetrinus, 24 сен 2015.

  1. Vetrinus

    Vetrinus Гик

    Здравствуйте.
    Подскажите, пожалуйста.
    Использую передатчик 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);
    загорается, но не гаснет. В чем проблема?
     
    Последнее редактирование: 24 сен 2015
  2. MDV

    MDV Гик

    Исходя из логики заложенной в програму так и должно быть.
    Есть условие при выполнении которого индикация включается, но нет условия при котором нужно его выключить.
    попробуй так:
    Код (C++):
    if (mydata.data == 1)
    {
      digitalWrite (SVET, HIGH);
    }
    else if (mydata.data != 1)
    {
        (SVET, LOW);
    }
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    bool running =false;
    каждый раз создается переменная, каждый раз ей присваивается false, каждый раз по условию false меняется на true.
    Вынесите объявление переменной из функции и заработает как надо.
     
    Vetrinus нравится это.
  4. Vetrinus

    Vetrinus Гик

    Премного благодарен за своевременный ответ)