пятница, 9 декабря 2016 г.

Arduino UNO + DS1302 + OLED. Часы с отображением даты на русском языке

Проект не претендует на звание нового велосипеда, но чтобы описание не кануло в лету буду делиться своими мыслями тут.
  Сами часы ведь и после можно будет использовать в связке с другими проектами.

В общем в наличии у меня имеется:

  • Arduino UNO  ATmega328P/CH340G 
Выбирал с разъемом microUSB, т.к. постоянно к компьютеру подключен какой либо кабель с этим интерфейсом.


  • Часы реального времени DS1302
Батарейку взял из старой материнской платы, где она играла ту же роль питания часов для неё.
Лучшим вариантом конечно были бы часы DS1307. Они и меньше по размеру значительно.

Например такие: 









  • Голубой OLED монитор 0.96" 128X64 с подключением i2c




    Весьма неплохой экран, в ярком свете весь текст отлично видно.

    Их в последствии легче будет спрятать, но так как цена самих часов в среднем не выше 60 руб. то я не сильно расстроился.



    К сожалению на текущий момент испытываю острый дефицит с хорошими контактными проводами, по этому приходится в разъемы макетной платы подключать просто голые провода, а к самим контактам часов подпаиваться.

    Библиотека с русским шрифтом: ссылка
    Библиотека для часов: ссылка (с удобным описанием)

    Скетч:
    #include <DS1302.h>
    #include <OLED_I2C.h>

    OLED  lcd(SDA, SCL, 2); //подключение к SDA SCL и 2й пин как кнопка RESET для монитора
    DS1302 RTC(8,7,13); //подключение RST=D8, DAT=D7, CLK=D13
    //объявляем шрифты
    extern uint8_t RusFont[];
    extern uint8_t BigNumbers[];

    char dat;
    Time t;

    void setup() {
      lcd.begin();
      Serial.begin(9600);
      RTC.halt(false);
      RTC.writeProtect(false);   
    }

    //устанавливаем наименование каждому дню
    String dowToDay(int day){
      String nameday;
      switch (day){
        case 1: {nameday = "Gjytltkmybr"; //понедельник
          break;}
        case 2:{nameday = "Dnjhybr"; //вторник
          break;}
        case 3:{nameday = "Chtlf"; //среда
          break;}
        case 4:{nameday = "Xtndthu"; //четверг
          break;}
        case 5:{nameday = "Gznybwf"; //пятница
          break;}
        case 6:{nameday = "Ce,,jnf"; //суббота
          break;}
        case 7:{nameday = "Djcrhtctymt"; //воскресенье
          break;}
                 }
      return nameday;
    }

    void loop() {
      
          t = RTC.getTime();  //Запрос времени
          
          String h = String(t.hour, DEC); //Библиотека понимает только формат String приходится в него переводить
          String m = String(t.min, DEC);
          String s = String(t.sec, DEC);
          String day = dowToDay(t.dow);
          
     //Рисуем впереди ноль для заполнения пустоты    
          if (t.hour<10) h = "0" + h; 
          if (t.min<10) m = "0" + m;
          if (t.sec<10) s = "0" + s;
          
    //чистим экран и устанавливаем цифровой шрифт       
          lcd.clrScr();   
          lcd.setFont(BigNumbers);
          
    //Выводим на экран часы минуты секунды     
          lcd.print(h,10,10); 
          lcd.print(m,46,10);
          lcd.print(s,80,10);
          
    //меняем шрифт на русский и печатаем день недели
          lcd.setFont(RusFont);
          lcd.print(day,0,50);
          
    //рисуются точки (:) между час и минута        
          lcd.drawLine(42,15,42,17); 
          lcd.drawLine(43,15,43,17);
          lcd.drawLine(42,27,42,29);
          lcd.drawLine(43,27,43,29);
          
    //рисуются точки (:) между минута и секунда
          lcd.drawLine(76,15,76,17);  
          lcd.drawLine(77,15,77,17);
          lcd.drawLine(76,27,76,29);
          lcd.drawLine(77,27,77,29);
          
    //Для отладки выдаем в COM порт информацию      
           Serial.print(t.hour, DEC);
           Serial.print(" : ");
           Serial.print(t.min, DEC);
           Serial.print(" : ");
           Serial.print(t.sec, DEC);
           Serial.print(" День: ");
           Serial.println(day);
         
           lcd.update(); 
           delay(450);  //Оптимальная задержка для корректного отражения времени
    }

    Изображения взяты с ресурсов:
    aliexpress.com
    iarduino.ru