Проект будильника с термометром на Arduino с модулем TM1637 и датчиком температуры DHT11 или DHT22. На нашем сайте вы также можете найти похожий проект термометра и будильника на LCD 1602. Этот проект будильника реализован без модуля часов реального времени ds1302. Кнопки используются для установки текущего времени и времени будильника. Частота звукового сигнала зуммера и яркость дисплея задаются в скетче.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- модуль дисплея TM1637
- датчик температуры DHT11 / DHT22
- тактовые кнопки и пьезодинамик
- макетная плата
- коннекторы
- библиотека TM1637Display.h и DHT.h
Дополнительные материалы на эту тему:
Первая кнопка (подключена к пину 8) используется для входа в режим настройки текущего времени, второе нажатие на кнопку (пин 8) переводит часы в режим настройки будильника. Третье нажатие на первую кнопку сохраняет введенные данные и выводит устройство из режима настроек. В режиме настройки вторая кнопка (подключена к пину 9) меняет часы на будильнике, а третья кнопка (подключена к пину 10) меняет минуты будильника.
Часы на Arduino с будильником на дисплее TM1637

Когда часы не находятся в режиме настройки, нажатие второй кнопки (подключена к пину 9) активирует или деактивирует будильник — текущий статус будильника отображается на четырехзначном дисплее tm1637. Нажатие третьей кнопки вне режима настройки (подключена к пину 10) отображает на температуру на индикаторе. После сборки проекта будильника на Arduino Uno, загрузите в микроконтроллер следующую программу.
Скетч для часов на дисплее TM1637 с будильником
#include "TM1637Display.h"
TM1637Display display(3, 2); // CLC, DIO
#include "DHT.h"
DHT dht(7, DHT11);
// текущее время на часах
byte HOUR = 13;
byte MIN = 21;
byte SEC = 0;
// время включения будильника
byte HOUR_A = 13;
byte MIN_A = 55;
#define HZ 100 // частота зуммера
byte s = 2; // секунды индикации температуры
#define BUZ 5 // пин подключения зуммера
#define B1 8 // пины подключения кнопок
#define B2 9
#define B3 10
boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button1IsUp;
boolean button2IsUp;
boolean button3IsUp;
boolean alarm = true;
unsigned long timer;
byte w, i;
const uint8_t C[] = {
SEG_B | SEG_A | SEG_F | SEG_G,
SEG_A | SEG_D | SEG_E | SEG_F };
const uint8_t ON[] = {
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
SEG_A | SEG_B | SEG_C | SEG_E | SEG_F };
const uint8_t OFF[] = {
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
SEG_A | SEG_G | SEG_E | SEG_F,
SEG_A | SEG_G | SEG_E | SEG_F };
void setup() {
pinMode(B1, INPUT_PULLUP);
pinMode(B2, INPUT_PULLUP);
pinMode(B3, INPUT_PULLUP);
pinMode(BUZ, OUTPUT);
dht.begin();
display.setBrightness(2); // яркость дисплея от 0 до 7
timer = millis();
}
void loop() {
noTone(BUZ);
int t = dht.readTemperature();
// функция отсчета времени
if (millis() - timer > 1000) {
timer = millis(); SEC++;
if (SEC > 59) { SEC = 0; MIN++; }
if (MIN > 59) { MIN = 0; HOUR++; }
if (HOUR > 23) { HOUR = 0; }
display.showNumberDecEx(MIN, 0b01000000, true, 2, 2);
}
button1IsUp = digitalRead(B1);
button2IsUp = digitalRead(B2);
button3IsUp = digitalRead(B3);
// если кнопка 1 нажата, заходим в настройки
if (button1WasUp && !button1IsUp) {
delay(10); button1IsUp = digitalRead(B1);
if (!button1IsUp) { w = 1; }
} button1WasUp = button1IsUp;
// если кнопка 2 нажата, меняем состояние будильника
if (button2WasUp && !button2IsUp) {
delay(10); button2IsUp = digitalRead(B2);
if (!button2IsUp) {
alarm = !alarm; i = 0; display.clear();
if (alarm == true) { display.setSegments(ON, 2, 2); }
if (alarm == false) { display.setSegments(OFF, 3, 1); }
while (i < s) {
if (millis() - timer > 1000) {
timer = millis(); SEC++; i++;
}
}
}
} button2WasUp = button2IsUp;
// если кнопка 3 нажата, выводим температуру
if (button3WasUp && !button3IsUp) {
delay(10); button3IsUp = digitalRead(B3);
if (!button3IsUp) {
i = 0; display.clear();
while (i < s) {
if (millis() - timer > 1000) {
timer = millis(); SEC++; i++;
}
display.showNumberDecEx(t, 0b00000000, false, 2, 0);
display.setSegments(C, 2, 2);
}
}
} button3WasUp = button3IsUp;
if (alarm == true && HOUR == HOUR_A && MIN >= MIN_A) {
tone(BUZ, HZ); delay(50);
}
display.showNumberDecEx(HOUR, 0b00000000, true, 2, 0);
// РЕЖИМ НАСТРОЙКИ ЧАСОВ //
while (w == 1) {
button1IsUp = digitalRead(B1);
button2IsUp = digitalRead(B2);
button3IsUp = digitalRead(B3);
if (button1WasUp && !button1IsUp) {
delay(10); button1IsUp = digitalRead(B1);
if (!button1IsUp) { w = 2; }
} button1WasUp = button1IsUp;
if (button2WasUp && !button2IsUp) {
delay(10); button2IsUp = digitalRead(B2);
if (!button2IsUp) { HOUR++; if (HOUR > 23) HOUR = 0; }
} button2WasUp = button2IsUp;
if (button3WasUp && !button3IsUp) {
delay(10); button3IsUp = digitalRead(B3);
if (!button3IsUp) { MIN++; if (MIN > 59) MIN = 0; }
} button3WasUp = button3IsUp;
display.showNumberDecEx(HOUR, 0b01000000, true, 2, 0);
display.showNumberDecEx(MIN, 0b01000000, true, 2, 2);
if (millis() - timer > 1000) {
timer = millis(); SEC++;
if (SEC > 59) { SEC = 0; MIN++; }
if (MIN > 59) { MIN = 0; HOUR++; }
if (HOUR > 23) { HOUR = 0; }
}
}
// РЕЖИМ НАСТРОЙКИ БУДИЛЬНИКА //
while (w == 2) {
button1IsUp = digitalRead(B1);
button2IsUp = digitalRead(B2);
button3IsUp = digitalRead(B3);
if (button1WasUp && !button1IsUp) {
delay(10); button1IsUp = digitalRead(B1);
if (!button1IsUp) { w = 0; }
} button1WasUp = button1IsUp;
if (button2WasUp && !button2IsUp) {
delay(10); button2IsUp = digitalRead(B2);
if (!button2IsUp) { HOUR_A++; if (HOUR_A > 23) HOUR_A = 0; }
} button2WasUp = button2IsUp;
if (button3WasUp && !button3IsUp) {
delay(10); button3IsUp = digitalRead(B3);
if (!button3IsUp) { MIN_A++; if (MIN_A > 59) MIN_A = 0; }
} button3WasUp = button3IsUp;
display.showNumberDecEx(HOUR_A, 0b00000000, true, 2, 0);
display.showNumberDecEx(MIN_A, 0b00000000, true, 2, 2);
if (millis() - timer > 1000) {
timer = millis(); SEC++;
if (SEC > 59) { SEC = 0; MIN++;}
if (MIN > 59) { MIN = 0; HOUR++; }
if (HOUR > 23) { HOUR = 0; }
}
}
}
Заключение. В данной версии будильника Arduino tm1637 не используется модуль часов реального времени. Поэтому при перезагрузке или выключении микроконтроллера Arduino — все настройки сбрасываются на начальные значения, указанные в скетче. Если у вас есть вопросы по работе устройства или по сборке схемы — оставляйте их в комментариях к этому посту. Подробнее о модуле tm1637 и датчике DHT22 читайте на нашем сайте.
