Тема: Часы (DS3231) с будильником (Arduino)
Основная статья - http://rcl-radio.ru/?p=45882
Не тестировалось!
#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.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;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
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(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print(" ");
lcd.print(clock.readTemperature(),1);lcd.print((char)223);lcd.print("C");// выводим значение температуры
lcd.setCursor(0,2);
//lcd.print(clock.dateFormat("D d M Y", DateTime));// выводим день недели, дату, месяц и год
lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(" ");
lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(" ");
lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(" ");
lcd.print(DateTime.year);
}
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);}}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip // DS3231.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;
char * dn[7]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
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(DateTime.hour/10);lcd.print(DateTime.hour%10);lcd.print(":");
lcd.print(DateTime.minute/10);lcd.print(DateTime.minute%10);lcd.print(":");
lcd.print(DateTime.second/10);lcd.print(DateTime.second%10);lcd.print(" ");
lcd.print(clock.readTemperature(),1);lcd.print((char)223);//lcd.print("C");// выводим значение температуры
lcd.setCursor(0,2);
//lcd.print(clock.dateFormat("D d M Y", DateTime));// выводим день недели, дату, месяц и год
lcd.print(dn[DateTime.dayOfWeek+1]);lcd.print(" ");
lcd.print(DateTime.day/10);lcd.print(DateTime.day%10);lcd.print(" ");
lcd.print(DateTime.month/10);lcd.print(DateTime.month%10);lcd.print(" ");
lcd.print(DateTime.year);
}
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);}}