Управление настройками энкодером.

Desvik
Offline
Зарегистрирован: 05.11.2017

Всем доброго времени суток!!!

Обращаюсь к вам за помощю с такой проблеммой, есть скетч (его выложу ниже) он был найден на просторах интернета и был для LCD 1602 и для трех кнопк. Передела его для LCD 128*64(st7920) и управление энкодером с кнопкой (прошу сильно не пинать так как я новичек в этом деле и только учусь писать скетчи). 



// Подключаем библиотеки:
#include <U8glib.h>
#include <iarduino_Encoder_tmr.h>
#include <Wire.h>                           // подключаем библиотеку для работы с шиной I2C
#include <iarduino_RTC.h>                   // подключаем библиотеку для работы с RTC модулем


U8GLIB_ST7920_128X64_4X u8g(5, 4, 3);       // объявляем  переменную для работы с LCD дисплеем, указывая параметры дисплея
iarduino_RTC time(RTC_DS1307);              // объявляем  переменную для работы с RTC модулем,  указывая название модуля
iarduino_Encoder_tmr enc(7,8);

// Объявляем переменные и константы:
const uint8_t PIN_button_SET  = 6;           // указываем номер вывода arduino, к которому подключена кнопка SET
      uint8_t VAR_mode_SHOW   = 1;           // режим вывода: 1-время 2-дата
      uint8_t VAR_mode_SET    = 0;           // режим установки времени: 0-нет 1-сек 2-мин 3-час 4-день 5-мес 6-год 7-день_недели
      uint8_t sec=0;                         // 

void setup() {
  pinMode(PIN_button_SET,  INPUT);           // устанавливаем режим работы вывода кнопки, как "вход"
  delay(300);                                // ждем 300мс
  time.begin();                              // инициируем RTC модуль
  enc.begin();                               // инициируем Encoder модуль
}


void loop(){
  time.gettime();
  if(sec!=time.seconds){                      // если прошла 1 секунда
     sec=(time.seconds/1.2);
     if(VAR_mode_SHOW==1){                    // если установлен режим вывода времени
      u8g.firstPage();  
  do {
      u8g.setPrintPos(10, 20);
      u8g.setColorIndex(1);
      u8g.setFont(u8g_font_unifont);
      u8g.print(time.gettime("H:i:s"));      // выводим время
    } while( u8g.nextPage());
    }
    if(VAR_mode_SHOW==2){                    // если установлен режим вывода даты
      u8g.firstPage();  
  do {
      u8g.setPrintPos(10, 20);
      u8g.setColorIndex(1);
      u8g.setFont(u8g_font_unifont);
      u8g.print(time.gettime("d-m-Y,D"));  // выводим дату
    } while( u8g.nextPage());
    }
    delay(1);                                // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
  }
  Func_buttons_control();                    // передаём управление кнопкам
}


// Функция управления кнопками:
void Func_buttons_control(){
  uint8_t i=0;
  int a=enc.read();
  time.blinktime(VAR_mode_SET);                                  // мигаем устанавливаемым параметром (если VAR_mode_SET больше 0)


//Если часы находятся в режиме установки даты/времени
  if(VAR_mode_SET){


//  Если нажата кнопка UP
    if(a==1){
      while(a==-1){delay(50);}                                   // ждём пока мы не отпустим кнопку UP
      switch (VAR_mode_SET){                                     // инкремент (увеличение) устанавливаемого значения
      /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: time.settime(-1, (time.minutes==59?0:time.minutes+1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: time.settime(-1, -1, (time.Hours==23?0:time.Hours+1),     -1, -1, -1, -1); break;
      /* дни */ case 4: time.settime(-1, -1, -1, (time.day==31?1:time.day+1),         -1, -1, -1); break;
      /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==12?1:time.month+1),     -1, -1); break;
      /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==99?0:time.year+1),       -1); break;
      /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==6?0:time.weekday+1) ); break;
      }
    }


//  Если нажата кнопка DOWN
    if(a==-1){
      while(a==1){delay(50);}            // ждём пока мы её не отпустим
      switch (VAR_mode_SET){             // декремент (уменьшение) устанавливаемого значения
      /* сек */ case 1: time.settime(0,                                   -1, -1, -1, -1, -1, -1); break;
      /* мин */ case 2: time.settime(-1, (time.minutes==0?59:time.minutes-1), -1, -1, -1, -1, -1); break;
      /* час */ case 3: time.settime(-1, -1, (time.Hours==0?23:time.Hours-1),     -1, -1, -1, -1); break;
      /* дни */ case 4: time.settime(-1, -1, -1, (time.day==1?31:time.day-1),         -1, -1, -1); break;
      /* мес */ case 5: time.settime(-1, -1, -1, -1, (time.month==1?12:time.month-1),     -1, -1); break;
      /* год */ case 6: time.settime(-1, -1, -1, -1, -1, (time.year==0?99:time.year-1),       -1); break;
      /* д.н.*/ case 7: time.settime(-1, -1, -1, -1, -1, -1, (time.weekday==0?6:time.weekday-1) ); break;
      }
    }
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){                        // ждём пока мы её не отпустим
        delay(10);
        if(i<200){i++;}                                          // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        VAR_mode_SET++;                                          // переходим к следующему устанавливаемому параметру
        if(VAR_mode_SHOW==1 && VAR_mode_SET>3){VAR_mode_SET=1;}  // возвращаемся к первому устанавливаемому параметру
        if(VAR_mode_SHOW==2 && VAR_mode_SET>7){VAR_mode_SET=4;}  // возвращаемся к первому устанавливаемому параметру
      }else{                                                     // если кнопка SET удерживалась дольше 2 секунд, то требуется выйти из режима установки даты/времени
        VAR_mode_SET=0;                                          // выходим из режима установки даты/времени
      }
    }
//Если часы находятся в режиме вывода даты/времени
  }else{
//  Если нажата кнопка SET
    if(digitalRead(PIN_button_SET)){
      while(digitalRead(PIN_button_SET)){delay(10);              // ждём пока мы её не отпустим
        if(i<200){i++;}                       // фиксируем, как долго удерживается кнопка SET, если дольше 2 секунд, то стираем экран
      }
      if(i<200){                                                 // если кнопка SET удерживалась меньше 2 секунд
        VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;                      // меняем режим вывода: дата/время
      }else{                                                     // если 
        if(VAR_mode_SHOW==1){VAR_mode_SET=1;}                    // если установлен режим вывода времени, то устанавливаемый параметр - секунды
        if(VAR_mode_SHOW==2){VAR_mode_SET=4;}                    // если установлен режим вывода даты,    то устанавливаемый параметр - день
      }
    }
  }
}

Скетч работает так. При включение появляются часы в режими отображения при кратковременном нажатии на кнпку энкодера часы пропадают и появляется дата и так по кругу, при нажатии на кнопку энкодера более 2 секунд переходим в режим настройки того или иного параметра (время/дата)смотря на каком экране находились. Находясь в режиме настроек кратковременными нажатия кнопки выбираем что нам нужно изменить, а изменяем значение поворотом экодера. Закончив настройку удерживаем кнопку энкодера более 2 секунд и выходим из режима настроек в режим отображения. Прошу обьяснить доступным языком.

Так вот вопрос такой:

Какдобавить еще один так скажим экран чтоб после появления даты и новым нажатием появилос ну для примера слово Hello ну и дальше по кругу.

И еще вопрос растолкуйте строчку 

VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;

мне кажется в ней у меня проблема а в частности что означает 1?2:1  . Заранее всем спасибо!!!

kalapanga
Offline
Зарегистрирован: 23.10.2016

Desvik пишет:

И еще вопрос растолкуйте строчку 

VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;

мне кажется в ней у меня проблема а в частности что означает 1?2:1  . Заранее всем спасибо!!!

? - оператор условия такой. Вся строка это:

if (VAR_mode_SHOW==1)
{
  VAR_mode_SHOW = 2
}
else
{
  VAR_mode_SHOW = 1
}

Т.е. не 1?2:1, а (VAR_mode_SHOW==1)?2:1  скобки для наглядности

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

Desvik пишет:

И еще вопрос растолкуйте строчку 

VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;

мне кажется в ней у меня проблема а в частности что означает 1?2:1  . Заранее всем спасибо!!!

...хм, что у этих людей в голове? - вместо того, что бы парить мозги автору скетча, пристают к незнакомым людям.

алё! ищи автора скетча.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Desvik пишет:

И еще вопрос растолкуйте строчку 

VAR_mode_SHOW=VAR_mode_SHOW==1?2:1;

мне кажется в ней у меня проблема а в частности что означает 1?2:1  . Заранее всем спасибо!!!

замените на 

VAR_mode_SHOW = 3 - VAR_mode_SHOW;

и не парьтесь

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я бы сказал, что такую замену можно считать эквивалентной лишь в 0,78125% случаев. )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

Я бы сказал, что такую замену можно считать эквивалентной лишь в 0,78125% случаев. )

Странно. А у меня почему-то 0,78124% получается :(

Но в данном конкретном случае - она вполне себе потянет :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Боюсь, что данный конкретный случай может попасть как раз в те 0,00001%, на которые наши оценки различаются.

 

PS. А вообще, советую проверить свой калькулятор. На моем, например, 2/256 всегда получается ровно 0,0078125.