Часы на u8glib. Прошу помощи
- Войдите на сайт для отправки комментариев
Ср, 21/12/2016 - 14:58
Всем привет. Делаю часы себе в машину. Сделал изменение времени и числа двумя кнопками, но как сделать вывод к примеру mm в левом нижнем углу если настройка стоит на минутах. Если раскоментирую в скетче для каждого case то все надписи накладываються друг на друга.
Заранее благодарен за подсказки и помощь
#include <U8glib.h> // OLED #include <Wire.h> // I2C //#include <Time.h> // Time Manipulation #include <DS1307RTC.h> // DS1307 RTC char timebuf[10]; // Time char datebuf[10]; // Date int year2; // 2 digit year #define KN_H A2 #define KN_M A3 byte modereg = 0; int programnumber = 1; U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI void draw(void) { u8g.setFont(u8g_font_fub35n); u8g.setPrintPos(0, 42); // set position u8g.print(timebuf); // display time u8g.setFont(u8g_font_fub14n); u8g.setPrintPos(22, 64); // set position u8g.print(datebuf); // display date /* if (programnumber = 1) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(1, 64); // set position u8g.print(" "); // display date u8g.print("Hour"); // display date } if (programnumber = 2) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(1, 64); // set position u8g.print(" "); // display date u8g.print("mm"); // display date }*/ } void setup(void) { pinMode(KN_H, INPUT); pinMode(KN_M, INPUT); digitalWrite(KN_H, HIGH); digitalWrite(KN_M, HIGH); } void loop(void) { tmElements_t tm; if (RTC.read(tm)) { year2 = tm.Year - 30; // 2 digit year variable sprintf(timebuf, "%02d:%02d", tm.Hour, tm.Minute); // format time sprintf(datebuf, "%02d/%02d/%02d", tm.Day, tm.Month, year2); // format date if (digitalRead(KN_H) == 0) //Если кнопка часов нажата { programnumber++; } if (programnumber > 5) { programnumber = 1; } switch (programnumber) { case 1: /////////////////////////////////////////Настройка Часов if (digitalRead(KN_M) == 0) { tm.Hour = tm.Hour + 1; if (tm.Hour >= 24) { tm.Hour = 0; } RTC.write(tm); break; case 2://///////////////////////////////////////Настройка Минут if (digitalRead(KN_M) == 0) { tm.Minute = tm.Minute + 1; if (tm.Minute >= 60) { tm.Minute = 0; } RTC.write(tm); } break; case 3://///////////////////////////////////////Настройка Числа if (digitalRead(KN_M) == 0) { tm.Day = tm.Day + 1; if (tm.Day > 31) { tm.Day = 1; } RTC.write(tm); } break; case 4://///////////////////////////////////////Настройка Месяца if (digitalRead(KN_M) == 0) { tm.Month = tm.Month + 1; if (tm.Month > 12) { tm.Month = 1; } RTC.write(tm); } break; case 5://///////////////////////////////////////Настройка Года if (digitalRead(KN_M) == 0) { tm.Year = tm.Year + 1; if (tm.Year > 90) { tm.Year = 45; } RTC.write(tm); } break; } } if (tm.Hour >= 20 || tm.Hour < 7) { u8g.setContrast(10); } else { u8g.setContrast(255); } u8g.firstPage(); // Put information on OLED do { draw(); } while ( u8g.nextPage() ); } }
А Вы сначала стирайте старую надпись (перезаписывайте её цветом фона, например) а потом уж пишите новую.
А Вы сначала стирайте старую надпись (перезаписывайте её цветом фона, например) а потом уж пишите новую.
Просто в данной библиотеке нету очистки экрана(
А можно пример если есть как это сделать?
первый раз рисовать со старым временем и установив цвет u8g.setColorIndex(0); а потом еще раз с новым временем, но сначала сказав u8g.setColorIndex(1);
Есть еще вариант сначала пробелом затирать те цифры, которые должны измениться, а потом уже отрисовывать новые.
первый раз рисовать со старым временем и установив цвет u8g.setColorIndex(0); а потом еще раз с новым временем, но сначала сказав u8g.setColorIndex(1);
Есть еще вариант сначала пробелом затирать те цифры, которые должны измениться, а потом уже отрисовывать новые.
Пробую, но чето ничего не получаеться.
Вообщем я их поборол.
Подскажите как програмно убрать дребезг контактов кнопки?
Выкладую код может комуто пригодиться
Подскажите как програмно убрать дребезг контактов кнопки?
Вот тут тема про это - http://arduino.ru/forum/programmirovanie/gde-posmotret-tsifrovoi-filtr-fnch-sketch-i-obyasneniya
Хотел еще узнать как сделать к примеру опрос кнопки и если она не нжималась к примеру 20 сек тогда перекинуть на другое условие. Я так понимаю что через milis , но ни когда с ним не работал и пока не имею представления как это реализовать?
может уже и не надо, но если хотите отслеживать нажатие кнопок по времени то надо избавляться от
в кодинге, да и может помешать отследить в какой момент была нажата кнопка или отпущена, и переходить на millis() или micros(), да и delay () в коде часов только ухудшает их точность