7.2. Добавление срабатывания устройств Умного дома по будильнику (для Arduino MEGA)
После подключения модуля 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 по ссылке.



1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33 

 

Вверх