Блог

● 7.2. Добавление срабатывания устройств Умного дома по будильнику (для Arduino MEGA)

Опубликовано: 23.01.2018

После подключения модуля 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 по ссылке.



Читать далее

● 7.3. Подключение модуля DS3231 к модулю NodeMCU

Опубликовано: 23.01.2018

Рассмотрим подключение модуля DS3231 к модулю NodeMCU. У нас в проекте есть устройство, подключенное к модулю NodeMCU по протоколу I2C – это микросхема расширителя входов  MCP23017 (см. главу 5.5). Подсоединяем к контактам NodeMCU D3 (GPIO0) – SCL и D4(GPIO2). Схема соединений представлена на рис. 7.5.


 
Рис. 7.5. Схема подключения модуля DS3231 к модулю NodeMCU

Загрузим на модуль NodeMCU скетч установки и получения текущего времени с RTC модуля DS3231 (см. листинг 7.3)
Листинг 7.3

#include <Wire.h>
 
int clockAddress = 0x68;  // I2C адрес микросхемы
byte second, minute, hour, dayOfWeek, day, dayOfMonth, month, year;
  
#define DS3231_SCL 0
#define DS3231_SDA 2
  
void setup() {
  // запустить Wire
  Wire.begin(DS3231_SDA, DS3231_SCL);
  Serial.begin(9600);
}
 
void loop() { 
  if (Serial.available() > 0) {
    String str = Serial.readStringUntil('\n');
    if (str == "show time") {
      getDateDs3231(); // показать время
      String s = getTimeStr();
      Serial.println(s);
    }
    if (str == "set time") {
      time_set();
    } 
  }
}
 
// получить дату и время
void getDateDs3231() {
  Wire.beginTransmission(clockAddress);
  Wire.write(byte(0x00));
  Wire.endTransmission();
  Wire.requestFrom(clockAddress, 7);
 
  second     = bcdToDec(Wire.read() & 0x7f);
  minute     = bcdToDec(Wire.read());
  hour       = bcdToDec(Wire.read() & 0x3f);
  dayOfWeek  = bcdToDec(Wire.read());
  dayOfMonth = bcdToDec(Wire.read());
  day = dayOfMonth;
  month      = bcdToDec(Wire.read());
  year       = bcdToDec(Wire.read());
}
void setDateDs1307()            
{
  Wire.beginTransmission(clockAddress);
  Wire.write(byte(0x00));
  Wire.write(decToBcd(second));  
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));    
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}
 
byte decToBcd(byte val) {
  return ( (val / 10 * 16) + (val % 10) );
} 
byte bcdToDec(byte val) {
  return ( (val / 16 * 10) + (val % 16) );
}
  
String getTimeStr() {
  String str = String(day) + "." + formatDigit(month, 2) + "." + 
      formatDigit(year, 2) + " " + formatDigit(hour, 2) + ":" +
      formatDigit(minute, 2) + ":" + formatDigit(second, 2);
  return str;
}
String formatDigit(int i, int len) {
  String s = String(i);
  while (s.length() < len) {
    s = "0" + s;
  }
  return (s);
} 
 
void time_set() {
  Serial.println("Enter Year 2 last digits");
  while (Serial.available() <= 0);
  year = Serial.parseInt();
  Serial.println(year);
 
  Serial.println("Month");
  while (Serial.available() <= 0);
  month = Serial.parseInt();
  Serial.println(month);
 
  Serial.println("Day");
  while (Serial.available() <= 0);
  day = Serial.parseInt();
  dayOfMonth = day;
  Serial.println(day);
 
  Serial.println("Day of Week");
  while (Serial.available() <= 0);
  dayOfWeek = Serial.parseInt();
  Serial.println(dayOfWeek);
 
  Serial.println("Hour");
  while (Serial.available() <= 0);
  hour = Serial.parseInt();
  Serial.println(hour);
 
  Serial.println("Minute");
  while (Serial.available() <= 0);
  minute = Serial.parseInt();
  Serial.println(minute);
 
  setDateDs1307();
 
  Serial.println("Time recvd OK");
} 



И результат работы скетча, позволяющего установить время отправкой команд по последовательному порту (рис. 7.6).
 


Рис. 7.6. Установка времени через последовательный порт

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.

Читать далее

● 7.4. Добавление срабатывания устройств Умного дома по будильнику (для NodeMCU)

Опубликовано: 23.01.2018

После подключения модуля 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.4).
Листинг 7.4

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();
  }
……..
}



Скачать данный полностью скетч можно на сайте www.arduino-kit.ru по ссылке.


Читать далее

● 8. Организация подключения к сети Интернет с помощью модуля SIM800L

Опубликовано: 23.01.2018

В предыдущих главе мы рассмотрели мы сделали большие шаги построения "умного дома" – оснастили его датчиками и исполнительными устройствами и создали и обеспечили определенную степень автоматизации для создания комфорта и безопасности. Теперь пришло время сделать наш "умный дом" устройством IoT (Интернета вещей), чтобы получить доступ к нему для мониторинга и управления из любой точки мира по сети интернет. Организуем доступ контроллеров нашего дома к сети интернет.

Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до