Блог

● 3. Установка программного обеспечения

Опубликовано: 23.01.2018
Разработка собственных приложений на базе плат, совместимых с архитектурой Arduino, осуществляется в официальной бесплатной среде программирования Arduino IDE. Среда предназначена для написания, компиляции и загрузки собственных программ в память микроконтроллера, установленного на плате Arduino-совместимого устройства.  Основой среды разработки является язык Processing/Wiring — это фактически обычный C++, дополненный простыми и понятными функциями для управления вводом/выводом на контактах. Существуют версии среды для операционых систем Windows, Mac OS и Linux.
Я использую проверенные версии  Arduino IDE, при написании этой книги использовались версии 1.6.1 и 1.6.5. Скачать Arduino IDE можно на официальном сайте www.arduino.cc.

3.1. Установка Arduino IDE в Windows

Отправляемся на страницу https://www.arduino.cc/en/Main/OldSoftwareReleases#previous (рис. 3.1), выбираем версию для операционной системы Windows и скачиваем архивный файл. Он занимает чуть более 80 Мбайт и содержит все необходимое, в том числе и драйверы. По окончании загрузки распаковываем скачанный файл в удобное для себя место.
 


Риc 3.1. Страница загрузки всех версий Arduino IDE официального сайта Arduino

Теперь необходимо установить драйверы. Подключаем Arduino к компьютеру. На контроллере должен загореться индикатор питания — зеленый светодиод. Windows начинает попытку установки драйвера, которая заканчивается сообщением Программное обеспечение драйвера не было установлено.
Открываем Диспетчер устройств. В составе устройств находим значок Arduino Uno — устройство отмечено восклицательным знаком. Щелкаем правой кнопкой мыши на значке Arduino Uno и в открывшемся окне  выбираем пункт Обновить драйверы и далее пункт Выполнить поиск драйверов на этом компьютере. Указываем путь к драйверу — ту папку на компьютере, куда распаковывали скачанный архив. Пусть это будет папка drivers каталога установки Arduino — например, C:\arduino-1.6.5\drivers. Игнорируем все предупреждения Windows и получаем в результате сообщение Обновление программного обеспечения для данного устройства завершено успешно. В заголовке окна будет указан и COM-порт, на который установлено устройство.
Осталось запустить среду разработки Arduino IDE (рис. 3.2). В новой версии Arduino IDE в списке доступных портов отображается название платы Arduino.


 
Риc 3.2. Arduino IDE — среда разработки

3.2. Установка Arduino IDE в Linux

Рассмотрим установку Arduino IDE в операционной системе Linux. В Linux Ubuntu среда Arduino IDE устанавливается просто — она находится в репозитарии стандартных приложений Linux.  Выбираем Arduino IDE из списка доступных программ в меню Ubuntu Приложения | Центр приложений Ubuntu | Загрузить приложение. В списке разделов выбираем Инструменты разработчика, в списке следующего уровня — Все приложения и в следующем открывшемся списке  — Arduino IDE (рис. 3.3). Щелкаем левой кнопкой мыши на значке этой программы, справа от нее появляется кнопка Установить, нажимаем на эту кнопку, и среда устанавливается автоматически. Для запуска Arduino IDE выбираем пункт  Приложения | Программирование | Arduino IDE.


 
Риc 3.3. Выбор программы из центра приложений Ubuntu

Для работы с необходимой версией программы скачиваем со страницы загрузки официального сайта проекта Arduino –  https://www.arduino.cc/en/Main/OldSoftwareReleases#previous (рис. 3.1) архив с версией программы для Linux. Затем распаковываем ее в желаемое место, например /home//Arduino. Для запуска программы из терминала
cd ~/Arduino
./arduino

3.3. Установка Arduino IDE в Mac OS X

Теперь рассмотрим установку Arduino IDE в операционной системе Mac OS X. Cкачиваем со страницы загрузки официального сайта проекта Arduino –  https://www.arduino.cc/en/Main/OldSoftwareReleases#previous (рис. 3.1) архив с версией программы для OS X. Распаковываем архив и копируем его содержимое в папку Программы. Теперь Arduino IDE находится в списке программ Launchpad (рис. 3.4).



Риc 3.4. Установка Arduino IDE в OS X

3.4. Настройка среды Arduino IDE

Среда разработки Arduino состоит из:
  • редактора программного кода;
  • области сообщений;
  • окна вывода текста;
  • панели инструментов с кнопками часто используемых команд;
  • нескольких меню.

Программа, написанная в среде Arduino, носит название скетч. Скетч пишется в текстовом редакторе, который имеет цветовую подсветку создаваемого программного кода. Во время сохранения и экспорта проекта в области сообщений появляются пояснения и информация об ошибках. Окно вывода текста показывает сообщения Arduino, включающие полные отчеты об ошибках и другую информацию. Кнопки панели инструментов позволяют проверить и записать программу, создать, открыть и сохранить скетч, открыть мониторинг последовательной шины.
Разрабатываемым скетчам дополнительная функциональность может быть добавлена с помощью библиотек, представляющих собой специальным образом оформленный программный код, реализующий некоторый функционал, который можно подключить к создаваемому проекту. Специализированных библиотек существует множество. Обычно библиотеки пишутся так, чтобы упростить решение той или иной задачи и скрыть от разработчика детали программно-аппаратной реализации. Среда Arduino IDE поставляется с набором стандартных библиотек: Serial, EEPROM, SPI, Wire и др. Они находятся в подкаталоге libraries каталога установки Arduino. Необходимые библиотеки могут быть также загружены с различных ресурсов.  Папка библиотеки копируется в каталог стандартных библиотек (подкаталог libraries каталога установки Arduino). Внутри каталога с именем библиотеки находятся файлы *.cpp, *.h. Многие библиотеки снабжаются примерами, расположенными в папке examples. Если библиотека установлена правильно, то она появляется в меню Эскиз | Импорт библиотек. Выбор библиотеки в меню приведет к добавлению в исходный код строчки:
#include <имя библиотеки.h>
Эта директива подключает заголовочный файл с описанием объектов, функций и констант библиотеки, которые теперь могут быть использованы в проекте. Среда Arduino будет компилировать создаваемый проект вместе с указанной библиотекой.
Перед загрузкой скетча требуется задать необходимые параметры в меню Инструменты | Плата — как показано на рис. 3.5, и Инструменты | Последовательный порт— показано на рис. 3.2.
Современные платформы Arduino перезагружаются автоматически перед загрузкой. На старых платформах необходимо нажать кнопку перезагрузки. На большинстве плат во время процесса загрузки будут мигать светодиоды RX и TX.
При загрузке скетча используется загрузчик (bootloader) Arduino — небольшая программа, загружаемая в микроконтроллер на плате. Она позволяет загружать программный код без использования дополнительных аппаратных средств. Работа загрузчика  распознается по миганию светодиода на цифровом выводе D13.
 


Риc 3.5. Arduino IDE — выбор платы

Монитор последовательного порта (Serial Monitor) отображает данные, посылаемые в платформу Arduino (плату USB или плату последовательной шины). Для отправки данных необходимо ввести в соответствующее поле текст и нажать кнопку Послать (Send) или клавишу (рис. 3.6). Затем следует из выпадающего списка выбрать скорость передачи, соответствующую значению Serial.begin в скетче. На ОС Mac или Linux при подключении мониторинга последовательной шины платформа Arduino будет перезагружена (скетч начнется сначала).
 


Риc 3.6. Arduino IDE — монитор последовательного порта

3.5. Установка Arduino IDE для ESP8266

Arduino IDE для ESP8266 позволяет писать скетчи и загружать их одним кликом в ESP8266 в знакомой среде  Arduino IDE. Рассмотрим установку Arduino IDE для ESP8266.
Сначала необходимо установить Arduino IDE с официального сайта версии не ниже 1.6.5. Запускаем Arduino IDE. Выбираем пункт Файл - Настройки и в поле Additional Boards Manager URLs вводим http://arduino.esp8266.com/stable/package_esp8266com_index.json. Нажимаем OK (см. рис. 3.7).
 


Риc 3.7. Ввод адреса для скачивания Arduino IDE для ESP8266

Выбираем пункт Инструменты - Плата - BoardsManager и в списке ищем плату ESP8266. Выбираем этот пункт, версию и нажимаем на Install (см. рис. 3.8, 3.9, 3.10).

 


 

 
Риc 3.8-3.10. Загрузка Arduino IDE для ESP8266

После загрузки программного обеспечения в списке плат (Инструменты - Плата -) появятся платы ESP8266 (см. рис. 3.11).

 

Риc 3.11 Выбор платы ESP8266

 
Читать далее

● 4.1. Подключение датчика влажности и температуры DHT11 (DHT22)

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

4. Подключение датчиков

Датчики являются основой любого "умного" дома. Независимо от индивидуальных требований и перечня задач, которые должна решать система в целом, именно датчики обеспечивают необходимую степень автоматизации и передают другим устройствам сигнал о необходимости включения или выключения в определенный момент. Правильный выбор данных приборов становится основой работоспособности и функциональности "умного" дома. В набор " ИНТЕРНЕТ ВЕЩЕЙ ДЛЯ УМНОГО ДОМА" включены следующие датчики:

•    датчика температуры DS18B20;
•    датчик влажности DHT22;
•    датчик увлажненности почвы;
•    датчик воды;
•    датчик огня;
•    датчик пропана;
•    датчик движения.

В следующих главах мы рассмотрим подключение данных датчиков к контроллерам Arduino Mega и к модулю NodeMcu ESP8266, а также отправку данных с этих датчиков в сервис Blynk для возможности мониторинга данных датчиков на экране смартфона или телефона.

4.1. Подключение датчика влажности и температуры DHT11 (DHT22)

В повседневной жизни влажность выступает немаловажным параметром, от степени влажности воздуха немало зависит наше самочувствие. Особенно чувствительными к влажности являются метеозависимые люди, а также люди, страдающие гипертонической болезнью, бронхиальной астмой, заболеваниями сердечно-сосудистой системы. При высокой сухости воздуха даже здоровые люди ощущают дискомфорт, сонливость, зуд и раздражение кожных покровов. Часто сухой воздух может спровоцировать заболевания дыхательной системы, начиная с ОРЗ и ОРВИ, и заканчивая даже пневмонией.
Для измерения влажности воздуха умного дома в набор включен модуль датчика влажности и температуры DHT22 (рис. 4.1), который в отличие самого популярного датчика влажности DHT11 измеряет весь диапазон относительной влажности воздуха (0%...100%) и работает при отрицательных температурах(40~80℃).

dht22

 Рис. 4.1. Модуль датчика влажности и температуры DHT22

Плата модуля содержит основные компоненты: датчик температуры и относительной влажности DHT22 (рис. 4.2) в белом корпусе, светодиод индикации питания и вилка соединителя. Внутри DHT22 небольшая плата с компонентами: емкостным датчиком влажности, терморезистором, имеющим отрицательную характеристику и микроконтроллером.


 
Рис. 4.2. Датчик DH22

Изготовитель вносит в память МК таблицу корректировки измерений каждого экземпляра для повышения точности работы. Данные модуля передаются в цифровом виде по однопроводному интерфейсу.
Рассмотрим подключение модуля датчика влажности и температуры DHT22 к плате Arduino Mega и модулю NodeMcu ESP8266.

4.1.1. Подключение датчика DHT22 к плате Arduino Mega.

Для подключение модуля датчика влажности и температуры DHT22 к плате Arduino Mega используется однопроводной интерфейс. Питание для датчика берем также с платы Arduino. Для удобного подключения к плате Arduino Mega лучше всего использовать плату расширения MEGA Sensor Shield. Схема соединений представлена на рис. 4.3.
 
подключение dht22
Рис. 4.3. Схема подключений DHT22 к Arduino Mega

Для считывания данных датчика DTH22 с помощью Arduino, существует готовая библиотека DHT. Для её установки необходимо скопировать папку с файлами библиотеки  в директорию libraries своего Arduino IDE.
Загрузим на плату Arduino Mega скетч получения данных с датчика DHT11 и вывода в последовательный порт Arduino.  Получение данных влажности оформим в виде отдельной процедуры get_data_humidity(). Содержимое скетча представлено в листинге 4.1.
Листинг 4.1

// подключение библиотеки DTH
#include "DHT.h"
// константы
#define DHTPIN 22           // пин подключения контакта DATA
#define DHTTYPE DHT22      // датчик DHT 22 
#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
// создание экземпляра объекта DHT
DHT dht(DHTPIN, DHTTYPE);
// переменная для интервала измерений 
unsigned long millis_int1=0;

void setup() {
   Serial.begin(9600);  // запуск последовательного порта
   dht.begin();         // запуск DHT       
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DHT11
      int humidity = get_data_humidity();
      // вывод в монитор последовательного порта
      Serial.print("humidity=");
      Serial.println(humidity);
      // запуск отсчета интервала
      millis_int1=millis();
   }
}

int get_data_humidity() {
   int h = dht.readHumidity();
   return h;
}



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


Рис. 4.4. Вывод данных DHT22 в монитор последовательного порта

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

4.1.2. Подключение датчика DHT22 к модулю NodeMcu ESP8266

Теперь рассмотрим подключение датчика DHT22 к модулю NodeMcu ESP8266. Схема соединений представлена на рис. 4.5.


 
Рис. 4.5. Схема подключений DHT22 к NodeMcu ESP8266

Для считывания данных датчика DTH22 с помощью ESP8266, существует готовая библиотека DHT. Заметим, что эта библиотека именно для ESP8266, библиотека для Arduino не подходит. Содержимое скетча представлено в листинге 4.2.
Листинг 4.2

// подключение библиотеки DTH
#include "DHT.h"
// константы
#define DHTPIN 4           // пин (D2) подключения контакта DATA
#define DHTTYPE DHT22      // датчик DHT 22 
#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
// создание экземпляра объекта DHT
DHT dht(DHTPIN, DHTTYPE);
// переменная для интервала измерений 
unsigned long millis_int1=0;

void setup() {
   Serial.begin(9600);  // запуск последовательного порта
   dht.begin();         // запуск DHT       
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DHT11
      int humidity = get_data_humidity();
      // вывод в монитор последовательного порта
      Serial.print("humidity=");
      Serial.println(humidity);
      // запуск отсчета интервала
      millis_int1=millis();
   }
}

int get_data_humidity() {
   int h = dht.readHumidity();
   return h;
}



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


 
Рис. 4.6. Вывод данных DHT22 в монитор последовательного порта

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

Читать далее

● 4.2. Подключение цифровой датчика температуры DS18B20 (RI002)

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

Мечта каждого человека - обеспечить максимальный комфорт и уют в своем доме. И первый шаг на пути к цели - создание оптимальной температуры в жилище - загородном доме, даче или квартире. "Умный дом" включает в себя полноценную климатическую систему. И первый шаг на пути к этому – получение реальных данных значения температуры.
Для измерения температуры "умного" дома в набор включен датчик температуры RI002 (рис. 4.7). Это хорошо известный цифровой датчик температуры DS18B20 водонепроницаемом корпусе из нержавейки. Приемущества водонепроницаемого корпуса – возможность измерить температуру в неблагоприятной для микросхем среде: в почве, на дожде или даже в аквариуме.
ri002
Рис. 4.7. Датчик температуры RI002

Этот датчик температуры основан на популярной микросхеме DS18B20. Он позволяет определить температуру окружающей среды в диапазоне от -55°C до +125°C и получать данные в виде цифрового сигнала с 12-битным разрешением по 1-Wire протоколу. Этот протокол позволит подключить огромное количество таких датчиков, используя всего 1 цифровой порт контроллера, и всего 2 провода для всех датчиков: земли и сигнала. В этом случае применяется так называемое «паразитное питание», при котором датчик получает энергию прямо с линии сигнала. Каждый датчик имеет уникальный прошитый на производстве 64-битный код, который может использоваться микроконтроллером для общения с конкретным сенсором на общей шине.
Датчик температуры RI002 изготавливается с тремя выходными контактами (черный – GND, красный – Vdd и белый – Data).
Рассмотрим подключение модуля датчика температуры RI002 к плате Arduino Mega и модулю NodeMcu ESP8266.

4.2.1. Подключение датчика RI002 к плате Arduino Mega

Для подключение модуля датчика DS18B20 к плате Arduino Mega используется однопроводной интерфейс 1-Wire. Питание для датчика берем также с платы Arduino. 1-Wire вывод датчика необходимо подтянуть к питанию резистором номиналом 4.7 кОм. Схема соединений представлена на рис. 4.8.


Рис. 4.8. Схема подключений DS18B20 к Arduino Mega

Для считывания данных датчика DTH22 с помощью Arduino, существует готовая библиотека DHT. Для её установки необходимо скопировать папку с файлами библиотеки  в директорию libraries своего Arduino IDE.
Загрузим на плату Arduino Mega скетч получения данных с датчика температуры DS18B20 и вывода в последовательный порт Arduino.  Получение данных влажности оформим в виде отдельной процедуры get_data_ds18b20(). Содержимое скетча представлено в листинге 4.3.
Листинг 4.3

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
#define DS18B20PIN 23           // пин подключения контакта DATA
// подключение библиотеки OneWire
#include <OneWire.h>
// создание объекта OneWire
OneWire ds(DS18B20PIN);

// переменная для интервала измерений
unsigned long millis_int1=0;

void setup(void) {
   // запуск последовательного порта
   Serial.begin(9600);
}

void loop(void) {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DS18B20
      float temp = get_data_ds18b20();
      // вывод в монитор последовательного порта
      if(temp<100) {
        Serial.print("temp=");Serial.println(temp);
      }
      // старт интервала отсчета
      millis_int1=millis();
   }
}
// получение данных с датчика DS18B20
float get_data_ds18b20()  {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  int Temp;
  float fTemp=0.0;
  
  if ( !ds.search(addr)) {
    Serial.print("No more addresses.\n");
    ds.reset_search();
    return 999;
  }
  // вывод в монитор уникального адреса 1-Wire устройства
  for( i = 0; i < 8; i++)  {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.print("CRC is not valid!\n");
    return 999;
  }
  if ( addr[0] != 0x28) {
    Serial.print("Device is not a DS18S20 family device.\n");
    return 999;
  }
  ds.reset();
  ds.select(addr);
  // запустить конвертацию температуры датчиком
  ds.write(0x44,1);
  delay(750); // ждем 750 мс
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); 
  // считываем ОЗУ датчика
  for ( i = 0; i < 9; i++) { 
    data[i] = ds.read();
  }
  Temp=((data[1]<<8)+data[0]);
  // перевод в значение float
  fTemp=1.0*Temp/16+(float(Temp%16))*1.0/16;

  return fTemp;
}



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


 
Рис. 4.9. Вывод данных RI002 в монитор последовательного порта

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

4.1.2. Подключение датчика DHT22 к модулю NodeMCU ESP8266

Теперь рассмотрим подключение датчика DS18B20 к модулю NodeMcu ESP8266. 1-Wire вывод датчика необходимо подтянуть к питанию резистором номиналом 4.7 кОм. Схема соединений представлена на рис. 4.10.


 
Рис. 4.10. Схема подключений DS18B20 к NodeMcu ESP8266

Для считывания данных датчика DS18B20 с помощью ESP8266 будем использовать  библиотеку OneWire.  Библиотека OneWire должна быть адаптирована для ESP8266 (внесены изменения в OneWire.h) . Содержимое скетча представлено в листинге 4.4.
Листинг 4.4

// константы
#define DSD18B20PIN 5      // пин подключения контакта DATA (D1, GPIO5)
#define INTERVAL_GET_DATA 2000  // интервала измерений, мс

// подключение библиотеки
// http://www.pjrc.com/teensy/td_libs_OneWire.html
#include <OneWire.h>
// создание экземпляра OneWire
OneWire  ds(DSD18B20PIN); 
// переменная для интервала измерений
unsigned long millis_int1=0; 

void setup(void) {
  // запуск последовательного порта
  Serial.begin(9600);
}

void loop() {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c DS18B20
      float temp = get_data_ds18b20();
      // вывод в монитор последовательного порта
      if(temp<100) {
        Serial.print("temp=");Serial.println(temp);
      }
      // старт интервала отсчета
      millis_int1=millis();
      // старт интервала отсчета
      millis_int1=millis();
   }
}

float get_data_ds18b20(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float fTemp;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return 999;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return 999;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return 999;
  } 

  ds.reset();
  ds.select(addr);
  // запустить конвертацию температуры датчиком
  ds.write(0x44, 1);          
  delay(1000);     // ждем 750 мс
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);       
  // считываем ОЗУ датчика
  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  // перевод полученных данных в значение температуры
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; 
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  
    else if (cfg == 0x20) raw = raw & ~3; 
    else if (cfg == 0x40) raw = raw & ~1; 
  }
  fTemp = (float)raw / 16.0;

  return fTemp;
}



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


 
Рис. 4.11. Вывод данных DS18B20 в монитор последовательного порта

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


Читать далее

● 4.3. Подключаем датчик влажности почвы

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

Домашний уют — это атмосфера тепла в вашей квартире, желание возвращаться туда после трудного дня. Уют и комфорт в вашем доме оказывают непосредственное влияние на ваше самочувствие и настроение. Необходимое условие в создании уюта имеет использование комнатных цветов. Они доступны каждому из нас и при этом лучше любой мебели помогут создать уют и комфорт, и как ни что другое просто вдохнуть в ваш дом чистую энергию.
Но чтобы домашние цветы  радовали вас красотой, следует выполнять общие правила по уходу за комнатными растениями – необходимо создать благоприятный для них режим температуры воздуха, влажности и освещения.
Модуль влажности почвы (рис. 4.12) предназначен для определения влажности земли, в которую он погружен. Он позволяет узнать о недостаточном или избыточном поливе ваших домашних или садовых растений. Модуль состоит из двух частей:  контактного щупа YL-28 и датчика YL-38, щуп YL-28 соединен с датчиком YL-38 по двум проводам. Между двумя электродами щупа YL-28 создаётся небольшое напряжение. Если почва сухая, сопротивление велико и ток будет меньше. Если земля влажная — сопротивление меньше, ток — чуть больше. По итоговому аналоговому сигналу можно судить о степени влажности.
Подключение данного модуля к контроллеру позволяет автоматизировать процесс полива ваших растений (своего рода  "умный полив").


Рис. 4.12. Датчик увлажненности почвы Soil Moisture

Кроме контактов соединения с щупом,  датчик YL-38 имеет четыре контакта для подключения к контроллеру.

•    Vcc – питание датчика;
•    GND – земля;
•    A0 -  аналоговое значение;
•    D0 – цифровое значение уровня влажности.

Датчик YL-38 построен на основе компаратора LM393, который выдает напряжение на выход D0 по принципу: влажная почва – низкий логический уровень, сухая почва – высокий логический уровень. Уровень определяется пороговым значением, которое можно регулировать с помощью потенциометра. На вывод A0 подается аналоговое значение, которое можно передавать в контроллер для дальнейшей обработки, анализа и принятия решений.
Датчик YL-38 имеет два светодиода, сигнализирующих о наличие поступающего на датчик питания и уровня цифрового сигналы на выходе D0. Наличие цифрового вывода D0 и светодиода уровня D0 позволяет использовать модуль автономно, без подключения к контроллеру.
Рассмотрим подключение датчика увлажненности почвы Soil Moisture к плате Arduino Mega и модулю NodeMcu ESP8266.

4.3.1. Подключение датчика Soil Moisture к плате Arduino Mega

Подключение датчика Soil Moisture к плате Arduino Mega мы будем производить по аналоговому входу. Питание для датчика берем также с платы Arduino. Схема соединений представлена на рис. 4.13.


 
Рис. 4.13. Схема подключений датчика Soil Moisture к Arduino Mega

Загрузим на плату Arduino Mega скетч получения данных с датчика температуры DS18B20 и вывода в последовательный порт Arduino.  Получение данных влажности оформим в виде отдельной процедуры get_data_soilmoisture(). Содержимое скетча представлено в листинге 4.5.
Листинг 4.5

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
#define SOILMOISTUREPIN A8      // пин подключения контакта A0
// значение полного полива
#define MINVALUESOILMOISTURE 220
// значение критической сухости
#define MAXVALUESOILMOISTURE 900

// переменная для интервала измерений
unsigned long millis_int1=0;

void setup(void) {
   // запуск последовательного порта
   Serial.begin(9600);
}

void loop(void) {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c датчика SoilMoisture
      float  moisture= get_data_soilmoisture();
      // вывод в монитор последовательного порта
      Serial.print("soilmoisture =");Serial.println(moisture);
      Serial.println(" %");
      // старт интервала отсчета
      millis_int1=millis();
   }
}
// получение данных с датчика SoilMoisture
float get_data_soilmoisture()  {
  // получение значения с аналогового вывода датчика
  int avalue=analogRead(SOILMOISTUREPIN);
  // масштабируем значение в проценты
  avalue=constrain(avalue, MINVALUESOILMOISTURE,MAXVALUESOILMOISTURE);
  int moisture=map(avalue, MINVALUESOILMOISTURE, 
                   MAXVALUESOILMOISTURE,100,0);
  return (float)moisture;
}



Загрузим скетч на плату Arduino Mega, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика Soil Moisture (рис. 4.14). Подберите практическим путем аналоговые значения для констант MINVALUESOILMOISTURE (полный полив) и MINVALUESOILMOISTURE (критическая сухость).
 


Рис. 4.14. Вывод данных с датчика Soil Moisture в монитор последовательного порта

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

4.3.2. Расширение аналоговых входов – мультиплексор CD4051

Модуль Node Mcu  имеет один канал АЦП доступный для пользователей. Однако нам понадобится их гораздо больше. Как увеличить количество аналоговых входов? Для этого будем использовать мультиплексор CD4051 (см. рис. 4.15).

Рис. 4.15. Мультиплексор CD4051

Микросхема 4051 является 8-канальным аналоговым мультиплексор/ демультиплексором, имеющим 8 входов (y0 – y7) и 1 выход Z (см. рис. 4.16). Выбор считываемого входа осуществляется подачей цифровых сигналов на выходы s0 – s2. Т.е. для подключения к модулю Node Mcu 8 аналоговых датчиков необходимо задействовать 3 цифровых выхода модуля и 1 аналоговый вход.
 


Рис. 4.16. Контакты мультиплексора CD4051

И в листинге 4.6. представлен скетч циклического опроса 8 аналоговых датчиков, подключенных к 8 входам мультиплексора и через вход Z к аналоговому входу A0 модуля Node Mcu.
Листинг 4.6

// список пинов для подключения к s0, s1, s2 мультиплексора
// D5, D7, D8 (GPIO 14, 13, 15)
int pins[]={14, 13, 15};
// Массив двоичных числ определяющих номер выбранного входа/выхода 
// микросхемы 4051, с 1 по 8. 
int bin [] = { B000, B001, B010, B011, B100, B101, B110, B111 } ;
// служебные переменные
int row;
int r0 = 0;
int r1 = 0;     
int r2 = 0;
int  avalue =0;

void setup(void) {
   // входы подключения к мультиплексору как OUTPUT
   for(int i=0;i<3;i++) {
      pinMode(pins[i],OUTPUT);
   }
   // запуск последовательного порта
   Serial.begin(9600);
}

void loop(void) {
   for(int i=0;i<8;i++) {
      // выбор входа мультиплексора
      
      row = bin [i] ;      
      r0 = row & 0x01 ;      
      r1 = (row >> 1) & 0x01 ; // 
      r2 = (row >> 2) & 0x01 ; // 
      digitalWrite (pins[i], r0) ;      
      digitalWrite (pins[i], r1) ;      
      digitalWrite (pins[i], r2) ;      
      // получение данных c A0
      avalue= analogRead(A0);
      // вывод в монитор последовательного порта
      Serial.print("analog input =");Serial.print(i);
      Serial.println(" = "); Serial.println(avalue);
   }
   // пауза
   delay(2000);
}



4.3.3. Подключение датчика Soil Moisture к модулю NodeMcu ESP8266

Теперь рассмотрим подключение датчика Soil Moisture к модулю NodeMcu ESP8266. Датчик Soil Moisture подключаем к входу y0 мультиплексора. Для выбора аналогового входа мультиплексора используем контакты D5, D7, D8 модуля Node Mcu. Схема соединений представлена на рис. 4.17.
 


Рис. 4.17. Схема подключений датчика Soil Moisture к NodeMcu ESP8266

Загрузим на модуль Node Mcu скетч получения данных с датчика Soil Moisture и вывода в последовательный порт Arduino.  Получение данных влажности оформим в виде отдельной процедуры get_data_soilmoisture(). Для выбора аналогового входа мультиплексора y0 подаем на контакты D5, D7, D8 сигнал низкого уровня LOW. Содержимое скетча представлено в листинге 4.7.
Листинг 4.7

#define INTERVAL_GET_DATA 2000  // интервала измерений, мс
#define SOILMOISTUREPIN A0      // аналоговый вход
// значение полного полива
#define MINVALUESOILMOISTURE 220
// значение критической сухости
#define MAXVALUESOILMOISTURE 900

// переменная для интервала измерений
unsigned long millis_int1=0;

void setup(void) {
   // входы подключения к мультиплексору D5, D7, D8 (GPIO 14, 13, 15) 
   // как OUTPUT
   pinMode(14,OUTPUT);
   pinMode(13,OUTPUT);
   pinMode(15,OUTPUT);  
   // запуск последовательного порта
   Serial.begin(9600);
}

void loop(void) {
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
      // получение данных c датчика SoilMoisture
      float  moisture= get_data_soilmoisture();
      // вывод в монитор последовательного порта
      Serial.print("soilmoisture =");Serial.print(moisture);
      Serial.println(" %");
      // старт интервала отсчета
      millis_int1=millis();
   }
}
// получение данных с датчика SoilMoisture
float get_data_soilmoisture()  {
  // выбор входа мультиплексора CD4051 – y0 (000)
  digitalWrite(14,LOW);
  digitalWrite(13,LOW);
  digitalWrite(15,LOW);
  // получение значения с аналогового вывода датчика
  int avalue=analogRead(SOILMOISTUREPIN);
  Serial.print("avalue =");Serial.println(avalue);
  // масштабируем значение в проценты
  avalue=constrain(avalue, MINVALUESOILMOISTURE,MAXVALUESOILMOISTURE);
  int moisture=map(avalue, MINVALUESOILMOISTURE, 
                    MAXVALUESOILMOISTURE,100,0);
  return (float)moisture;
}



Загрузим скетч на модуль Node Mcu, откроем монитор последовательного порта и видим вывод данных, получаемых с датчика Soil Moisture (рис. 4.18). Подберите практическим путем аналоговые значения для констант MINVALUESOILMOISTURE (полный полив) и MINVALUESOILMOISTURE (критическая сухость).
 


Рис. 4.18. Вывод данных Soil Moisture в монитор последовательного порта

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


Читать далее

Главное меню

Каталог

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

Цена
от
до