Делаем самостоятельно будильник на Arduino

Узнаем как реализовать на основе Arduino будильник с помощью модуля RTC DS3231.

В этой статье мы собираемся сделать Ардуино будильник, в котором мы будем использовать модуль RTC DS3231, чтобы получить текущее время и дату, а OLED покажет это время и дату.

Мы будем использовать библиотеку EEPROM для хранения времени будильника, которое мы будем вводить, используя модуль клавиатуры 4X4.

Когда новое введенное время будильника будет соответствовать текущему времени будильника, тогда зуммер начнет подавать звуковой сигнал, пока мы не удержим клавишу "C" на клавиатуре. Клавиша "#" будет использоваться для изменения пароля.

Шаг 1. Требуемые компоненты

Необходимыми компонентами для устройства будильника Arduino являются:

  • Arduino Uno
  • 128X32 Монохромный OLED дисплей
  • Модуль RTC DS3231
  • 4X4 клавиатура
  • 9В аккумулятор или батарея
  • Зуммер
  • Переключатель
  • Соединительные провода

Шаг 2. Схема соединения

Принципиальная схема устройства будильника Arduino достаточно большая. Прежде всего, подключите OLED к Arduino. Соединения для OLED с Arduino следующие:

  • CS-выход OLED на пин 10 Arduino
  • DC-вывод OLED на пин 9 Arduino
  • RST вывод OLED на вывод 8 Arduino
  • D1 или CLK вывод OLED на вывод 11 Arduino
  • D0 или DIN-штырь OLED на вывод 13 Arduino

Затем подключите модуль DS3231 к Arduino. Соединения следующие:

  • Подключите GND DS3231 к GND Arduino.
  • Подключите VCC DS3231 к 5V Arduino.
  • Подключите SDA DS3231 к A4 Arduino.
  • Подключите SCL DS3231 к A5 Arduino.

После этого подключите клавиатуру 4X4 к Arduino. Подключите первые 4 контакта клавиатуры, строка A0, A1, A2, A3 и последние четыре, которые относятся к контактам столбца к 6, 5, 4 и 3.

Подключите положительный контакт зуммера к контакту 7 Arduino и отрицательный сигнал зуммера к GND Arduino.

В конце, подключите положительный провод батареи к одному концу переключателя, а другой конец переключателя - к Vin Arduino.

Затем подключите отрицательный провод батареи к заземлению Arduino.

Шаг 3. Код для Ардуино бдильника

Сам код можно скачать или скопировать ниже. Дальше будет объяснение кода и ссылки на скачивание нужных библиотек.

#include <EEPROM.h>
#include <Keypad.h>
#include <DS3231.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

DS3231 rtc(SDA, SCL);

Time t;

#define buz 7
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
int Hor, Min, Sec, tim, dat, h, m, s;
int ASCII = 48;
char key = 0;
char buffer[2];
const byte numRows= 4;
const byte numCols= 4;
char keymap[numRows][numCols]=

{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

byte rowPins[numRows] = {A0, A1, A2, A3};
byte colPins[numCols]= {6, 5, 4, 3};
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {

Wire.begin();
rtc.begin();
pinMode(buz, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
welcome();

//uncomment these lines to set the date and time
//rtc.setDOW(SATURDAY); // Set Day-of-Week to SUNDAY
//rtc.setTime(10, 54, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDate(7, 1, 2017); // Day, Month, Year
}

void loop() {

t = rtc.getTime();
Hor = t.hour;
Min = t.min;
Sec = t.sec;
tim = rtc.getTimeStr();
dat = rtc.getDateStr();
char key = myKeypad.getKey();
if (key == 'C'){
digitalWrite(buz, LOW);
EEPROM.write(2, ASCII+6);
EEPROM.write(3, ASCII);
}

if(key == '#'){
display.clearDisplay();
display.setCursor(0,0);
display.print("Enter New Time");
display.setCursor(0,10);
display.display();
int j =0;
int i=0;
while( j<6)

{
if(i==2 || i == 5){
display.print(":");
display.display();
i++;
}

key=myKeypad.getKey();
if(key)
{
display.print(key);
display.display();
EEPROM.write(j,key);
j++;
i++;
}
}
}
changealarm();
checkalarm();
timedate();
}
void checkalarm(){
if( Hor == h && Min == m)
{
delay(200);
display.clearDisplay();
display.setCursor(0,10);
display.print("Hold C to stop Alarm");
display.display();
digitalWrite(buz, HIGH);
delay(200);
}
}

void changealarm(){

buffer[0]=EEPROM.read(0);
buffer[1]=EEPROM.read(1);
h = atoi(buffer);
buffer[0]=EEPROM.read(2);
buffer[1]=EEPROM.read(3);
m = atoi(buffer);
buffer[0]=EEPROM.read(4);
buffer[1]=EEPROM.read(5);
s = atoi(buffer);
}

void timedate(){

display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Time: ");
display.print(rtc.getTimeStr());
display.setCursor(0,10);
display.print("Date: ");
display.print(rtc.getDateStr());
display.setCursor(0,20);
display.print("Alarm: ");
display.print(h);
display.print(".");
display.print(m);
display.print(".");
display.print(s);
display.display();
}

void welcome(){

display.setCursor(0,0);
display.print(" Welcome ");
display.display();
display.setCursor(0,10);
display.print(" To ");
display.display();
display.setCursor(0,20);
display.print("ElectronicsHobbyists ");
display.display();
delay(5000);
}

Первым делом мы включили библиотеки для клавиатуры, DS3231 RTC и OLED. Библиотека EEPROM, которую мы включили, поможет нам сохранить время будильника. OLED работает с Arduino через связь SPI, поэтому мы включили библиотеку SPI. Аналогично, мы включили библиотеку «Wire» для DS3231, потому что DS3231 работает с Arduino через связь I2C, а библиотека «Wire» предназначена для связи I2C.

#include <EEPROM.h>
#include <Keypad.h>
#include <DS3231.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

В приведенной ниже части кода мы определили контакты для DS3231, зуммера и OLED. Затем мы инициализировали некоторые переменные, которые помогут нам хранить некоторые данные. После этого мы определили контакты для клавиатуры 4X4.

DS3231 rtc(SDA, SCL);
Time t;
#define buz 7
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
int Hor, Min, Sec, tim, dat, h, m, s;
int ASCII = 48;
char key = 0;
char buffer[2];
const byte numRows= 4;
const byte numCols= 4;
char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[numRows] = {A0, A1, A2, A3};
byte colPins[numCols]= {6, 5, 4, 3};
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

В функции настройки (setup) мы запустили связь «wire» и «rtc». Затем мы объявили пин зуммера в качестве выхода и назвали функцию «welcome», которая напечатает «Добро пожаловать» на OLED.

Wire.begin();
rtc.begin();
pinMode(buz, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
welcome();

В функции цикла (loop) мы получаем время и дату из модуля RTC DS3231 и сохраняем их в переменных. Затем мы ищем, нажата ли какая-либо клавиша или нет.

Если нажата клавиша «C», она выключит зуммер и изменит минуты на 60, что остановит будильник от включения на следующий день. Если нажата кнопка «#», она запросит новое время будильника.

t = rtc.getTime();
Hor = t.hour;
Min = t.min;
Sec = t.sec;
tim = rtc.getTimeStr();
dat = rtc.getDateStr();
char key = myKeypad.getKey();
if (key == 'C'){
digitalWrite(buz, LOW);
EEPROM.write(2, ASCII+6);
EEPROM.write(3, ASCII);
}
if(key == '#'){
display.clearDisplay();
display.setCursor(0,0);
display.print("Enter New Time");
display.setCursor(0,10);
display.display();
int j =0;
int i=0;
while( j<6)
{
if(i==2 || i == 5){
display.print(":");
display.display();
i++;
}
 
key=myKeypad.getKey();
if(key)
{
display.print(key);
display.display();
EEPROM.write(j,key);
j++;
i++;
}
}
}

В приведенной ниже функции будет сравниваться текущее время со временем будильника, и если время будет соответствовать, то зуммер начнет подавать звуковой сигнал.

void checkalarm(){
if( Hor == h && Min == m)
{
delay(200);
display.clearDisplay();
display.setCursor(0,10);
display.print("Hold C to stop Alarm");
display.display();
digitalWrite(buz, HIGH);
delay(200);
}
}

Следующая функция Ардуино будильника сохранит время сигнала, введенное вами в переменную, чтобы мы могли сравнить ее с текущим временем.

void changealarm(){
buffer[0]=EEPROM.read(0);
buffer[1]=EEPROM.read(1);
h = atoi(buffer);
buffer[0]=EEPROM.read(2);
buffer[1]=EEPROM.read(3);
m = atoi(buffer);
buffer[0]=EEPROM.read(4);
buffer[1]=EEPROM.read(5);
s = atoi(buffer);
}

Функция ниже отображает текущее время, текущую дату и время сигнала на OLED.

void timedate(){
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Time: ");
display.print(rtc.getTimeStr());
display.setCursor(0,10);
display.print("Date: ");
display.print(rtc.getDateStr());
display.setCursor(0,20);
display.print("Alarm: ");
display.print(h);
display.print(".");
display.print(m);
display.print(".");
display.print(s);
display.display();
}

Перед загрузкой кода загрузите библиотеки из приведенных ниже ссылок.

'#' Изменит время будильника. 'C' остановит будильник.

Итоговый результат

На видео ниже вы можете посмотреть итоговый результата этого проекта.

На этом пока всё. Желаем вам новых классных идей и устройств.

Ардуино+