Часы на микроконтроллере №2

Помните эти часы? Встречайте вторую их версию. 🙂 Вместо символьного 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.

Часы в работе:

Файлы проекта (+библиотеки)

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

12 комментариев к “Часы на микроконтроллере №2”

  1. Роман:

    Класно!) автор молодчик) Хотел реализовать, но с дисплеем беда. у него отображение начинается середины экрана. Иначе говоря нулевая координата по Y сдвинута на полэкрана (32 пикселя), по иксам нормально. Верхняя половина при этом полностью залита. Не подскажите в чем может быть причина?

  2. Роман:

    WG12864A. Контроллер KS0108

  3. Роман:

    Забыл сказать, что проблема вылезла на стадии тестирования. То есть банальные скетчи «хелоу ворлд» тоже отображаются ТАК криво, как я описал выше

  4. Роман:

    Пробовал. Та же беда. Может случится так, что при распайки один из выходов умер? Паял 30ватным паяльником

    • Вряд ли. У меня была проблема: правый угол экрана был полностью заполнен и помехи по всему экрану. Оказалось — дребезг контактов.

  5. Роман:

    Спасибо, буду проверять.

  6. Mitos:

    Большое спасибо за часы.
    Малость переделал скетч под простой lcd 20×2.
    И добавил индикацию дня недели и автокалендарь .
    Правда не соображу как сделать подсветку при уставновке времени.

    • Вы не знаете как управлять подсветкой?

      • Mitos:

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

        • Мм-да. В моей прошивке я изменял отображение шрифта, так как они хранились в самом микроконтроллере. А символьный дисплей хранит сам в себе шрифты, поэтому так не получится(. Возможно есть такая функция, которая сделает инверсию отображения шрифта на дисплее.

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bug Report
Локализовано: шаблоны Wordpress