Запуск функции при долгом зажатии кнопки на ESP8266

Тема в разделе "Проводная и беспроводная связь", создана пользователем Otto, 6 авг 2016.

  1. Otto

    Otto Нерд

    Такая проблема, вроде и не сложная, но не могу понять как решить. Переделал функцию button1() на кнопке №1, что бы при обычных (коротких) нажатиях переключался regim1 на значения 0 или 1, а при удержании этой кнопки 2 или более секунд включался режим auto с функции pir() (датчика движения). Так вот, кнопка отлично переключается во всех трёх режимах, но почему то при выборе auto режима функция pir() не срабатывает. Возможно где то перепутал с условиями проверок в функции button1()....
    Код (C++):
    ***
    boolean Status1 = true;                // объявляем Status1 реле в 0, инверсия...
    boolean btnPress1 = false;             // объявляем что кнопка №1 не нажата "0"
    boolean lastbtnStat1 = false;          // временная переменная для хранения статуса1

    int regim1 = 0;               // Режимы по умолчанию при включении

    bool button_long_state = false;   // Булево значение для выбора режима button1()
    uint32_t ms_button = 0;           // Беззнаковый тип конкретного размера для выбора режима button1()

    ***

    void button1() {                     // Функция для кнопки №1
      btnPress1 = digitalRead(BUTTON_1);    // Считываем значение кнопки в btnPress1
      Status1 = digitalRead(RELAY_1);       // Считываем значение реле в Status1
      if (btnPress1 && !lastbtnStat1) {     // Если btnPress1 нажата и lastbtnStat1 ИСТИНА...
        delay(30); // защита от дребезга
        btnPress1 = digitalRead(BUTTON_1);  // ... записываем результат в btnPress1
      }

      uint32_t ms = millis();   //Задаём переменную для хранения времени
      // Фиксируем нажатие кнопки (более 10 мкр./сек.)
      if (btnPress1 == false && !lastbtnStat1 && (ms - ms_button) > 10) {
        lastbtnStat1 = true;
        button_long_state = false;
        ms_button = ms;
      }
      // Фиксируем длинное нажатие кнопки (больше или равно 2-м секундам)
      if (btnPress1 == false && !button_long_state && ( ms - ms_button ) >= 2000 ) {
        button_long_state = true;
        regim1 = 2;
        pir();
      }

      // Фиксируем отпускание кнопки (более 10 мкр./сек.)
      if (btnPress1 == true && !lastbtnStat1 && ( ms - ms_button ) > 10) {
        lastbtnStat1 = false;
        ms_button = ms;
        // Цикл проверки/переключения 0 и 1 режима
        if (btnPress1) {                 // Если кнопка нажата, то...
          regim1++;                      // переключаем на слежующий режим
          if (regim1 > 1) {              // если действующий режим > второго, то...
            regim1 = 0;                  // возвращаемся на нулевой режим
          }
        }
        if (regim1 == 0) {                  // Если режим 1=0, то...
          Status1 = true;                   // Status1 ИСТИНА (инверсия для Реле)
          digitalWrite(RELAY_1, Status1);   // Выключаем Реле №1
        }
        if (regim1 == 1) {                  // Если режим 1=1, то...
          Status1 = false;                  // Status1 ЛОЖЬ (инверсия для Реле)
          digitalWrite(RELAY_1, Status1);   // Включаем реле №1
        }
      }

      lastbtnStat1 = btnPress1;     // Копируем значение из кнопки в lastbtnStat1
    }

     
    На всякий случай прикладываю код программы, для понимания в архиве...
     

    Вложения: