Будильник с термометром на Ардуино

Проект будильника с термометром на Ардуино с модулем tm1637 и датчиком температуры DHT11. Также на нашем сайте вы можете найти похожий проект часов и будильника на LCD 1602, Данный вариант проекта будильника реализован без модуля ds1302 часов реального времени RTC. Настройка текущего времени и время срабатывания звукового сигнала производится с помощью тактовых кнопок.

Для этого проекта потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль tm1637;
  • датчик температуры DHT11 / DHT22;
  • 3 тактовые кнопки;
  • пьезодинамик;
  • макетная плата;
  • провода «папа-мама», «папа-папа».

Ардуино будильник на tm1637 с термометром

Ардуино будильник на tm1637 с термометром
Ардуино будильник на дисплее tm1637 с термометром

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

При нажатии на вторую кнопку, когда программа находится вне режима настроек — включается/выключается будильник, с выводом текущего состояния будильника ON/OFF на четырехразрядный дисплей tm1637. При нажатии на третью кнопку на дисплее отображается температура воздуха. После сборки проекта будильника на Arduino Uno с температурой, загрузите следующую программу в микроконтроллер.

Скетч будильника с термометром на Arduino


#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;  // сколько секунд показывать температуру

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(10, INPUT_PULLUP);  // подключаем тактовые кнопки
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);  // подключаем пьезодинамик
  dht.begin();
  display.setBrightness(2);  // яркость дисплея от 0 до 7
  timer = millis();
}

void loop() {
  noTone(5);
  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(8);
  button2IsUp = digitalRead(9);
  button3IsUp = digitalRead(10);

  // если кнопка 1 нажата, заходим в настройки (while)
  if (button1WasUp && !button1IsUp) {
    delay(10); button1IsUp = digitalRead(8);
    if (!button1IsUp) { w = 1; }
  } button1WasUp = button1IsUp;

  // если кнопка 2 нажата, меняем состояние будильника
  if (button2WasUp && !button2IsUp) {
    delay(10); button2IsUp = digitalRead(9);
    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(10);
    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(5, HZ); delay(50);
    }

  display.showNumberDecEx(HOUR, 0b00000000, true, 2, 0);

  while (w == 1) {
    button1IsUp = digitalRead(8);
    button2IsUp = digitalRead(9);
    button3IsUp = digitalRead(10);

    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(8);
      if (!button1IsUp) { w = 2; }
    } button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(9);
      if (!button2IsUp) { HOUR++; if (HOUR > 23) HOUR = 0; }
    } button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10); button3IsUp = digitalRead(10);
      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(8);
    button2IsUp = digitalRead(9);
    button3IsUp = digitalRead(10);

    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(8);
      if (!button1IsUp) { w = 0; }
    } button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(9);
      if (!button2IsUp) { HOUR_A++; if (HOUR_A > 23) HOUR_A = 0; }
    } button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10); button3IsUp = digitalRead(10);
      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; }
    }
  }
 
}

Пояснения к коду:

  1. частота звукового сигнала и яркость дисплея устанавливаются в программе;
  2. переменная byte s = 2; отвечает за время индикации температуры в секундах.



Заключение. В данном варианте часов с будильником на tm1637 не используется модуль часов реального времени, поэтому при перезагрузке или отключении питания микроконтроллера Ардуино будут устанавливаться первоначальные значения времени, указанные в начале программе. Если у вас есть вопросы по работе программы или сборке схемы проекта — оставляйте их в комментариях к этой записи.



3 Replies to “Часы на TM1637 с термометром и будильником”

  1. Очень хотелось бы увидеть проэкт ,похожий на этот но с выводом на экран по i2c 2×16

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.