Часы на 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);
Есть еще вариант сначала пробелом затирать те цифры, которые должны измениться, а потом уже отрисовывать новые.
Пробую, но чето ничего не получаеться.
Вообщем я их поборол.
Подскажите как програмно убрать дребезг контактов кнопки?
Выкладую код может комуто пригодиться
#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; static uint8_t subarulogo_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x01, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF0, 0x80, 0x01, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x7C, 0x80, 0x01, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1E, 0x80, 0x03, 0x00, 0x00, 0x78, 0x00, 0x00, 0x07, 0xC0, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x80, 0x03, 0xC0, 0x07, 0x00, 0x40, 0xC0, 0x01, 0xC0, 0x01, 0xF0, 0x1F, 0x00, 0xC0, 0x80, 0x01, 0xE0, 0xF0, 0xFF, 0xFF, 0x1F, 0xF8, 0x81, 0x03, 0xE0, 0xFE, 0xFF, 0xFF, 0x7F, 0xFE, 0x1F, 0x03, 0x70, 0xC0, 0xFF, 0xFF, 0x0F, 0xE0, 0x00, 0x07, 0x70, 0x00, 0xF0, 0x0F, 0x80, 0xC0, 0x00, 0x06, 0x70, 0x00, 0xC0, 0x07, 0xC0, 0xC0, 0x06, 0x06, 0x70, 0x00, 0xC0, 0x03, 0xE0, 0x01, 0x06, 0x06, 0x70, 0x00, 0x80, 0x03, 0xFE, 0xDF, 0x7F, 0x06, 0x70, 0x00, 0x80, 0x03, 0xF0, 0x03, 0x1F, 0x07, 0xE0, 0x00, 0x80, 0x81, 0xC0, 0x00, 0x06, 0x03, 0xC0, 0x01, 0x80, 0x81, 0x80, 0x04, 0x86, 0x03, 0xC0, 0x01, 0x00, 0xC1, 0x00, 0x0C, 0xC0, 0x01, 0x80, 0x03, 0x00, 0xF8, 0x8F, 0xFF, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0xFE, 0xDF, 0x7F, 0x70, 0x00, 0x00, 0x3E, 0x00, 0xC0, 0x01, 0x0C, 0x3C, 0x00, 0x00, 0x78, 0x00, 0xC0, 0x00, 0x04, 0x0F, 0x00, 0x00, 0xE0, 0x03, 0x80, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_FAST); // Dev 0, Fast I2C / TWI void logo(void) { u8g.drawXBM(32, 10, 64, 32, subarulogo_bits); } void draw(void) { u8g.setColorIndex(1); u8g.setFont(u8g_font_fub35n); u8g.setPrintPos(0, 42); u8g.print(timebuf); u8g.setFont(u8g_font_fub14n); u8g.setPrintPos(22, 64); u8g.print(datebuf); if (programnumber == 1) { } if (programnumber == 2) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(0, 60); u8g.setColorIndex(1); u8g.print("HH"); } if (programnumber == 3) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(0, 60); u8g.setColorIndex(1); u8g.print("Min"); } if (programnumber == 4) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(0, 60); u8g.setColorIndex(1); u8g.print("Day"); } if (programnumber == 5) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(0, 60); u8g.setColorIndex(1); u8g.print("MM"); } if (programnumber == 6) { u8g.setFont(u8g_font_6x12); u8g.setPrintPos(0, 60); u8g.setColorIndex(1); u8g.print("YY"); } } void setup(void) { u8g.firstPage(); do { logo(); u8g.setFont(u8g_font_helvB08); u8g.drawStr( 12, 9, "Confidence in Motion"); u8g.setFont(u8g_font_fub20); u8g.drawStr( 7, 64, "SUBARU"); } while ( u8g.nextPage() ); delay(5000); 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 цифры года sprintf(timebuf, "%02d:%02d", tm.Hour, tm.Minute); // Формат времени sprintf(datebuf, "%02d/%02d/%02d", tm.Day, tm.Month, year2); // Формат часов if (digitalRead(KN_H) == 0) //Если кнопка часов нажата { programnumber++; } if (programnumber > 6) { programnumber = 1; } switch (programnumber)//////////////////////////// Переключение режимов настройки часов { case 1://///////////////////////////////////////Обычный рабочий режим часов if (digitalRead(KN_M) == 0) { } break; case 2: /////////////////////////////////////////Настройка Часов if (digitalRead(KN_M) == 0) { tm.Hour = tm.Hour + 1; if (tm.Hour >= 24) { tm.Hour = 0; } RTC.write(tm); } break; case 3://///////////////////////////////////////Настройка Минут if (digitalRead(KN_M) == 0) { tm.Minute = tm.Minute + 1; if (tm.Minute >= 60) { tm.Minute = 0; } RTC.write(tm); } break; case 4://///////////////////////////////////////Настройка Числа if (digitalRead(KN_M) == 0) { tm.Day = tm.Day + 1; if (tm.Day > 31) { tm.Day = 1; } RTC.write(tm); } break; case 5://///////////////////////////////////////Настройка Месяца if (digitalRead(KN_M) == 0) { tm.Month = tm.Month + 1; if (tm.Month > 12) { tm.Month = 1; } RTC.write(tm); } break; case 6://///////////////////////////////////////Настройка Года 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(); // Вывод изображения на OLED do { draw(); } while ( u8g.nextPage() ); delay (100); }Подскажите как програмно убрать дребезг контактов кнопки?
Вот тут тема про это - http://arduino.ru/forum/programmirovanie/gde-posmotret-tsifrovoi-filtr-fnch-sketch-i-obyasneniya
Хотел еще узнать как сделать к примеру опрос кнопки и если она не нжималась к примеру 20 сек тогда перекинуть на другое условие. Я так понимаю что через milis , но ни когда с ним не работал и пока не имею представления как это реализовать?
может уже и не надо, но если хотите отслеживать нажатие кнопок по времени то надо избавляться от
в кодинге, да и может помешать отследить в какой момент была нажата кнопка или отпущена, и переходить на millis() или micros(), да и delay () в коде часов только ухудшает их точность