Проект не претендует на звание нового велосипеда, но чтобы описание не кануло в лету буду делиться своими мыслями тут.
Сами часы ведь и после можно будет использовать в связке с другими проектами.
В общем в наличии у меня имеется:
Голубой OLED монитор 0.96" 128X64 с подключением i2c
Сами часы ведь и после можно будет использовать в связке с другими проектами.
В общем в наличии у меня имеется:
- Arduino UNO ATmega328P/CH340G
Выбирал с разъемом microUSB, т.к. постоянно к компьютеру подключен какой либо кабель с этим интерфейсом.
- Часы реального времени DS1302
Батарейку взял из старой материнской платы, где она играла ту же роль питания часов для неё.
Лучшим вариантом конечно были бы часы DS1307. Они и меньше по размеру значительно.
Например такие:
Весьма неплохой экран, в ярком свете весь текст отлично видно.
Их в последствии легче будет спрятать, но так как цена самих часов в среднем не выше 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