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

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

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

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

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

  1. Роман:

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

  2. Alex:

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

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

  3. Алексей:

    А еще вроде можно через конденсатор подключить, чтоб шумов не было.

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

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

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