После подключения модуля RTC, мы можем организовать запуск исполнительных устройств "умного дома" по расписанию. Для этого создадим объект, описывающий будильник:
struct ALARM{
int hours; // час срабатывания будильника
int minutes; // минута срабатывания будильника
int relay; // номер реле исполнительного устройства (0-N)
int value; // устанавливаемое значение (0 или 1)
};
И создадим список необходимых будильников:
ALARM alarms[]={{7,30,2,1},
{7,35,2,0},
{8,30,1,1},
{8,50,1,0}
};
В цикле loop() нашего скетча добавим проверку наступления события по расписанию и необходимых действий при наступлении события (см. листинг 7.2)
Листинг 7.2
void loop() {
…………
// проверяем наступление события для будильников
if(millis()-millisalarms >= 20000) {
for(int i=0;i<sizeof(alarms)/8;i++) {
if(alarms[i].hours==tm.Hour && alarms[i].minutes==tm.Minute) {
// установить реле
digitalWrite(pinrelays[alarms[i].relay],alarms[i].value);
}
}
millisalarms=millis();
}
……..
}
Также необходимо добавить процедуру вывода списка будильников на экран дисплея (см. рис. 7.4):
// вывод экрана будильников
void view_display_alarms() {
// очистить экран
tft.fillScreen(BLACK);
// вывод заголовка экрана
tft.setCursor(10, 15);
tft.setTextColor(MAGENTA);
tft.setTextSize(3);
tft.println("Alarms:");
// вывод списка будильников
tft.setTextColor(YELLOW);
tft.setTextSize(2);
for(int i=0;i<4;i++) {
tft.setCursor(10, xsensors[i]);
if(alarms[i].hours<10)
tft.print("0");
tft.print(alarms[i].hours);
tft.print(":");
if(alarms[i].minutes<10)
tft.print("0");
tft.print(alarms[i].minutes);
tft.setCursor(90, xsensors[i]);
tft.print(strR1[alarms[i].relay]);
tft.setCursor(170, xsensors[i]);
if(alarms[i].value==0)
tft.print("OFF");
else
tft.print("ON");
}
// ardyino-kit
tft.setTextSize(3);
tft.setTextColor(MAGENTA);
tft.setCursor(10, 270);
tft.print("arduino-kit");
// вывод для возврата в главное меню
}
Рис. 7.4. Экран будильников
А также переход на данный экран с экрана главного меню и обратно на экран главного меню (добавляем в процедуру do_for_touch()):
// по нажатии по экрану
void do_for_touch(int x,int y,int res) {
…….
// экран alarms
else if(res==3) {
// на main
if(x<820 && x>780 && y<800 && y>160 ) {
screen=0;
view_display_main();
}
}
……
// на relays
if(x<570 && x>520 && y<680 && y>280 ) {
screen=2;
view_display_alarms();
}
……
}
Скачать данный полностью скетч можно на сайте www.arduino-kit.ru по ссылке.