Часы на u8glib. Прошу помощи

konog
Offline
Зарегистрирован: 17.12.2015

Всем привет. Делаю часы себе в машину. Сделал изменение времени и числа двумя кнопками, но как сделать вывод к примеру 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() );
  }
}

 

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

А Вы сначала стирайте старую надпись (перезаписывайте её цветом фона, например) а потом уж пишите новую.

konog
Offline
Зарегистрирован: 17.12.2015

ЕвгенийП пишет:

А Вы сначала стирайте старую надпись (перезаписывайте её цветом фона, например) а потом уж пишите новую.

Просто в данной библиотеке нету очистки экрана(

А можно пример если есть как это сделать?

okta
Offline
Зарегистрирован: 10.01.2015

первый раз рисовать со старым временем и установив цвет u8g.setColorIndex(0); а потом еще раз с новым временем, но сначала сказав u8g.setColorIndex(1);

Есть еще вариант сначала пробелом затирать те цифры, которые должны измениться, а потом уже отрисовывать новые.

konog
Offline
Зарегистрирован: 17.12.2015

okta пишет:

первый раз рисовать со старым временем и установив цвет u8g.setColorIndex(0); а потом еще раз с новым временем, но сначала сказав u8g.setColorIndex(1);

Есть еще вариант сначала пробелом затирать те цифры, которые должны измениться, а потом уже отрисовывать новые.

Пробую, но чето ничего не получаеться.

konog
Offline
Зарегистрирован: 17.12.2015

Вообщем я их поборол.

Подскажите как програмно убрать дребезг контактов кнопки?

Выкладую код может комуто пригодиться

#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);
}

 

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

konog пишет:

Подскажите как програмно убрать дребезг контактов кнопки?

Вот тут тема про это - http://arduino.ru/forum/programmirovanie/gde-posmotret-tsifrovoi-filtr-fnch-sketch-i-obyasneniya

konog
Offline
Зарегистрирован: 17.12.2015

Хотел еще узнать как сделать к примеру опрос кнопки и если она не нжималась к примеру 20 сек тогда перекинуть на другое условие. Я так понимаю что через milis , но ни когда с ним не работал и пока не имею представления как это реализовать?

facset
Offline
Зарегистрирован: 10.08.2016

может уже и не надо, но если хотите отслеживать нажатие кнопок по времени то надо избавляться от 

delay (100);

в кодинге, да и может помешать отследить в какой момент была нажата кнопка или отпущена,  и переходить на  millis()   или  micros(), да и delay () в коде часов только ухудшает их точность