РЕШЕНО Не правильно работает mils() при использовании IRDA

Тема в разделе "Arduino & Shields", создана пользователем Wlas72, 8 ноя 2019.

  1. Wlas72

    Wlas72 Нерд

    Задача простая: Arduina, 2 светодиода и IRDA. При нажатии на кнопку "1" на пульте ДУ - мигает один светодиод, при нажатии на кнопку "2" - мигает второй. Код вот такой:

    Код (C++):
    #include <IRremote.h>
    #define LED_PIN  13      // номер выхода,подключенного к светодиоду
    #define LED_PIN3  10
    #define INTERVAL  100UL           // интервал между включение/выключением светодиода

    unsigned long _ABVAR_1_IR = 0UL ;
    //libraries at http://duinoedu.com/dl/lib/grove/EDU_IRremote_GroveDupont/
    IRrecv monRecepteur_pin4(4);

    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(LED_PIN3, OUTPUT);
      monRecepteur_pin4.enableIRIn();
    }

    void loop()
    {
      _ABVAR_1_IR = monRecepteur_pin4.lireCodeIr()  ;
      if (( ( _ABVAR_1_IR ) == ( 16736925UL ) ))
      {
        static unsigned long previousMillis = 0;
        if(millis() - previousMillis > INTERVAL) {
        previousMillis = millis();
        digitalWrite(LED_PIN,!digitalRead(LED_PIN));
    }
      }
      if (( ( _ABVAR_1_IR ) == ( 16753245UL ) ))
      {
        static unsigned long previousMillis = 0;
        if(millis() - previousMillis > INTERVAL) {
        previousMillis = millis();
        digitalWrite(LED_PIN3,!digitalRead(LED_PIN3));
    }
      }
    }
    На кнопки реагирует, но не так, как хотелось бы, т.е. первый раз нажимаем - включается, второй раз нажимаем - выключается, мигать светодиод не хочет. Хотя в коде ниже мигает без проблем. В чем ошибка?

    Код (C++):
    #define LED_PIN 13 // номер выхода,подключенного к светодиоду
    #define INTERVAL 1000UL // интервал между включение/выключением светодиода (1 секунда)

    void setup() {
    // задаем режим выхода для порта, подключенного к светодиоду
    pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {
    // здесь будет код, который будет работать постоянно
    // и который не должен останавливаться на время между переключениями свето

    static unsigned long previousMillis = 0; // храним время последнего переключения светодиода



    //проверяем не прошел ли нужный интервал, если прошел то
    if(millis() - previousMillis > INTERVAL) {
    // сохраняем время последнего переключения
    previousMillis = millis();

    // меняем состояние выхода светодиода на противоположное текущему.
    // если горит - тушим, не горит - зажигаем.
    digitalWrite(LED_PIN,!digitalRead(LED_PIN));
    }
    }
     
  2. asam

    asam Гик

    Может у пульта повтор кнопки идет с другим кодом. Добавте вывод в сериал порт значения _ABVAR_1_IR сразу после
    Код (Text):
    _ABVAR_1_IR = monRecepteur_pin4.lireCodeIr();
     
  3. KindMan

    KindMan Гуру

    У вас двойное определение переменной. Мигать светодиоды будут не так, как вы задумали.
    Что делает функция lireCodeIr()?
     
    Последнее редактирование: 8 ноя 2019