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

В этой записи мы сделаем простые часы на базе микроконтроллера 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() просходит настройка часов.

Часики в работе:

Файлы проекта

About admin

Прохожий

6 Comments

  1. Не знаю почему на схеме задействован 10 пин ардуино. Подключал по стандартной схеме, один из управляющих контактов на землю. Код не работал пока не убрал из строки инициализации лсд десятый пин=) За прогу спасибо, хотя часы лучше делать на ds1307)

  2. Автору респект!!! Всё работает замечательно!!! Толко с кнопками запутался, потом сделал проще, так и не понял зачем на них плюс подавать!?! 😉

    1. Всегда пожалуйста 😉 А насчет кнопок, это способ подключения такой: А плюс — лог.единица, тк. ее и микроконтроллер и распознает, а чтобы не было шума, при отключении кнопки подается минус — логический ноль. Либо можно все сделать до и наоборот. 💡

    1. По идее — да, можно. Поставить конденсатор и резистор. Конденсатор будет заряжаться, а резистор будет разряжать его. Только тут со временем разрядки нужно будет по мудрить. Контроллер может неверно определить лог. единицу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *