Помните эти часы? Встречайте вторую их версию. 🙂 Вместо символьного lcd, я использовал графичеслий lcd дисплей. Про его подключение можно почитать здесь. Кроме того, часы показавают еще и дату (день, месяц, год). Кнопок по прежнему две.
Схема:
Ну а дисплей — само собой. Разрисовывать это тут не ахти.
Настройка времени довольно проста: S1 выбирает то, что будем настраивать, а S2 отвечает за «приращение» значений.
Вот собственно программная часть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | /*************************************************/ #define S1 2 #define S2 3 /*************************************************/ #include <glcd.h> #include "fonts/fixednums7x15.h" #include "fonts/systemfont5x7.h" #include <Time.h> #include <Bounce.h> Bounce button_1 = Bounce(S1,50); Bounce button_2 = Bounce(S2,50); boolean set = false; int s_hour, s_minute, s_second = 0; int s_day, s_month = 0, s_year=2000; char im=0; char chik=0; void setup() { GLCD.Init(); GLCD.ClearScreen(); setTime(0,0,0,1,1,2000); pinMode(S2, INPUT); pinMode(S1, INPUT); } void loop() { if (!set) { if (button_1.update()) { if (button_1.read()==1) { set = true; GLCD.ClearScreen(); } } GLCD.CursorToXY(32, 20); GLCD.SelectFont(fixednums7x15); if (hour()<10) { GLCD.print("0"); } GLCD.print(hour()); GLCD.print(":"); if (minute()<10) { GLCD.print("0"); } GLCD.print(minute()); GLCD.print(":"); if (second()<10) { GLCD.print("0"); } GLCD.print(second()); GLCD.CursorToXY(33, 40); GLCD.SelectFont(System5x7); GLCD.print(day()); GLCD.print("/"); GLCD.print(monthShortStr(month())); GLCD.print("/"); GLCD.print(year()); delay(100); } else { check_sets(); } } void check_sets() { if (button_1.update()) { if (button_1.read()==1) { chik=chik++; im=0; } } if (button_2.update()) { if (button_2.read()==1) { im=im++; } } //Извините за говнокод... :-) GLCD.CursorToXY(40, 0); GLCD.print("SET MODE"); GLCD.CursorToXY(32, 20); GLCD.SelectFont(fixednums7x15); if (chik==0) {GLCD.SelectFont(fixednums7x15, WHITE);} if (s_hour<10) {GLCD.print("0");} GLCD.print(s_hour); if (chik==0) {GLCD.SelectFont(fixednums7x15, BLACK);} GLCD.print(":"); if (chik==1) {GLCD.SelectFont(fixednums7x15, WHITE);} if (s_minute<10) {GLCD.print("0");} GLCD.print(s_minute); if (chik==1) {GLCD.SelectFont(fixednums7x15, BLACK);} GLCD.print(":"); if (chik==2) {GLCD.SelectFont(fixednums7x15, WHITE);} if (s_second<10) {GLCD.print("0");} GLCD.print(s_second); GLCD.CursorToXY(33, 40); GLCD.SelectFont(System5x7); if (chik==3) {GLCD.SelectFont(System5x7, WHITE);} GLCD.print(s_day); if (chik==3) {GLCD.SelectFont(System5x7, BLACK);} GLCD.print("/"); if (chik==4) {GLCD.SelectFont(System5x7, WHITE);} GLCD.print(monthShortStr(s_month)); if (chik==4) {GLCD.SelectFont(System5x7, BLACK);} GLCD.print("/"); if (chik==5) {GLCD.SelectFont(System5x7, WHITE);} GLCD.print(s_year); if (chik==5) {GLCD.SelectFont(System5x7, BLACK);} switch (chik) { case 0: if (im>23) {im=0;} s_hour=im; break; case 1: if (im>60) {im=0;} s_minute=im; break; case 2: if (im>60) {im=0;} s_second=im; break; case 3: if (im>31) {im=0;} s_day=im; break; case 4: if (im>12) {im=1;} s_month=im; break; case 5: s_year=im+2000; break; case 6: set=false; chik=0; im=0; GLCD.ClearScreen(); setTime(s_hour,s_minute,s_second,s_day,s_month,s_year); break; } } |
Библиотеки я использовал: GLCD v3 — для управления дисплеем; Time — подсчет времени и даты; Bounce — для устранения дребезга контактов кнопок. Сами часы тикают от внутреннего таймера МК, но я советую использовать внешнюю микросхему RTC.
Часы в работе:
Класно!) автор молодчик) Хотел реализовать, но с дисплеем беда. у него отображение начинается середины экрана. Иначе говоря нулевая координата по Y сдвинута на полэкрана (32 пикселя), по иксам нормально. Верхняя половина при этом полностью залита. Не подскажите в чем может быть причина?
Какой у вас дисплей? (модель, разрешение, контроллер дисплея)
WG12864A. Контроллер KS0108
Забыл сказать, что проблема вылезла на стадии тестирования. То есть банальные скетчи «хелоу ворлд» тоже отображаются ТАК криво, как я описал выше
Честно говоря, я не знаю в чем проблема. Попробуй другую библиотеку. (ks0108)
Пробовал. Та же беда. Может случится так, что при распайки один из выходов умер? Паял 30ватным паяльником
Вряд ли. У меня была проблема: правый угол экрана был полностью заполнен и помехи по всему экрану. Оказалось — дребезг контактов.
Спасибо, буду проверять.
Большое спасибо за часы.
Малость переделал скетч под простой lcd 20×2.
И добавил индикацию дня недели и автокалендарь .
Правда не соображу как сделать подсветку при уставновке времени.
Вы не знаете как управлять подсветкой?
по подсветкой имелось ввиду выделение символа который будет меняться , мигание или закрашивание черным .
пока сделал просто текст указывающий что происходит установка часов минут или месяца .
Мм-да. В моей прошивке я изменял отображение шрифта, так как они хранились в самом микроконтроллере. А символьный дисплей хранит сам в себе шрифты, поэтому так не получится(. Возможно есть такая функция, которая сделает инверсию отображения шрифта на дисплее.