Перейти к содержанию

Часы-будильник на дисплее TM1637 Arduino

Часы будильник на Ардуино с дисплеем TM1637

Проект будильника с термометром на Arduino с модулем TM1637 и датчиком температуры DHT11 или DHT22. На нашем сайте вы также можете найти похожий проект термометра и будильника на LCD 1602. Этот проект будильника реализован без модуля часов реального времени ds1302. Кнопки используются для установки текущего времени и времени будильника. Частота звукового сигнала зуммера и яркость дисплея задаются в скетче.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • модуль дисплея TM1637
  • датчик температуры DHT11 / DHT22
  • тактовые кнопки и пьезодинамик
  • макетная плата
  • коннекторы
  • библиотека TM1637Display.h и DHT.h

Дополнительные материалы на эту тему:

  1. Термометр на TM1637 с датчиком DHT22
  2. Как подключить дисплей TM1637 к Ардуино
  3. Как подключить датчик DHT11 к Ардуино

Первая кнопка (подключена к пину 8) используется для входа в режим настройки текущего времени, второе нажатие на кнопку (пин 8) переводит часы в режим настройки будильника. Третье нажатие на первую кнопку сохраняет введенные данные и выводит устройство из режима настроек. В режиме настройки вторая кнопка (подключена к пину 9) меняет часы на будильнике, а третья кнопка (подключена к пину 10) меняет минуты будильника.

Часы на Arduino с будильником на дисплее TM1637

Часы на 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 читайте на нашем сайте.

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

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

newzaym
➜