Блог

● 6.5. Управление блоком реле по ИК-каналу. Пример с модулем NodeMCU

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

В набор включен инфракрасный пульт дистанционного управления с платой инфракрасного приёмника (рис. 6.8)

Рис. 6.8. Пульт ДУ с ИК приёмником в комплекте.

Это позволяет нам организовать управление исполнительными устройствами, подключенными к Relay Shield с помощью ИК пульта. Схема подключения ИК приемника к модулю NodeMCU приведена на рис. 6.9.


 
Рис. 6.9. Схема подключения ИК-приёмника к модулю Node MCU

После подключения ИК-приёмника необходимо узнать коды клавиш пульта, которые мы будем использовать для управления исполнительными устройствами. Скачаем и установим в Arduino IDE библиотеку IRremoteESP8266 и загрузим на модуль NodeMCU пример из данной библиотеки IRrecvDemo. Нажимая кнопки пульта узнаем коды клавиш, которые будем использовать (например цифровые "1", "2", "3").


 
Рис. 6.10. Получение кодов ИК-пульта (клавиши "1", "2", "3").

Теперь мы будем использовать эти коды в скетче управления "умным домом". Вносим изменения в скетч. Подключаем библиотеку
#include
Пин подключения ИК приемника D6 (GPIO12).
int RECV_PIN = 12;
Создаем необходимые переменные
IRrecv irrecv(RECV_PIN);
decode_results results;
В процедуре setup() запускаем ИК-приемник
irrecv.enableIRIn();
Добавляем в цикл loop() код для обработки команд с ИК пульта (см. листинг 6.5).
Листинг 6.4

void loop() {   
   …………
   // обработка кодов с пульта
  if (irrecv.decode(&results)) {
    switch(results.value, HEX){
       case 0xFD00FF:   // "1ʺ
            datarelays[0]=1- datarelays[0];
            set_status_relays();
         break;
       case 0xFD807F:   // "2ʺ
            datarelays[1]=1- datarelays[1];
            set_status_relays();
         break;
       case 0xFD40BF:   // "3ʺ
            datarelays[2]=1- datarelays[2];
            set_status_relays();
         break;
      default:
         break;
    }
    irrecv.resume(); 
  }
……..
}



Функция set_status_relays() осуществляет включение/выключение реле, установкой необходимых уровней на выходах порта B микросхемы MCP23017.

// управление реле
void set_status_leds() {
  int relays=0;
  for(int i=0;i<7;i++)
     relays=relays +( statusrelays[i]<<i);
  // записать данные в PORT B
  Wire.beginTransmission(0x20);
  Wire.write(0x13); // address PORT B
  Wire.write(leds);    // PORT B
  Wire.endTransmission();
  delay(100); // пауза
}



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

Читать далее

● 6.6. Организация доступа в дом с помощью RFID-модуля для Arduino MEGA

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

Один из важнейших вопросов при создании умного дома – безопасность. Рассмотрим организацию доступа по технологии RFID с помощью карт доступа.
Радиочастотная RFID — это технология автоматической бесконтактной идентификации объектов при помощи радиочастотного канала связи. Любая RFID-система состоит из:

•    RFID-метки;
•    считывателя информации (RFID-ридера);
•    микроконтроллера или компьютера для дальнейшей обработки информации.

Идентификация объектов производится по уникальному цифровому коду, который считывается из памяти электронной метки, прикрепляемой к объекту идентификации.
Считыватель содержит в своем составе передатчик и антенну, и посылает в эфир электромагнитные сигналы определенной частоты. RFID-метки "отвечают" собственным сигналом, который содержит информацию об идентификационном номере данной метки и данные об объекте, оснащенном данной меткой. Этот сигнал улавливается антенной считывателя, информация расшифровывается и передается для дальнейшей обработки обработки.
В состав набора входит модуль RC522 – RFID-модуль 13.56 МГц с SPI-интерфейсом (см. рис. 6.11). В комплекте к модулю идет 2 RFID-метки — в виде карты и брелока. В RFID-метках, работающих на данной частоте, реализована криптографическая защита, что обеспечивает защиту от копирования и подделки.
rfid

Рис. 6.11. RFID-модуль RC522 и RFID-метки.

Основные характеристики:

• Основан на микросхеме MFRC522;
• Напряжение питания: 3.3V;
• Потребляемый ток :13-26mA
• Рабочая частота: 13.56MHz
• Дальность считывания: 0 ~ 60 мм
• Интерфейс: SPI, максимальная скорость передачи 10МБит/с
• Размер: 40мм х 60мм
• Чтение и запись RFID-меток.

Схема подключения модуля к плате Arduino показана  на рис. 6.12. При определении RFID-считывателем карты из списка, мы можем отправить сигнал на открытие дверей (например, на электромеханический замок, подключенный через реле).

rfid подключение
 
Рис. 6.12. Схема подключения RFID-модуля к плате Arduino MEGA

Приступим к написанию скетча. Для работы с RFID-модулем RC522 будем использовать библиотеки SPI (встроенная в Arduino IDE) и MFRC522.
#include
#include
Уникальные идентификаторы карт или брелоков, по которым доступен вход запишем в массиве uid_ok:
byte uidok[][4]={
                 {0x11,0x22,0x33,0x44},
                 {0x11,0x22,0x33,0x44}
};
Пины для подключения реле:
#define RELAY_RC522_PIN 41
В цикле будем считывать данные с поднесенной карты или брелока, затем проверять uid карты со списком разрешенных uid.
Код скетча представлен в листинге 6.5.
Листинг 6.5

#include <SPI.h>
#include <MFRC522.h>
// пин для подключения реле
#define RELAY_RC522_PIN 41
// уровни для включения/выключения реле
#define RELAY_ON 0
#define RELAY_OFF 1
// Инициализация MFRC522
// константы подключения контактов SS и RST
#define RST_PIN = 5;     
#define SS_PIN = 53;    
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// массив разрешенных uid
byte uidok[][4]={
                 {0xE0, 0x2A, 0x87, 0x1B},
                 {0xD9, 0xFA, 0x90, 0x55 }
};
 
void setup() {
   Serial.begin(9600); // инициализация последовательного порта
   SPI.begin(); // инициализация SPI
   mfrc522.PCD_Init(); // инициализация MFRC522
   // сконфигурировать вывод реле как OUTPUT
   pinMode(RELAY_RC522_PIN,OUTPUT);
   digitalWrite(RELAY_RC522_PIN, RELAY_OFF);
}

void loop() {
  if (mfrc522.PICC_IsNewCardPresent()) {
   // чтение карты
   if ( mfrc522.PICC_ReadCardSerial()) {     
      // показать результат чтения UID и тип метки
      Serial.print(F("Card UID:"));
      if(compare_uid(mfrc522.uid.uidByte, mfrc522.uid.size)) {
          Serial.println();
          Serial.println(" – ok !!");
          // включить реле
          digitalWrite(RELAY_RC522_PIN, RELAY_ON);
          delay(4000);
          digitalWrite(RELAY_RC522_PIN, RELAY_OFF);
      } else {
          Serial.println();
          Serial.println(" – false !!");
          delay(1000);
      }
   }
  }
}
// поиск считанного uid в списке разрешенных
boolean compare_uid(byte *buffer, byte bufferSize) {
int bytes_ok=0;
   for(int i1=0;i1<2;i1++) {
      bytes_ok=0;
      for (byte i2 = 0; i2 < 4; i2++) {
         Serial.print(buffer[i2] < 0x10 ? " 0" : " ");
         Serial.print(buffer[i2], HEX);
         if(buffer[i2]== uidok[i1][i2]) {
            bytes_ok= bytes_ok+1;
         }
      }
      if(bytes_ok==4) {
         return true;
      }
   }
   return false;
}



Загрузим данный скетч на плату Arduino MEGA и проверим ограничение доступа работу с помощью RFID (см. рис. 6.13).


 
Рис. 6.13. Доступ по RFID-картам.

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

 

Читать далее

● 7. Создание будильников для запуска исполнительных устройств по расписанию

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

В предыдущей главе мы рассмотрели управление исполнительными устройствами "умного дома" либо с помощью команд, отправляемых по нажатии кнопки или нажатии по кнопке на сенсорном дисплее, либо при наступлении определенных климатических параметров, данные о которых мы получаем с датчиков.
Но очень часто исполнительные устройства требуется включать/выключать по расписанию: включение освещения перед домом при наступлении сумерек, полив растений по расписанию, выключение наружного освещения днем и т.д.
Для этого наши контроллеры должны знать реальное время. В наборе для этого есть модуль часов реального времени (RTC)  на микросхеме DS3231 (рис. 7.1).

Рис. 7.2. Модуль часов реального времени (RTC)  на микросхеме DS3231

Микросхема DS3231 – часы реального времени с температурной компенсацией кварцевого генератора и кристалла. В чипе используется не внешний кварцевый генератор 32 кГц, а внутренний и датчик температуры, который компенсирует изменения температуры, так что время остается точным. Погрешность составляет ±2 минуты за год при температуре окружающей среды от -40°С до +85°С. Низкая потребляемая мощность, полный календарь с учетом високосных лет до 2100 года, часы плюс 56 байтов энергонезависимого статического ОЗУ. В микросхеме DS3231 имеется встроенная схема, определяющая аварийное отключение питания и автоматически подключающая резервную батарейку. Так же микросхема содержит два будильника которые могут генерить прерывания и выводить данное событие на один из выводов микросхемы.
Модуль подключается к микроконтроллеру при помощи шины I2C.   На модуле уже предусмотрена подтяжка выводов SCL и SDA  к шине питания с помощью резисторов 2 КОм.
Рассмотрим подключение модуля DS3231 к контроллерам Arduino Mega и модулю NodeMcu для получения точного времени и организации управления исполнительными устройствами по будильникам.



Читать далее

● 7.1. Подключение модуля DS3231 к плате Arduino MEGA. Вывод времени на экран дисплея

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

Рассмотрим подключение модуля часов реального времени DS3231 к плате Arduino MEGA.  Используем выводы Arduino MEGA 20 (SDA) и 21(SCL).
Схема соединений представлена на рис. 7.2.


 
Рис. 7.2. Схема подключения модуля DS3231 к плате Arduino MEGA

Сначала добавим вывод времени на экран дисплея (главное меню). Для программирования нам понадобятся Arduino-библиотеки Wire (встроенная в Arduino IDE), Time и DS1307RTC. В цикле будем получать данные о текущем времени (часы, минуты) с модуля DS3231 и выводить на экран дисплея.
Вносим дополнительный код в скетч. Подключаем библиотеки:

#include
#include
#include

Создаем переменную
tmElements_t tm;
Добавляем в скетч переменную для периодичности опроса модуоя RTC:
unsigned long millis3231;
И в основной цикл loop() добавляем код получения данных времени и вывода на экран дисплея (см. листинг 7.1).
Листинг 7.1

void loop() {   
   …………
  // показания RTC
  if(millis()-millisds3231 >= 5000 && screen==0) {
     set_display_data_RTC(BLACK);
     RTC.read(tm);
     set_display_data_RTC(MAGENTA);  // вывод на дисплей
     millisds3231=millis();
  }
……..
}
Процедура set_display_data_RTC() расположена в файле display.ino.
// вывести текущее значение для RTC
void set_display_data_RTC(unsigned int color) {
   tft.setTextSize(2);
   tft.setTextColor(color);  
   tft.setCursor(80, 50);
   if(tm.Hour<10)
      tft.print("0");
   tft.print(tm.Hour);
   tft.print(":");
   if(tm.Minute<10)
      tft.print("0");
   tft.print(tm.Minute);
 }



После загрузки скетча на плату Arduino на экране отображается реальное время, получаемое с модуля DS3231 (см. рис. 7.3).
 


Рис. 7.3. Вывод текущего времени на экран дисплея

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

Читать далее

Главное меню

Каталог

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

Цена
от
до