В этой записи мы сделаем простые часы на базе микроконтроллера Arduino. Разумеется, смотреть время через COM терминал, подключенный к МК или через моргалку на светодиодах — не есть удобно, поэтому был применен знакосинтезирующий дисплей из этой статьи.
Формат времени цифровой, также предусмотрена настройка часов с использованием двух кнопок: первая для приращения часов, а вторая — минут.Схема подключения:
Здесь я использовал дисплей разрешением 16×2 + несложная система регулировки контрастности, а также две кнопки.
Таблица компонентов к схеме:
Резистор | Сопротивление |
R1 | 32Ом |
R2 | 1кОм |
R3 | 10кОм |
R4 | 2кОм |
R5 | 100кОм |
С программной части то же ничего особого нет, все, что нам необходимо: драйвер дисплея LiquidCrystalRus и системный 16-бит таймер для самих часов. Однако, я бы рекомендовал использовать RTC микросхему для часов, что-нибудь из серии DS, подключаемые по I2C. Так как внутренний таймер МК не отличается высокой точностью.
Исходный код:
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 | #include <LiquidCrystalRus.h> boolean sets = false; unsigned long cur_millis , lastTick, setTick = 0; int sec, mins, hour = 0; LiquidCrystalRus lcd(12, 11, 10, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); pinMode(8, INPUT); pinMode(7, INPUT); sets = true; } void loop() { cur_millis = millis(); //time if (cur_millis - lastTick >= 1000) { lastTick = cur_millis; sec++; if (sec >= 60) { mins++; sec = 0; } if (mins >=60) { hour++; mins = 0; } if (hour >=24) { hour=0; mins = 0; } lcd.setCursor(0,0); lcd.print("Часики v1.0"); lcd.setCursor(1,1); if (hour < 10) {lcd.print("0");} lcd.print(hour); lcd.print(":"); if (mins < 10) {lcd.print("0");} lcd.print(mins); lcd.print(":"); if (sec < 10) {lcd.print("0");} lcd.print(sec); } check_sets(); } void check_sets() { if (sets) { if (cur_millis - setTick >= 300) { sets = false; setTick = 0; } } else { if (digitalRead(7)) { hour++; sec=0; sets = true; setTick = cur_millis; } if (digitalRead(8)) { mins++; sec=0; sets = true; setTick = cur_millis; } } } |
Самая важная часть программы работает в loop(), там происходит вычисление часов, минут и секунд. А в подпрограмме check_sets() просходит настройка часов.
Часики в работе:
Не знаю почему на схеме задействован 10 пин ардуино. Подключал по стандартной схеме, один из управляющих контактов на землю. Код не работал пока не убрал из строки инициализации лсд десятый пин=) За прогу спасибо, хотя часы лучше делать на ds1307)
Автору респект!!! Всё работает замечательно!!! Толко с кнопками запутался, потом сделал проще, так и не понял зачем на них плюс подавать!?! 😉
Всегда пожалуйста 😉 А насчет кнопок, это способ подключения такой:
А плюс — лог.единица, тк. ее и микроконтроллер и распознает, а чтобы не было шума, при отключении кнопки подается минус — логический ноль. Либо можно все сделать до и наоборот. 💡
А еще вроде можно через конденсатор подключить, чтоб шумов не было.
По идее — да, можно. Поставить конденсатор и резистор. Конденсатор будет заряжаться, а резистор будет разряжать его. Только тут со временем разрядки нужно будет по мудрить. Контроллер может неверно определить лог. единицу.