Электронный будильник

Проекты на Arduino Uno и Slot Shield

Если добавить к электронным часам всего один компонент — мерзкую пьезопищалку — проспать важную встречу или ранний подъём на работу точно не получится.

Проект основан на оригинальной Arduino Uno. За время отвечает модуль часов реального времени. Для управления гаджетом используется четырёхкнопочная клавиатура.

Что потребуется

Видеоинструкция

Как собрать

Установите Troyka Slot Shield на Arduino Uno

Вставьте Quad Display в разъёмы E и F. Пин CS подключу к 10 пину Arduino.

Установите четырёхкнопочную клавиатуру в слот C. Сигнал первой кнопки подключите к пину 0, второй к 1, третьей к 4 и четвёртой к 5.

Часы реального времени вставьте в пины I²C разъёма B. Вставьте батарейку CR1225 в держатель на лицевой панели модуля.

Подключите пьезопищалку к пину 7 слота A.

Скетч

Прошейте контроллер скетчем через Arduino IDE.

alarm-clock.ino
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay2.h>
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(10);
 
// библиотека для работы I²C
#include <Wire.h>
 
// библиотека для работы с часами реального времени
#include "TroykaRTC.h"
// создаём объект для работы с часами реального времени
RTC clock;
 
// библиотека для работы с кнопками
#include "TroykaButton.h"
 
// пины к которым подключены кнопки
#define BUTTON_PIN_1  0
#define BUTTON_PIN_2  1
#define BUTTON_PIN_3  4
#define BUTTON_PIN_4  5
 
// пин к которому подключена пищалка
#define BUZZER_PIN  7
 
// создаём объекты для работы с кнопкой
TroykaButton button1(BUTTON_PIN_1);
TroykaButton button2(BUTTON_PIN_2);
TroykaButton button3(BUTTON_PIN_3);
TroykaButton button4(BUTTON_PIN_4);
 
 
// создаем объект класса long для хранения счетчика для звука
unsigned long buzzerTime = millis();
 
// переменные для хранения времени будильника
int hoursAlarm = 0;
int minutesAlarm = 0;
 
//пременная для переключения между установкой часов и установкой будильника
boolean state = true;
 
void setup() {
   // инициализация дисплея
  qd.begin();
 
  // инициализация часов
  clock.begin();
  // метод установки времени и даты в модуль вручную
  // clock.set(10,25,45,20,05,2019,MONDAY);
  // метод установки времени и даты автоматически при компиляции
  clock.set(__TIMESTAMP__);
  // что бы время менялось при прошивке или сбросе питания
  // закомментируйте оба метода clock.set();
 
  // инициализация кнопок
  button1.begin();
  button2.begin();
  button3.begin();
  button4.begin();
  //инициализация выхода пищалки
  pinMode(BUZZER_PIN, OUTPUT);
}
 
void loop() {
  // запрашиваем данные с часов
  clock.read();
  // считываем показания часов и минут в переменные
  int hours = clock.getHour();
  int minutes = clock.getMinute();
 
  // считывание данных с кнопок
  button1.read();
  button2.read();
  button3.read();
  button4.read();
 
  // если кнопка «1» длительно зажата  
  if (button1.isHold()) {
    // меняем состояние будильника
    state = !state;
    // в зависимости от текущего состояние будильника
    if (!state) {
      qd.displayDigits(QD_A, QD_L, QD_NONE, QD_NONE);
      //clock.setHour(hours - 1);
    } else {
      qd.displayDigits(QD_t, QD_I, QD_NONE, QD_NONE);
      //hoursAlarm--;
    }
    // ждём пару секунд
    delay(2000);
  }
  // в зависимости от текущего режима работы будильника
  // «текущее время / время подъема»
  // если режим «текущее время»
  if (state) {
    // в зависимости от состояние кнопок
    // увеличиваем / уменьшаем часы и минуты
    if (button1.isClick()) {
      clock.setHour(hours + 1);
    } else if (button2.isClick()) {
      clock.setHour(hours - 1);
    } else if (button3.isClick()) {
      clock.setMinute(minutes - 1);
    } else if (button4.isClick()) {
      clock.setMinute(minutes + 1);
    }
 
    // запрашиваем данные с часов
    clock.read();
    // считываем показания часов и минут в переменные
    hours = clock.getHour();
    minutes = clock.getMinute();
    // выводим время на дисплей 
    qd.displayScore(hours, minutes, true);
 
    } else {
    // если режим «время подъема»
    // в зависимости от состояние кнопок
    // увеличиваем / уменьшаем часы и минуты
    if (button1.isClick()) {
      hoursAlarm++;
    } else if (button2.isClick()) {
      hoursAlarm--;
    } else if (button3.isClick()) {
      minutesAlarm--;
    } else if (button4.isClick()) {
      minutesAlarm++;
    }
    // запускаем защиту от перехода через 0
    parsingAlarmTime();
    // выводим время на дисплей
    qd.displayScore(hoursAlarm, minutesAlarm);
  }
  // пришло время подъема? 
  while (hours == hoursAlarm && minutes == minutesAlarm) {
    if (millis() - buzzerTime > 1000) {
      // запускаем звуковую функцию подъема
      tone(BUZZER_PIN, 500, 100);
      buzzerTime = millis();
    }
  break;
  }
}
 
// функция защиты от перехода через 0
void parsingAlarmTime() {
  if (hoursAlarm > 23) {
    hoursAlarm = 0;
  } else if (hoursAlarm < 0) {
    hoursAlarm = 23;
  }
 
  if (minutesAlarm > 59) {
    minutesAlarm = 0;
  } else if (minutesAlarm < 0) {
    minutesAlarm = 59;
  }
}

Часто задаваемые вопросы

Где скачать необходимые библиотеки и как их установить?
У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте?

У вас предыдущая версия модуля. Она снята с производства пару лет назад. С этим скетчем, библиотекой и схемой сборки модуль работать не будет.