Часы на ардуино без модуля реального времени

Проект на Arduino: часы на основе 7-сегментных индикаторов без использования модуля реального времени.

Для сборки данного проекта нам понадобится:
1) Arduino (либо другие аналоги)
2) 4 семисегментных индикатора
3) 4 драйвера CD4026
4) Две кнопки
5) Два светодиода
6) И куча резисторов…

Собираем всё по схеме и заливаем на ардуино следующий скетч:
#define CLOCK_PIN 2
#define RESET_PIN 3
#define H_PIN 4
#define RESETH_PIN 5
#define LED_PIN 6
#define BM_PIN 8
#define BH_PIN 9
int s=0;
int m=0; // минуты
int h=0; // часы
int l=0;
void setup()
{
pinMode(RESET_PIN, OUTPUT); // PIN для обнуления минут
pinMode(CLOCK_PIN, OUTPUT); // PIN плюс одна минута
pinMode(H_PIN, OUTPUT); // PIN плюс один час
pinMode(RESETH_PIN, OUTPUT); // PIN для обнуления часов
pinMode(LED_PIN, OUTPUT); // PIN для светодиодов
pinMode(BM_PIN, INPUT); // PIN для кнопки установка минут
pinMode(BH_PIN, INPUT); // PIN для кнопки установка часов
digitalWrite(RESET_PIN, HIGH); // посылаем сигнал драйверу обнулить минуты
digitalWrite(RESET_PIN, LOW);
digitalWrite(RESETH_PIN, HIGH); // посылаем сигнал драйверу обнулить часы
digitalWrite(RESETH_PIN, LOW);
}
void loop()
{
// Установка часов
if (digitalRead(BM_PIN) == HIGH) { // если нажать кнопу BM:
m++; // плюс одна минута
digitalWrite(CLOCK_PIN, HIGH); // посылаем сигнал драйверу плюс один
digitalWrite(CLOCK_PIN, LOW);
if(m==60){m=0; // обнуляем минуты при достижении 60м
digitalWrite(RESET_PIN, HIGH); // посылаем сигнал драйверу обнулить минуты
digitalWrite(RESET_PIN, LOW);
}
}
if (digitalRead(BH_PIN) == HIGH) { // если нажать кнопу BH:
h++; // плюс один час
digitalWrite(H_PIN, HIGH); // посылаем сигнал драйверу плюс один
digitalWrite(H_PIN, LOW);
if(h==24){h=0; // обнуляем часы при достижении 24ч
digitalWrite(RESETH_PIN, HIGH); // посылаем сигнал драйверу обнулить часы
digitalWrite(RESETH_PIN, LOW);
}
}
// Установка часов конец
delay(100); // задержка 100 мс
l++;
if(l==8){analogWrite(LED_PIN, 10);} // включаем светодиод
if(l==10){analogWrite(LED_PIN, 0); l=0;} // выключаем...
s++; // плюс 100 миллисекунд
if(s==600){
s=0; // обнуляем секунды при достижении 60с
digitalWrite(CLOCK_PIN, HIGH); // посылаем сигнал драйверу плюс один
digitalWrite(CLOCK_PIN, LOW);
m++; // плюс одна минута
if(m==60){
digitalWrite(RESET_PIN, HIGH); // посылаем сигнал драйверу обнулить минуты
digitalWrite(RESET_PIN, LOW);
digitalWrite(H_PIN, HIGH); // посылаем сигнал драйверу плюс один
digitalWrite(H_PIN, LOW);
m=0; // обнуляем минуты при достижении 60м
h++; // плюс один час
}
if(h==24){
digitalWrite(RESETH_PIN, HIGH); // посылаем сигнал драйверу обнулить часы
digitalWrite(RESETH_PIN, LOW);
h=0; // обнуляем часы при достижении 24ч
}
}
}
Основа часов delay(100) – задержка на 100 миллисекунд. Почему именно на 100мс, а не на 1 секунду? Всё просто: чтобы сымитировать миганием светодиодов секунды. 200мс светодиод горит, 800мс – не горит.

P.S. Батарейка крона совершенно не подходит в качестве питания для таких часов – садится менее чем за сутки. Так что лучше использовать питание от сети.