Управление настройками энкодером.
- Войдите на сайт для отправки комментариев
Всем доброго времени суток!!!
Обращаюсь к вам за помощю с такой проблеммой, есть скетч (его выложу ниже) он был найден на просторах интернета и был для 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 . Заранее всем спасибо!!!
И еще вопрос растолкуйте строчку
мне кажется в ней у меня проблема а в частности что означает 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 скобки для наглядности
И еще вопрос растолкуйте строчку
мне кажется в ней у меня проблема а в частности что означает 1?2:1 . Заранее всем спасибо!!!
...хм, что у этих людей в голове? - вместо того, что бы парить мозги автору скетча, пристают к незнакомым людям.
алё! ищи автора скетча.
И еще вопрос растолкуйте строчку
мне кажется в ней у меня проблема а в частности что означает 1?2:1 . Заранее всем спасибо!!!
замените на
и не парьтесь
Я бы сказал, что такую замену можно считать эквивалентной лишь в 0,78125% случаев. )
Я бы сказал, что такую замену можно считать эквивалентной лишь в 0,78125% случаев. )
Странно. А у меня почему-то 0,78124% получается :(
Но в данном конкретном случае - она вполне себе потянет :)
Боюсь, что данный конкретный случай может попасть как раз в те 0,00001%, на которые наши оценки различаются.
PS. А вообще, советую проверить свой калькулятор. На моем, например, 2/256 всегда получается ровно 0,0078125.