Блог

● 4.8. Подключение датчика присутствия HC-SR501

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

Рассмотрим еще один датчик, связанный с обеспечением безопасности для умного дома. Это модуль датчика присутствия HC-SR501 на основе пироэлектрического эффекта (рис. 4.39).
SR501
Рис. 4.39. Датчик присутствия HC-SR501.

Состоит из самого PIR-датчика (Pyroelectric (Passive) InfraRed sensor) и схемы управления. Такие датчики часто используются в охранных системах и в быту для обнаружения движения в помещении.
Модуль имеетс два переменных резистора и перемычку для настройки режима (рис. 4.40). Потенциометр Sx регулирует чувствительность прибора. Чувствительность влияет на размер детектируемого объекта и дистанцию обнаружения объекта.


 
Потенциометр Tx регулирует время срабатывания T. Если датчик обнаружил движение, он генерирует на выходе положительный импульс длиной T.
Перемычка переключает режим датчика.  В режиме L на выходе при каждом срабатывании датчика появляется отдельный импульс. В режиме H при срабатывании датчика на выходе будет сигнал HIGH в течении некоторого периода времени T. По окончании периода, сигнал на выходе вернется в исходное состояние, и датчик будет ждать следующего срабатывания.
Рассмотрим подключение модуля датчика присутствия HC-SR501 к плате Arduino Mega и модулю NodeMcu ESP8266.

4.8.1. Подключение модуля датчика присутствия HC-SR501 к плате Arduino Mega

Для подсчета срабатываний модуля датчика HC-SR501 будем использовать внешние прерывания на вход 18 платы Arduino Mega. Это прерывание int5. Схема подключения модуля датчика присутствия HC-SR501 к плате Arduino Mega показана на рис. 4.41.


 Рис. 4.41. Схема подключений датчика присутствия HC-SR501 к плате Arduino Mega

Загрузим на плату Arduino Mega скетч вывода счетчика срабатываний  датчика HC-SR501 и вывода в последовательный порт Arduino. Счетчик инкрементируется при переходе уровня на входе 18 с LOW на HIGH – это процедура обработки внешнего прерывания  incCounterHCSR501(). Каждые 2000 мсек (INTERVAL_GET_DATA=2000), мы выводим значение счетчика в последовательный порт.
Содержимое скетча представлено в листинге 4.16.
Листинг 4.16

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс 
// пин, к которому подключен датчик
#define HCSR501PIN         18
// счетчик срабатыаний
int counterHCSR501=0;


// переменная для интервала измерений
unsigned long millis_int1=0;
 
void setup() {
  Serial.begin(9600);
  attachInterrupt(5,incCounterHCSR501,RISING);
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных счетчика срабатываний HC-SR501
      int counter= get_data_counterHCSR501();
      // выводим значения газа в ppm
      Serial.print("counter=");
      Serial.println(counter);
      // старт интервала отсчета
      millis_int1=millis();
   }
}

// получение данных счетчика срабатываний HC-SR501
int get_data_counterHCSR501()  {
  // вернуть значение счетчика срабатываний HC-SR501
  return counterHCSR501;
}

void incCounterHCSR501() {
   // инкремент счетчика
   counterHCSR501=counterHCSR501+1;
}



Загрузим скетч на плату Arduino Mega, откроем монитор последовательного порта и увидите вывод значений счетчика (рис. 4.42).
 


Рис. 4.42. Вывод счетчика срабатываний датчика присутствия HC-SR501 в монитор последовательного порта.

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

4.8.2. Подключение модуля датчика присутствия HC-SR501 к модулю NodeMcu ESP8266

Теперь рассмотрим подключение модуля датчика присутствия HC-SR501 к модулю NodeMcu ESP8266. Для подсчета срабатываний модуля датчика HC-SR501 будем использовать внешние прерывания на вход 18 модулю NodeMcu ESP8266. Это прерывание int5. Схема подключения модуля датчика присутствия HC-SR501 к модулю NodeMcu показана на рис. 4.43.

Рис. 4.43. Схема подключений датчика присутствия HC-SR501 к NodeMcu ESP8266

Загрузим на модуль NodeMcu скетч вывода счетчика срабатываний  датчика HC-SR501 и вывода в последовательный порт Arduino. Счетчик инкрементируется при переходе уровня на входе D6 с LOW на HIGH – это процедура обработки внешнего прерывания  incCounterHCSR501(). Каждые 2000 мсек (INTERVAL_GET_DATA=2000), мы выводим значение счетчика в последовательный порт.
Содержимое скетча представлено в листинге 4.16.

Листинг 4.17

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс 
// пин, к которому подключен датчик
#define HCSR501PIN         D6
// счетчик срабатыаний
int counterHCSR501=0;


// переменная для интервала измерений
unsigned long millis_int1=0;
 
void setup() {
  Serial.begin(9600);
  attachInterrupt(HCSR501PIN,incCounterHCSR501,RISING);
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных счетчика срабатываний HC-SR501
      int counter= get_data_counterHCSR501();
      // выводим значения газа в ppm
      Serial.print("counter=");
      Serial.println(counter);
      // старт интервала отсчета
      millis_int1=millis();
   }
}

// получение данных счетчика срабатываний HC-SR501
int get_data_counterHCSR501()  {
  // вернуть значение счетчика срабатываний HC-SR501
  return counterHCSR501;
}

void incCounterHCSR501() {
   // инкремент счетчика
   counterHCSR501=counterHCSR501+1;
}



Загрузим скетч на модуль NodeMcu, откроем монитор последовательного порта и увидите вывод значений счетчика (рис. 4.44).

 

Рис. 4.44. Вывод счетчика срабатываний датчика присутствия HC-SR501 в монитор последовательного порта

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


Читать далее

● 5. Отображение показаний и индикация состояний датчиков

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

В предыдущей главе мы познакомились с датчиками, необходимыми для создания нашего "Умного" дома и реализовали подключение датчиков к контроллерам – плате Arduino Mega и модулю Node MCU ESP8266. Данные, получаемые с датчиков, мы выводили в монитор последовательного порта Arduino. Смотреть показания датчиков через последовательный порт не совсем удобно, нам необходимы более удобные устройства для отображения данных.  Во-первых, мы реализуем вывод данных с датчиков на дисплей, во-вторых, мы подключим светодиоды, которые будут сигнализировать о наступлении неблагоприятных климатических условий,  требующих нашего вмешательства (например, пониженная увлажненность почвы, слишком высокая температура, протекание воды), в-третьих, в дополнение к светодиодной индикации  наступления неблагоприятных климатических условий, добавим  вывод звуковых сигналов на динамики.



Читать далее

● 5.1. Дисплей TFT 2.4" Shield 240x320

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

В качестве экрана для отображения показаний с датчиков мы будем использовать TFT shield (см. рис. 5.1)  с цветным ЖКИ QVGA, имеющим диагональ 2,4 дюйма и разрешение экрана 240x320. ЖКИ индикатор имеет постоянно включенную подсветку. Есть одна кнопка. На плате расположен контейнер для SD карты. На шилде встроен резистивный тачскрин, что позволяет определяеть положение при нажатии на экран. На плате есть кнопка. Нажатие кнопки вызывает сброс Arduino.
Дисплей TFT 2.4 240x320
   
Рис. 5.1. TFT shield 2.4" 240x320.

Основное применение дисплея – отображение простой графики и символьных данных с использованием 16 цветов.

TFT shield может устанавливаться в соединители Arduino Mega (см. рис. 5.2).


 
Рис. 5.2. Установка TFT shield 2.4" 240x320 на плату Arduino Mega.

Для вывода показаний на дисплей необходимы библиотеки Adafruit_GFX и SWTFT. Для работы с тачскрином будем использовать библиотеку Adafruit Touch-Screen-Library. Архив с библиотеками можно скачать по ссылке www.arduino-kit.ru, и распаковать в директорию libraries вашего Arduino IDE.

Читать далее

● 5.2. Вывод показаний датчиков на TFT 2.4" Shield 240x320 для Arduino MEGA

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

Подключим TFT shield к Arduino Mega (см. рис. 5.2). Для использования библиотеки SWTFT с платой Arduino Mega, необходимо внести изменения в файл SWTFT.cpp (см. рис. 5.3).

 Рис. 5.3. Изменения в файле SWTFT.cpp

Теперь загрузим на плату Arduino Mega скетч listing_05_01. Содержимое файла _05_01.ino показано в листинге 5.1. Все константы скетча вынесены в файл defines.h, процедуры получения данных с датчиков – в файл  get_data_sensors.ino, вывод данных на экран –  в файл  display.ino.


Листинг 5.1

// подключение библиотеки DHT
#include "DHT.h"
// подключение библиотеки OneWire
#include <OneWire.h>
// константы
//#define DHTPIN 22          // пин подключения контакта DHT22
//#define DS18B20PIN 23      // пин подключения контакта DS18B20
//#define DHTTYPE DHT11      // датчик DHT 11
//#define INTERVAL_GET_DATA 2000  // интервала измерений, мс

// создание экземпляра объекта SWTFT
SWTFT tft;
// создание экземпляра объекта DHT
DHT dht(DHTPIN,DHTTYPE);
// создание экземпляра объекта OneWire
OneWire ds(DS18B20PIN);

// переменная для интервала измерений
unsigned long millis_int1=0;
int teksensor=0;
// массив для хранения данных датчиков
float datasensors[]={999,999,999,999,999,999,999,999,999,999};
int aktivesensors[]={1,1,1,1,0,0,0,0,0,0};
int ysensors[]={100,100,100,100,100,100,100,100,100,100};
int xsensors[]={60,80,100,120,140,160,180,200,220,240};
int posdata=0;


void setup(void) {
  Serial.begin(9600);
  Serial.println(F("TFT LCD test"));
  ini_display();
  // вывод главного экрана 
  //view_display_clock();
  // вывод экрана сенсоров
  view_display_sensors();  
}

void loop(void) {
   // показания с датчиков
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      teksensor=(teksensor+1)%COUNT_SENSORS;
      if(aktivesensors[teksensor]==1)  {
         float fvar=0;
         switch(teksensor) {
            case 0:  // DHT22
                fvar=get_data_humidity();
                Serial.print("humidity=");Serial.println(fvar);
              break;
            case 1:  // DS18B20
                fvar=get_data_ds18b20();
                Serial.print("tds18b20=");Serial.println(fvar);
              break;
            case 2:  // Soil Moisture
                fvar=get_data_soilmoisture();
                Serial.print("soilmoisture=");Serial.println(fvar);
              break;
            case 3:  // level water
                fvar=get_data_levelwater();
                Serial.print("levelwater=");Serial.println(fvar);
             break;
            case 5:  // mq-2 propan
                fvar=get_data_ppmpropan();
                Serial.print("ppmpropan=");Serial.println(fvar);
              break;
            case 6:  // mq-2 methan
                fvar=get_data_ppmmethan();
                Serial.print("ppmmethan=");Serial.println(fvar);
                control_data_limit(5);
              break;
            case 7:  // mq-2 smoke
                fvar=get_data_ppmsmoke();
                Serial.print("ppmsmoke=");Serial.println(fvar);
                control_data_limit(5);
              break;
            case 8:  // mq-7 CO
                fvar=get_data_ppmcarbonmonoxide();
                Serial.print("ppmcarbonmonoxide="); 
                Serial.println(fvar);
                control_data_limit(6);
              break;
            default:  // другие датчики
              break;
         } 
         if(fvar<999) {
            set_display_data_sensor(teksensor, 
                 datasensors[teksensor],BLACK);
            datasensors[teksensor]=fvar;
            set_display_data_sensor(teksensor, 
                datasensors[teksensor],YELLOW);           
         }
      }
      millis_int1=millis();
   }
}
// Процедуры вывода данных
// на дисплей
// shield TFT 2.4 240x320

// ************************************************
// инициализация дисплея
void ini_display() {
  tft.reset();
  uint16_t identifier = tft.readID();  
  Serial.print(F("LCD driver chip: "));
  Serial.println(identifier, HEX);
  tft.begin(identifier);
  tft.fillScreen(BLACK);
  tft.setRotation(0);
  Serial.println(F("start!"));
}
// ************************************************
// вывод экрана с показаниями датчиков
void view_display_sensors() {
  // очистить экран
  tft.fillScreen(BLACK);
  // вывод заголовка экрана
  tft.setCursor(10, 15);
  tft.setTextColor(MAGENTA);  
  tft.setTextSize(3);
  tft.println("Sensors:");
  // вывод списка датчиков
  tft.setTextColor(YELLOW);  
  tft.setTextSize(2);
  for(int i=0;i<COUNT_SENSORS;i++) {
     tft.setCursor(10, xsensors[i]);
     tft.print(strS1[i]);
  } 
  // вывод списка значений датчиков
 
  // вывод единиц измерения
  tft.setTextColor(YELLOW);  
  tft.setTextSize(2);
  for(int i=0;i<COUNT_SENSORS;i++) {
     tft.setCursor(200, xsensors[i]);
     tft.print(strS2[i]);
  }
  // вывод для возврата в главное меню  
}
// ************************************************
// вывести текущее значение для датчика
void set_display_data_sensor(int pos,float var,unsigned int color) {
   tft.setTextColor(color);  
   tft.setCursor(100, xsensors[pos]);
   tft.print(var);
}



Загружаем скетч на плату Arduino Mega и получаем вывод данных с датчиков на экран TFT 2.4" shield.


 
Рис. 5.4. Вывод показаний сенсоров на дисплей.

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

Читать далее

Главное меню

Каталог

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

Цена
от
до