| Ваш IP: 18.212.92.235 | Online(13) - гости: 7, боты: 6 | Загрузка сервера: 1.15 ::::::::::::

Часы (DS3231) с будильником (Arduino)

Часы с будильником состоят из платы Arduino Nano (Uno), LCD индикатора 1602 и модуля часов реального времени DS3231 (ZS-042). Помимо текущего времени на экране индикатора отображается дата, день недели, месяц, год и температура. Будильник в часах один, он позволяет выставить время срабатывания в минутах и часах, так же предусмотрено его отключение, а так же работа каждый день, в будние дни и по выходным. Установка времени срабатывания будильника осуществляется кнопками «К», «+» и «-«. Сигнал будильника звучит в течении одной минуты, но если нажать на одну из кнопок «+» или «-«. сигнал будильника можно прервать. Время срабатывания будильника и режим его работы сохраняются в энергонезависимой памяти.

Устанавливать время на часах не нужно, так как предусмотрена коррекция времени при прошивке микроконтроллера. Для этого необходимо раскомментировать строчку:

// clock.setDateTime(__DATE__, __TIME__);

Далее залейте скетч в плату, закомментируйте строчку и залейте скетч повторно.

#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
DS3231 clock;RTCDateTime DateTime;
#include <LiquidCrystal.h>  
#include <EEPROM.h> //#include <EEPROMex.h> 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
int k,m,h,i,w,reg,ton;
byte rom0,rom1,rom2;
unsigned long eeprom;
 
void setup(){Serial.begin(9600);
   lcd.begin(16,2);// LCD 16X2 
   Wire.begin(); clock.begin();
   pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);
 //  clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  rom0 = EEPROM.read(0);if(rom0>59){EEPROM.update(0,0);}
  rom1 = EEPROM.read(1);if(rom1>23){EEPROM.update(1,0);}
  rom2 = EEPROM.read(2);if(rom2>3){EEPROM.update(2,0);}
  m=rom0;h=rom1;w=rom2;
}
 
void loop(){i++;if(i>4){i=0;}
 if(digitalRead(2)==HIGH){k++;reg=1;delay(300);}if(k>3){k=0;reg=0;}
 
 if(reg==1) {
 if(k==1){
 if(digitalRead(3)==HIGH){m++;}if(m>59){m=59;}
 if(digitalRead(4)==HIGH){m--;}if(m<0){m=0;}}
 if(k==2){
 if(digitalRead(3)==HIGH){h++;}if(h>23){h=23;}
 if(digitalRead(4)==HIGH){h--;}if(h<0){h=0;}}
 if(k==3){
 if(digitalRead(3)==HIGH){w++;delay(300);}if(w>3){w=0;}
 if(digitalRead(4)==HIGH){w--;delay(300);}if(w<0){w=3;}
 } 
 lcd.setCursor(0,0);lcd.print("Alarm ");
 if(i==1&&k==2){lcd.print("  ");}else{if(h < 10 ){lcd.print("0");}lcd.print(h);} lcd.print(":");
 if(i==1&&k==1){lcd.print("  ");}else{if(m < 10 ){lcd.print("0");}lcd.print(m);} 
 lcd.setCursor(0,1);
 if(i==1&&k==3){lcd.print("                 ");}
 if(w==0){lcd.print("every day");}  //каждый день 1234567
 if(w==1){lcd.print("on weekdays");}//по будням 12345
 if(w==2){lcd.print("on weekends");}//по выходным 67
 if(w==3){lcd.print("off");}
 rom0=m;rom1=h;rom2=w;
 eeprom=0;
 }
 
 if(reg==0){if(eeprom==1){EEPROM.update(0,rom0);EEPROM.update(1,rom1);EEPROM.update(2,rom2);}
 DateTime=clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
 lcd.setCursor(0,0);
 lcd.print(clock.dateFormat("H:i:s ",DateTime));// выводим часы, минуты и секунды
 lcd.print(clock.readTemperature(),1);lcd.print((char)223);lcd.print("C");// выводим значение температуры
 lcd.setCursor(0,1);lcd.print(clock.dateFormat("D d M Y", DateTime));// выводим день недели, дату, месяц и год
 }
if(digitalRead(3)==HIGH||digitalRead(4)==HIGH){ton=1;}
if(DateTime.hour*60+DateTime.minute!=h*60+m){ton=0;}
 
 if(w==0){pic();}
 if(w==1&&(DateTime.dayOfWeek<6)){pic();}
 if(w==2&&(DateTime.dayOfWeek>5)){pic();}
 
 eeprom++;
 delay(200);
 lcd.clear();
 
}
 
void pic(){if(ton==0&&(DateTime.hour*60+DateTime.minute==h*60+m)){tone(5,1200,500);delay(500);}}

Второй вариант часов с будильником выполнен с использованием четырех разрядного семисегментного индикатора на базе драйвера TM1637 (модуль TM1637).

При нажимании кнопки «К» происходит перебор элементов меню, вывод секунд, даты и месяца, температуры, установка времени будильника, включение или отключение будильника, яркость индикатора.

#include <Wire.h>
#include <TM1637Display.h>
#include <DS3231.h>
#include <EEPROM.h>  //#include <EEPROMex.h>
DS3231 clock; // ПОДКЛЮЧЕНИЕ DS3231 SDA, SCL, SQW / A4, A5, D6
RTCDateTime DateTime;
TM1637Display display(4, 5);// ПОДКЛЮЧЕНИЕ TM1637 CLK,DIO / 4, 5
 
int k,alarm_m,alarm_h;
byte w = 1,x,y,z,menu,ton,on=1;
uint8_t date_s[]{0,0,0,0};// second
uint8_t date_t[]{0x78,0,0,0};// t
uint8_t date_on[]{0,0,0x3f,0x37};// ON
uint8_t date_off[]{0,0x3f,0x71,0x71};// OFF
 
void setup() {
  // clock.setDateTime(__DATE__, __TIME__);
   display.setBrightness(1);// яркость TM1637 0-7
   Wire.begin(); clock.begin();
   pinMode(6,INPUT);pinMode(10,INPUT);pinMode(11,INPUT);pinMode(12,INPUT);
   alarm_m = EEPROM.read(0);alarm_h = EEPROM.read(1);z = EEPROM.read(3);// ЧТЕНИЕ EEPROM
}
 
void loop() {
     DateTime = clock.getDateTime(); // ОПРОС ВРЕМЕНИ
     k = DateTime.hour*100+DateTime.minute; // ВРЕМЯ КАК ЧИСЛО ННММ
 
if(digitalRead(6) == HIGH){x = 0x40;}else{x = 0x00;} // МИГАНИЕ ДВОЕТОЧИЯ 
if(digitalRead(10) == HIGH){menu++;delay(300);if(menu > 6){menu = 0;}} // ПЕРЕБОР МЕНЮ
 
if(menu == 0){y = false;if(w == 0){EEPROM.update(0,alarm_m);EEPROM.update(1,alarm_h);EEPROM.update(3,z);}
w = 1;}  // ПРИ ВЫХОДЕ ИЗ МЕНЮ ОБНОВЛЕНИЕ EEPROM
 
if(menu == 1){k = DateTime.second;date_s[2] = display.encodeDigit((k/10)%10);
date_s[3] = display.encodeDigit((k%10)%10);display.setSegments(date_s);
} // ВЫВОД СЕКУНД
 
if(menu == 2){k = DateTime.day*100 + DateTime.month;x = 0x40;} // ВЫВОД ДАТЫ И МЕСЯЦА
 
if(menu == 3){k = clock.readTemperature();date_t[2] = display.encodeDigit((k/10)%10);
date_t[3] = display.encodeDigit((k%10)%10);display.setSegments(date_t);} // ВЫВОД ТЕМПЕРАТУРЫ
 
if(menu == 4){y = true;x = 0x40;k = alarm_h*100+alarm_m; // УСТАНОВКА БУДИЛЬНИКА
if(digitalRead(12) == HIGH){alarm_m++;delay(300);}if(alarm_m > 59){alarm_m = 0;} // МИНУТЫ БУДИЛЬНИКА
if(digitalRead(11) == HIGH){alarm_h++;delay(500);}if(alarm_h > 23){alarm_h = 0;} // ЧАСЫ БУДИЛЬНИКА
w = 0;}
 
if(menu == 5){
if(digitalRead(11) == HIGH){on=1;delay(300);}if(on==1){display.setSegments(date_on);} // БУДИЛЬНИК ВКЛЮЧЕН
if(digitalRead(12) == HIGH){on=0;delay(300);}if(on==0){display.setSegments(date_off);} // БУДИЛЬНИК ВЫКЛЮЧЕН
}
 
if(menu == 6){y = false;x = 0x00;k = z; // НАСТРОЙКА ЯРКОСТИ ИНДИКАТОРА
if(digitalRead(11) == HIGH){z++;delay(500);}if(z > 7){z = 0;}
if(digitalRead(12) == HIGH){z--;delay(500);}if(z > 8){z = 7;}
w = 0;}
 
if(digitalRead(11)==HIGH||digitalRead(12)==HIGH){ton=1;} // ПРИ НАЖАТИИ НА КНОПУ + ИЛИ - ПРЕРЫВАЕТСЯ СИГНАЛ БУДИЛНИКА
if(DateTime.hour*100+DateTime.minute!=alarm_h*100+alarm_m){ton=0;}
if(on==1){pic();}
 
display.setBrightness(z);
if(menu == 3 || menu == 5 || menu == 1){}else{display.showNumberDecEx(k,x,y);}
 
}
void pic(){if(ton==0&&(DateTime.hour*100+DateTime.minute==alarm_h*100+alarm_m)){tone(7,1000,500);delay(1000);}} // СИГНАЛ БУДИЛЬНИКА, 7 ЦИФРОВОЙ ВЫХОД

 

Комментарии

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

Случайные статьи

  • Преобразователи напряжения

    В связи с выключением электроэнергии возникла необходимость в других источниках питания. Я некоторое время работал с различными схемами преобразователей с 12 В АКБ в ~220 В, 50 Гц на различную мощность нагрузки, поэтому возникла возможность питать как лампы (свет в квартире), так и различную аппаратуру. Выключал автоматические пробки на счетчике, …Подробнее...
  • КЛАССИФИКАЦИЯ РАДИОИЗМЕРИТЕЛЬНЫХ ПРИБОРОВ СОГЛАСНО ГОСТ 15094-69

    КЛАССИФИКАЦИЯ РАДИОИЗМЕРИТЕЛЬНЫХ ПРИБОРОВ СОГЛАСНО ГОСТ 15094-69 Радиоэлектронные измерительные приборы (РИП) классифицируются по различным признакам (см. табл.) Классификация электронных радиоизмерительных приборов Признак классификации Разновидности измерительных приборов Выполняемые метрологические функции Эталоны, образцовые приборы, рабочие приборы Характер измерений, вид измеряемых величин, основные выполняемые функции, совокупность технических характеристик и очередность разработки Подгруппы, виды, типы …Подробнее...
  • Онлайн — калькулятор цветовой маркировки резисторов

    Онлайн — калькулятор цветовой маркировки резисторов

    Для резисторов с точностью 20 % используют маркировку с тремя полосками, для резисторов с точностью 10 % и 5 % маркировку с четырьмя полосками, для более точных резисторов с пятью или шестью полосками. Первые две полоски всегда означают первые два знака номинала. Если полосок 3 или 4, третья полоска означает …Подробнее...
  • Излучение и распространение радиоволн

    Излучение и распространение радиоволн

    Как известно, постоянный ток, проходящий по проводу создает вокруг него постоянное магнитное поле. Когда ток исчезает, то созданное им магнитное поле исчезая возвращает энергию в провод. При переменном токе вокруг провода создается переменное магнитное поле, напряженность которого меняется с частотой тока. Часть энергии магнитного поля возвращается в провод, другая часть …Подробнее...
  • Полицейская сирена на LM324

    Полицейская сирена на LM324

    Данная схема издает звук напоминающий полицейскую сирену. Схема основана на ОУ LM324 представляющий собой генератор ЗЧ. При нажатии на кнопку SA1 начнет быстро заряжаться С1, сирена начнет издавать звук. При размыкании контактов SA1  сирена будет работать до тех пор пока не разрядится через R2 конденсатор С1. Источник — http://www.eleccircuit.com/police-bicycle-siren-circuits/ скраб для …Подробнее...