Проблема при работе с кнопками

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем a1000, 15 окт 2017.

  1. a1000

    a1000 Гуру

    Есть у меня один вялотекущий проект. При наличии настроения и свободного времени пробую сделать часы с синхронизацией по GPS. Всё уже как-бы получилось и работает в макетном варианте, но остался один незначительный вопрос - изменение GMT для перехода на зимнее-летнее время. Всё управлении необходимо реализовать двумя кнопками (больше не осталось свободных портов). Логика управления задумана такая:
    Длинное нажатие кнопки 2 - переход в режим корректировки GMT.
    В режиме корректировки короткое нажатие на кнопку 1 увеличивает GMT на одну единицу, соответственно короткое нажатие на кнопку 2 уменьшает GMT на одну единицу.
    Длинное нажатие кнопки 2 в режиме корректировки - возврат часов в основной режим.
    Что-бы не расписывать в скетче устранение дребезга контактов и разделение на длинное и короткое нажатие, воспользовался библиотекой из этой статьи http://samopal.pro/arduino-button-2/
    При запуске тестового скетча из библиотеки всё работает на ура. Попробовал применить это в часах. Привожу ту часть, в которой реализована корректировка GMT
    Код (C++):
    #include "sav_button.h"
    SButton button1(11,50,2000,0,0);
    SButton button2(12,50,2000,0,0);
    int timeoffset = 3; // Это и есть тот самый GMT

    void setup(void) {
    ...........
    ...........
      // Инициация кнопок
       button1.begin();
       button2.begin();

    ...............,
      ..............
         
    }

    void loop(void)
    {
    ..................
    ..................

    // Установка часового пояся
      if ( button2.Loop() == SB_LONG_CLICK )  //вход в режим корректировки по длинному нажатию кнопки 2
      {
         int timeoffset_now = 100000;
         for (; button2.Loop() != SB_LONG_CLICK;)  // пока нет длинного нажатия кнопки 2
            {
              if (timeoffset_now != timeoffset)  // вывод на экран текущего значения GMT
              {
                tft.fillScreen(BLACK);
                if (timeoffset>0) GMT = "GMT +" + String(timeoffset);
             
                else GMT = "GMT " + String(timeoffset);
       
                tft.setCursor(45, 90);
                tft.setTextColor(RED);  tft.setTextSize(6);
                tft.println(GMT);
                timeoffset_now = timeoffset;
              }
              if (button1.Loop() == SB_CLICK)  //увеличение GMT на единицу по короткому нажатию кнопки 1
              {
                if (timeoffset<12) timeoffset++;
              }

              if (button2.Loop() == SB_CLICK) //уменьшение GMT на единицу по короткому нажатию кнопки 2
              {
                if (timeoffset>-12) timeoffset--;
              }
       
              minut = -1;
            }
      }
    }

    }
    На практике всё работает не совсем так как задумано. В корректировку по длинному нажатии кнопки 2 входит. Кнопка 1 работает как задумано. Но кнопка 2 в режиме корректировки работает через раз. Менял кнопки, порты - не помогает. Кто подскажет в чём проблема.
     
  2. Nikita228

    Nikita228 Гик

    Скорее всего проблема в задержке работы приемника