Описание датчиков dht11 и dht22
Содержание:
- Схема подключения DHT12 к Arduino
- Описание датчика DS18B20 для Arduino
- Комплект подключения
- Для этого нам понадобится:
- Подключение к Orange Pi
- Модуль датчика температуры KY-028
- Подключение AM2301
- Динамическая загрузка данных датчика с помощью AJAX
- Подключение датчика температуры и влажности DHT11 к Ардуино
- Создание веб-сервера NodeMCU ESP8266 с использованием режима WiFi Station (STA)
- Подключение датчиков DHT к Arduino
- Добавление дисплея
- Подключаем датчик влажности почвы к Arduino UNO
- Программирование Arduino
- Код Arduino. Использование DHT11 и DHT22/AM2302 с LCD дисплеем
- Модуль датчика температуры KY-013
- Подключение DHT12 к Arduino и вывод на LCD1602
- Код Arduino. Вывод значений на монитор последовательного порта
Схема подключения DHT12 к Arduino
Подключается датчик температуры и влажности DHT12 к Arduino достаточно просто. Схема подключения показана на рисунке.
Не нужно забывать про подтягивающие резисторы на 10кОм на линии SDA и SCL.
Arduino | DHT12 |
---|---|
VCC | VCC |
A4 | SDA |
GND | GND |
A5 | SCL |
Пример скетча
В приведенном ниже скетче мы будем измерять и отсылать данные о состоянии температуры и влажности на компьютер через последовательный порт.
/*
Добавляем необходимые библиотеки
*/
#include <DHT12.h>
/*
Создаём экземпляр класса DHT12
*/
DHT12 dht12;
void setup() {
/*
Инициализируем DHT12
*/
dht12.begin();
Serial.begin(9600);
delay(2000);
}
void loop() {
/*
Читаем данные с DHT12 и получаем статус
*/
int status = dht12.read();
switch (status) {
case DHT12_OK:
/*
Выводим данные в терминал
*/
Serial.println(F(«Status : OK»));
Serial.print(F(«T = «));
Serial.print(dht12.getTemperature());
Serial.println(F(«*C»));
Serial.print(F(«H = «));
Serial.print(dht12.getHumidity());
Serial.println(F(» %»));
break;
case DHT12_ERROR_CHECKSUM:
Serial.print(F(«Checksum error»));
break;
case DHT12_ERROR_CONNECT:
Serial.print(F(«Connect error»));
break;
case DHT12_MISSING_BYTES:
Serial.print(F(«Missing bytes»));
break;
default:
Serial.print(F(«Unknown error»));
break;
}
delay(2000);
}
1 |
/* DHT12dht12; voidsetup(){ /* Инициализируем DHT12 dht12.begin(); Serial.begin(9600); delay(2000); } voidloop(){ /* Читаем данные с DHT12 и получаем статус intstatus=dht12.read(); switch(status){ caseDHT12_OK /* Выводим данные в терминал Serial.println(F(«Status : OK»)); Serial.print(F(«T = «)); Serial.print(dht12.getTemperature()); Serial.println(F(«*C»)); Serial.print(F(«H = «)); Serial.print(dht12.getHumidity()); Serial.println(F(» %»)); break; caseDHT12_ERROR_CHECKSUM Serial.print(F(«Checksum error»)); break; caseDHT12_ERROR_CONNECT Serial.print(F(«Connect error»)); break; caseDHT12_MISSING_BYTES Serial.print(F(«Missing bytes»)); break; default Serial.print(F(«Unknown error»)); break; } delay(2000); } |
Описание датчика DS18B20 для Arduino
Микросхема имеет три выхода, из которых для данных используется только один, два остальных – это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.
Особенности цифрового датчика DS18B20
Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
Датчик питается напряжением от 3,3В до 5В.
Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
Присутствует функция тревожного сигнала.
Каждое устройство обладает своим уникальным серийным кодом.
Не требуются дополнительные внешние элементы.
Можно подключить сразу до 127 датчиков к одной линии связи.
Информация передается по протоколу 1-Wire.
Для присоединения к микроконтроллеру нужны только 3 провода.
Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода
Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.
Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM. В последнюю записываются регистры конфигурации и регистры TH, TL, которые могут использоваться как регистры общего назначения, если не используются для указания диапазона допустимых значений температуры.
Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности – 9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.
Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя. Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние. Такой метод не допустим при питании от паразитной емкости, так как на шине постоянно должен сохраняться высокий уровень сигнала.
Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.
Комплект подключения
Для подключения можно использовать микроконтроллер Arduino UNO, компактную плату NANO или MEGA – для больших решений. Комплект подключения №1 следующий:
- Плата Arduino UNO.
- Датчик
- Резистор 4,7 кОм.
- Беспечная макетная плата.
- Проводники для соединения элементов.
Комплект подключения №2:
- Плата Ардуино Уно, можно нано.
- Модуль
- Проводники со штекерами для Arduino.
Комплект подключения №3:
- Плата Ардуино Уно.
- Модуль
- LCD-дисплей.
- Проводники со штекерами для Arduino.
- Переходник для питания 2 в 1.
Последний комплект сможет не только замерить, но и вывести данные на экран без подключения к компьютеру. То есть, работать автономно.
Для этого нам понадобится:
Ссылочка на датчик DHT22: http://ali.ski/PW4AU9
Ссылочка на Arduino nano: http://ali.ski/rHRbY
Cсылочка на макетную плату: http://ali.ski/rq8wz8
Ссылочка на контактные провода: http://ali.ski/Exjr3
Ссылочка на диоды и резисторы: http://fas.st/KK7DwjyF
DHT 22 - это датчик температур и влажности. Его характеристики: - Питание от 3 до 5В. - Максимально потребляемый ток - 2.5мА при преобразовании (при запросе данных). - Рассчитан на измерение уровня влажности в диапазоне от 0% до 100%. При этом точность измерений находится в диапазоне 2%-5%. - Измеряет температуру в диапазоне от -40 до 125 градусов с точностью плюс-минус 0.5 градусов по Цельсию. - Частота измерений до 0.5 Гц (одно измерение за 2 секунды). - Размер корпуса: 15.1 мм x 25 мм x 7.7 мм. - 4 коннектора. Расстояние между соседними - 0.1". Программный код приведенный ниже взят из стандартной библиотеки Arduino IDE которую можно скачать через саму программу Arduino IDE Сам датчик подключен к 2 пину ардуино. В видео в конце статьи можно будет увидеть схему подключения. Необходимо скопировать программный код приведенный ниже и вставить его в программу Arduino IDE и загрузить этот программный код в саму плату Arduino.
// Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); }
Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.
Подключение к Orange Pi
Для подключения будем использовать контакты GPIO. Orange Pi имеет 40 контактов GPIO. Можно использовать контакты GPIO для связи и передачи питания на светодиоды, датчики, двигатели и даже другие микроконтроллеры, такие как Arduino. Расположение выводов для Orange Pi, более подробно описано здесь .
Прежде всего, отключим питание Orange Pi при подключении датчиков. С помощью соединительных проводов соединим следующие контакты (датчик с пи):
- DOUT к PIN 7 (GPCLK)
- GND к PIN 6 (GND)
- VCC к PIN 1 (VCC-3.3V)
Схема подключения DHT к Orange Pi
Настроив аппаратное обеспечение, нам нужно настроить программную часть.
Модуль датчика температуры KY-028
Датчик применяется для контроля температуры воздуха в помещении: регулятор температуры, автоматика систем отопления, автоматизация систем вентиляции.
Датчик грубо оценивает величину температуры, но умеет точно определять превышение порогового значения.
Технические характеристики
- Напряжение питания: 3,3 – 5,5 В
- Рабочая температура: 0 – 70°C
У датчика имеется два вывода: аналоговый и цифровой. Аналоговый позволяет получить температуру, цифровой — превышение установленного порога.
Основной элемент датчика – терморезистор, который соединён со входом микросхемы компаратора LM393YD. С помощью подстроечного резистора выполняется настройка порога срабатывания компаратора. Так устанавливается температурный порог. При превышении температурой установленного порога на цифровом выходе D0 будет высокий уровень напряжения. Если температура мала, то на выходе D0 низкий уровень.
Датчик содержит два светодиодных индикатора. Индикатор L1 сообщает о подаче питания. Светодиод L2 включается при превышении температурой окружающего воздуха установленного порога. С его помощью удобно проводить настройку модуля.
При включении на выходе A0 присутствует напряжение соответствующее температуре в комнате. Эта температура известна лишь приблизительно. Для повышения точности можно использовать температуру тела (сожмите терморезистор пальцами), в этом случае мы узнаем напряжение аналогового выхода при температуре 36,6°C. На эти данные можно опираться в дальнейшем. Другой вариант — температура таяния льда 0°C. Используйте пакетик с таящим льдом или снегом из холодильника, чтобы получить новое значение напряжения, которому можно верить.
Подключение AM2301
Датчик AM2301 — это тот же датчик DHT21 но уже с обвязкой. Для его подключения не требуется резистор. Если вы случайно подключите его с резистором ничего страшного не произойдет, просто это лишнее. Красный провод — это «+», черный провод — это «-«. Желтый провод — это сигнал, он подключается к цифровому порту Arduino.
Взято с сайта www.elecrow.com
Купить AM2301 можно тут.
Troubleshooting.
Error messages:
error: dht.h: No such file or directory
error: ‘DHT’ does not name a type
Solution: Not enough rights to library files. It is necessary to run the application arduino.exe as an administrator. Right-click on the shortcut arduino.exe and select «Run as administrator».
Динамическая загрузка данных датчика с помощью AJAX
Если ваша веб-страница много весит, то полное ее обновление не слишком практично. Лучше использовать асинхронный Javascript и Xml (AJAX), чтобы мы могли запрашивать данные с сервера асинхронно (в фоновом режиме), не обновляя страницу.
Для выполнения AJAX на веб-страницах в JavaScript обычно используется объект . Он тихо выполняет GET запрос на сервер и обновляет элемент на странице. AJAX – это не новая технология или другой язык, а просто существующие технологии, используемые по-новому. Кроме того, AJAX также позволяет:
- запрашивать данные с сервера после загрузки страницы;
- получать данные с сервера после загрузки страницы;
- отправлять данные на сервер в фоновом режиме.
Ниже приведен скрипт AJAX, который мы будем использовать. Поместите этот скрипт непосредственно перед закрывающим тегом .
Скрипт начинается с тега , так как AJAX-скрипт – это не что иное, как javascript, и поэтому нужно писать его в теге . Чтобы данная функция вызывалась повторно, мы будем использовать функцию javascript . Она принимает два параметра: функцию для выполнения и интервал времени (в миллисекундах), через который выполнять указанную функцию.
Сердцем этого скрипта является функция . Внутри этой функции создается объект . Данный объект используется для запроса данных с веб-сервера.
Функция вызывается каждый раз, когда изменяется . Свойство хранит состояние . Возможны следующие значения:
- 0: запрос не инициализирован;
- 1: установлено подключение к серверу;
- 2: запрос получен;
- 3: обработка запроса;
- 4: запрос завершен, и ответ готов.
Свойство содержит статус объекта . Возможны следующие значения:
- 200: OK;
- 403: запрещено;
- 404: страница не найдена.
Когда равен 4, а – 200, ответ готов. Теперь обновляется содержимое элемента с webpage (, содержащей значения температуры и влажности).
Затем HTTP запрос инициируется с помощью функций и .
Подключение датчика температуры и влажности DHT11 к Ардуино
Относительная влажность
- Разрешение: 16Bit
- Повторяемость: ± 1% относительной влажности
- Точность: На 25 ℃ ± 5% относительной влажности
- Взаимозаменяемость: полностью взаимозаменяемы
- Время отклика: 1 / е (63%) из 25 ℃ 6s 1 м / с воздуха 6s
- Гистерезис:
Модернизация датчика DHT11
Существует модернизация датчика, но она обладает аналогичными характеристиками и скетч для него будет такой же, разве что подключение датчиков к Arduino будет слегка отличаться
Для начала работы нам понадобятся такие компоненты
- Любая Arduino (в нашем случае Arduino UNO)
- Датчик DHT11 в любой модернизации
- Breadboard (макетная плата)
- Соединительные провода
- Резистор на 10 кОм (для определенной модернизации)
- Питание.
- Вывод данных.
- GND (земля).
- Питание.
- Вывод данных.
- Не используется.
- GND (земля).
Рассмотрим подключение стандартного датчика DHT11
Для такого датчика потребуется резистор на 10кОм .
Приведена схема подключения .
DHT11 подключен и готов к работе. Осталось написать программу для Arduino.
Программирование
Для работы датчика на Arduino нужно скачать и установить библиотеку DHT11 .
Скачать библиотеку можно здесь .
После того, как мы скачали нужную библиотеку, ее нужно правильно установить. скачанные файлы нужно переместить по следующему пути :
Диск CProgtam FilesArduinoLibraries
После того, как мы все сделали перейдем к самой важной ступеньке, а именно к программированию. #include “DHT.h”#define DHTPIN 2 // номер пина, к которому подсоединен датчик // Инициируем датчик DHT dht(DHTPIN, DHT11); void setup() { Serial.begin(9600); dht.begin(); Serial.println(“DHTxx test!”); } void loop() { delay(2000); // Задержка 2 секунды между измерениями float h = dht.readHumidity(); //Считываем влажность float t = dht.readTemperature(); // Считываем температуру if (isnan(t) || isnan(h)) { Serial.println(“Failed to read from DHT”); } else {Serial.print(“Humidity: “);Serial.print(h);Serial.print(” % “);Serial.print(“Temperature: “); Serial.print(t);Serial.println(” *C”);}}
#include “DHT.h”#define DHTPIN 2 // номер пина, к которому подсоединен датчик // Инициируем датчик DHT dht(DHTPIN, DHT11); void setup() { Serial.begin(9600); dht.begin(); Serial.println(“DHTxx test!”); } void loop() { delay(2000); // Задержка 2 секунды между измерениями float h = dht.readHumidity(); //Считываем влажность float t = dht.readTemperature(); // Считываем температуру if (isnan(t) || isnan(h)) { Serial.println(“Failed to read from DHT”); } else {Serial.print(“Humidity: “);Serial.print(h);Serial.print(” % “);Serial.print(“Temperature: “); Serial.print(t);Serial.println(” *C”);}}
Потом загружаем скетч в нашу плату arduino и открываем монитор порта для просмотра полученных данных, открыть монитор порта можно открыть нажав ((текст))
Создание веб-сервера NodeMCU ESP8266 с использованием режима WiFi Station (STA)
Как следует из заголовка, мы собираемся настроить наш ESP8266 NodeMCU в режим Station (STA) и создать веб-сервер для обслуживания веб-страниц для любого подключенного клиента в существующей сети.
Прежде чем приступить к загрузке скетча, необходимо внести одно изменение. Вам необходимо изменить следующие две переменные с вашими сетевыми учетными данными, чтобы ESP8266 NodeMCU мог установить соединение с существующей сетью.
const char* ssid = "YourNetworkName"; // Введите SSID const char* password = "YourPassword"; //Введите пароль
Посте того как вы сделаете это, загрузите следующий скетч, и затем мы рассмотрим его более подробно.
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include "DHT.h" // Раскомментируйте одну из строк ниже для того типа DHT датчика, который вы используете! //#define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT21 // DHT 21 (AM2301) #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 /*Укажите SSID & пароль*/ const char* ssid = "YourNetworkName"; // Enter SSID here const char* password = "YourPassword"; //Enter Password here ESP8266WebServer server(80); // DHT датчик uint8_t DHTPin = D8; // Инициализация датчика DHT DHT dht(DHTPin, DHTTYPE); float Temperature; float Humidity; void setup() { Serial.begin(115200); delay(100); pinMode(DHTPin, INPUT); dht.begin(); Serial.println("Connecting to "); Serial.println(ssid); // подключаемся к локальной сети Wi-Fi WiFi.begin(ssid, password); // проверка подключения Wi-Fi while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected..!"); Serial.print("Got IP: "); Serial.println(WiFi.localIP()); server.on("/", handle_OnConnect); server.onNotFound(handle_NotFound); server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); } void handle_OnConnect() { Temperature = dht.readTemperature(); // Получает значения температуры Humidity = dht.readHumidity(); // Получает значения влажности server.send(200, "text/html", SendHTML(Temperature,Humidity)); } void handle_NotFound(){ server.send(404, "text/plain", "Not found"); } String SendHTML(float Temperaturestat,float Humiditystat){ String ptr = "<!DOCTYPE html> <html>\n"; ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n"; ptr +="<title>ESP8266 Weather Report</title>\n"; ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n"; ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n"; ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n"; ptr +="</style>\n"; ptr +="</head>\n"; ptr +="<body>\n"; ptr +="<div id=\"webpage\">\n"; ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n"; ptr +="<p>Temperature: "; ptr +=(int)Temperaturestat; ptr +="°C</p>"; ptr +="<p>Humidity: "; ptr +=(int)Humiditystat; ptr +="%</p>"; ptr +="</div>\n"; ptr +="</body>\n"; ptr +="</html>\n"; return ptr; }
Подключение датчиков DHT к Arduino
Ссылки для заказа электронного оборудования, которое использовалось в примере ниже из Китая
Подключаются датчики легко. Так как у них достаточно длинные коннекторы 0.1″, можно устанавливать их непосредственно на макетную или монтажную плату (смотрите на рисунке ниже).
Непосредственное подключение к Arduino тоже простое. На сенсоре 4 коннектора:
- Питание (VCC) — от 3 до 5 В.
- Вывод данных.
- Не подключается.
- Земля.
Коннектор 3 просто игнорируйте, он не подключается. Желательно подключить подтягивающий резистор на 10 кОм между питанием и сигналом. На Arduino есть встроенные резисторы, но их номинал 100кОм нам не подойдет.
На рисунке ниже приведена схема подключения DHT11 к Arduino. Подключите сигнал с датчика к пину 2, чтобы схема соответствовала примеру скетча, который приведен ниже. Этот пин можно изменить с соответствующими правками в коде.
Добавление дисплея
Теперь, когда у нас есть устройство ввода, нам необходима возможность отображать настройки радиоприемника. Я не смог придумать ничего лучше, чем использовать дисплей от старых мобильных телефонов Nokia 5110/3310.
Дисплей Nokia 5110/3310
При работе с этим дисплеем необходимо учитывать два важных момента. Во-первых, существует несколько разновидностей этих дисплеев, и у них могут быть разные распиновки. Вы должны проверить распиновку на своем дисплее, убедиться, что он на самом деле работает от 3,3 В, и проверить правильность подключения к Arduino Pro Mini. Во-вторых, поскольку все входы/выходы Arduino используют напряжение 3,3 В, мне не пришлось использовать понижающие резисторы, которые вы обычно видите, когда эти дисплеи используются 5-вольтовыми платами Arduino, например, Uno.
Вывод дисплея / Назначение | Вывод Arduino или точка на схеме |
---|---|
1-RST | D3 |
2-CE | D4 |
3-DC | D5 |
4-DIN | D6 |
5-CLK | D7 |
6-VCC | Vcc (3.3v) |
7-LIGHT | GND |
8-GND | GND |
В программе я решил использовать библиотеку LCD5110_Basic, которая быстра и очень проста в использовании.
На рисунке ниже показан заполненный данными дисплей радиоприемника.
Дисплей Nokia 5110/3310 при использовании в радиоприемнике (на скриншоте некорректно показаны единицы измерения частоты mHz, в прошивке это исправлено MHz)
Начиная с левого верхнего угла, мы показываем:
- строка 1 – режим (AM/FM/SW) и номер диапазона;
- строка 2 – частотный диапазон;
- строка 3 – уровни громкости и баса/тембра;
- строка 4 – текущая частота (МГц или кГц);
- строка 1 – индикаторы стерео (только для FM) и выключения звука (если активно).
Разумеется, эта информация постоянно обновляется, чтобы показывать изменения в настройках или вводе с клавиатуры.
Подключаем датчик влажности почвы к Arduino UNO
В этой главе мы опишем пример подключения датчика влажности почвы YL-38 к Arduino UNO. Первым делом нам нужно собрать схему, которая изображена ниже.
После этого запустим Arduino IDE и наберем в скетче код, который можно загрузить по этой ссылке https://github.com/TasmanianDevilYouTube/Arduino/blob/master/Moisture_Sensor/Moisture_Sensor.ino
После набора кода загрузим его в наш Arduino UNO. Теперь откроем «Монитор порта» и увидим сообщение «Sensor is not in the Soil or DISCONNECTED», которое означает, что сенсор не подключен к почве.
Если мы подключим контактный щуп датчика к сухой почве, то мы увидим такое сообщение «Soil is DRY».
Если контактный щуп сенсора будет находиться во влажной почве, то мы увидим сообщение «Soil is HUMID» в «Мониторе порта».
Если контактный щуп сенсора будет находиться в воде, то мы увидим сообщение «Sensor in WATER» в «Мониторе порта».
Принцип работы этого скетча основан на условных операторах. Например, рассмотрим часть кода, когда в «Мониторе порта» выдается сообщение «Sensor is not in the Soil or DISCONNECTED»:
В этом коде, если значение переменной «SensorValue» меньше 1000, то с помощью команды «Serial.println» мы получаем заданное сообщение на «Монитор порта». На таком же принципе основан вывод остальных сообщений.
Программирование Arduino
Микросхема Si в этом проекте является ведомым устройство I2C, имеющим фиксированный адрес 0x11; при этом ведущим устройством (мастером) является плата Arduino. Однако скорость обмена информацией по I2C у этой микросхемы относительно медленная: максимальная поддерживаемая скорость 50 кГц. Кроме того, во время процедуры включения питания скорость не должна превышать 10 кГц. Чтобы удовлетворить эти требования, мы должны явно установить у Arduino скорость I2C, которая, как правило, слишком велика для Si4844-A10. К счастью, благодаря большому количеству документации по функциям I2C Arduino, мы можем легко выполнить необходимые изменения.
В принципе, скорость I2C для наших целей определяется в программном обеспечении Arduino двумя переменными. Эти переменные – это и . Биты 0 и 1 управляют предделителем, который работает со значением для установки скорости I2C. Скорость (тактовая частота) передачи по I2C рассчитывается по формуле:
Частота = Тактовая частота процессора / (16 + (2 * () * (предделитель))
Arduino Pro mini 3,3В работает на частоте 8 МГц. Чтобы установить скорость I2C на 10 кГц, мы используем значение 98 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 98 * 4 )) = 10 000 или 10 кГц
Чтобы установить скорость I2C на 50 кГц, мы используем значение 18 и установим предделитель в значение 4 (путем установки в 1 только бита 0 ). Таким образом,
8 000 000 / (16 + (2 * 18 * 4)) = 50 000 или 50 кГц
Для более подробной информации смотрите документацию библиотеки для Arduino. Суть в том, что мы можем выполнить изменение скорости I2C всего парой строк кода, что вы можете увидеть в тестовой программе.
Еще один важный момент, связанный с программирование, заключается в том, что нам в коде нужно использовать подпрограмму внешнего прерывания. Мы используем на Arduino, и, когда Si4844-A10 установит уровень на этом выводе в 1, выполнится простая функция, которая «привязана» к этому прерыванию. Всё, что делает эта функция, это изменяет значение переменной флага, которая может быть проверена и изменена в других частях программы. Si4844-A10 будет запускать прерывания (т.е. подавать уровень логической единицы на вывод INT) при определенных условиях, в основном в случае изменения сопротивления потенциометра настройки. Так Si4844-A10 сообщает Arduino, что вы повернули ручку настройки, и что необходимо обновить данные на дисплее.
Код Arduino. Использование DHT11 и DHT22/AM2302 с LCD дисплеем
Иногда может возникнуть идея, контролировать температуру и влажность в инкубаторе. Тогда для отображения условий в инкубаторе вам, вероятно, понадобится символьный LCD дисплей 16×2 вместо монитора последовательного порта. Итак, в этом примере вместе с датчиком DHT11 или DHT22/AM2302 мы подключим к Arduino LCD дисплей.
Если вы не знакомы с LCD дисплеями на 16×2 символов, взгляните на статью «Взаимодействие Arduino с символьным LCD дисплеем».
Далее нам нужно подключиться к LCD дисплею, как показано ниже.
Рисунок 9 – Подключение к Arduino символьного LCD дисплея 16×2 и DHT11Рисунок 10 – Подключение к Arduino символьного LCD дисплея 16×2 и DHT22
Следующий скетч будет выводить значения температуры и относительной влажности на символьном LCD дисплее 16×2. Он использует тот же код, за исключением того, что мы печатаем значения на LCD дисплее.
Рисунок 11 – Показания температуры и влажности на LCD дисплее
Модуль датчика температуры KY-013
Датчик является аналоговым, но использовать его нужно не для измерения конкретных температур, а для слежения за превышением пороговых значений. В модуле используется PTC-термисторы — при повышении температуры растёт и сопротивление.
При работе с датчиком пробуйте менять местами землю и питание, часто маркировка ошибочна.
В целом использовать аналоговый датчик температуры KY-013 как термометр проблематично. Больше подходит для случаев, когда нужно включить прибор при определённой температуре и выключить при другой. Сначала нужно выяснить какое напряжение подаётся на аналоговый вход при нужной вам температуре, а затем написать код на основе полученных значений.
Подключение DHT12 к Arduino и вывод на LCD1602
Чтобы сделать устройство автономным, мы будем выводить данные на ЖК дисплей, в моём случае — это LCD1602 (два ряда по 16 символов) который управляется по интерфейсу I2C (PCF8574). Для подключения данного LCD модуля требуется всего 4 линии: питания (Vcc), земля (GND), последовательная линия данных SDA (Serial Data) и последовательная линия тактирования SCL (Serial CLock). Подробнее в статье Подключение LCD1602 к Arduino по I2C (HD44780/PCF8574).
Схема подключения LCD1602 и DHT12 к Arduino
Схема подключения ЖК, DHT12 и Arduino Pro Mini выглядит следующим образом:
В данном случае можно не использовать дополнительные подтягивающие резисторы, так как они присутствуют на модуле PCF8574.
Пример скетча
В приведенном ниже скетче мы будем измерять и отсылать данные о состоянии температуры и влажности по I2C на ЖК дисплей.
/*
Добавляем необходимые библиотеки
*/
#include <DHT12.h>
#include <LiquidCrystal_I2C.h>
#define DEGREE (char)0
/*
Создаём знак градуса
..OO.
.O..O
.O..O
..OO.
…..
…..
…..
*/
uint8_t degree = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000
};
/*
Создаём экземпляр класса DHT12
*/
DHT12 dht12;
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
/*
Инициализируем DHT12
*/
dht12.begin();
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Добавляем символ градуса
*/
lcd.createChar(DEGREE, degree);
}
void loop() {
/*
Читаем данные с DHT12 и получаем статус
*/
int status = dht12.read();
lcd.clear();
switch (status) {
case DHT12_OK:
/*
Выводим данные на дисплей
*/
lcd.setCursor(0, 0);
lcd.print(F(«T = «));
lcd.print(dht12.getTemperature());
lcd.print(DEGREE);
lcd.print(F(«C»));
lcd.setCursor(0, 1);
lcd.print(F(«H = «));
lcd.print(dht12.getHumidity());
lcd.print(F(» %»));
break;
case DHT12_ERROR_CHECKSUM:
lcd.setCursor(0, 0);
lcd.print(F(«Checksum error»));
break;
case DHT12_ERROR_CONNECT:
lcd.setCursor(0, 0);
lcd.print(F(«Connect error»));
break;
case DHT12_MISSING_BYTES:
lcd.setCursor(0, 0);
lcd.print(F(«Missing bytes»));
break;
default:
lcd.setCursor(0, 0);
lcd.print(F(«Unknown error»));
break;
}
delay(2000);
}
1 |
/* uint8_tdegree8={ 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000 }; /* DHT12dht12; /* LiquidCrystal_I2Clcd(0x27,16,2); voidsetup(){ /* Инициализируем DHT12 dht12.begin(); /* Инициализируем ЖК-дисплей lcd.init(); /* Включаем подсветку дисплея lcd.backlight(); /* Добавляем символ градуса lcd.createChar(DEGREE,degree); } voidloop(){ /* Читаем данные с DHT12 и получаем статус intstatus=dht12.read(); lcd.clear(); switch(status){ caseDHT12_OK /* Выводим данные на дисплей lcd.setCursor(,); lcd.print(F(«T = «)); lcd.print(dht12.getTemperature()); lcd.print(DEGREE); lcd.print(F(«C»)); lcd.setCursor(,1); lcd.print(F(«H = «)); lcd.print(dht12.getHumidity()); lcd.print(F(» %»)); break; caseDHT12_ERROR_CHECKSUM lcd.setCursor(,); lcd.print(F(«Checksum error»)); break; caseDHT12_ERROR_CONNECT lcd.setCursor(,); lcd.print(F(«Connect error»)); break; caseDHT12_MISSING_BYTES lcd.setCursor(,); lcd.print(F(«Missing bytes»)); break; default lcd.setCursor(,); lcd.print(F(«Unknown error»)); break; } delay(2000); } |
Код Arduino. Вывод значений на монитор последовательного порта
Как обсуждалось ранее, датчики DHT11 и DHT22/AM2302 имеют собственный однопроводный протокол, используемый для передачи данных. Этот протокол требует точной синхронизации. К счастью, нам не нужно беспокоиться об этом, потому что мы собираемся использовать библиотеку DHT, которая позаботится почти обо всем.
Сначала скачайте библиотеку, посетив репозиторий на GitHub, или просто нажмите эту кнопку, чтобы скачать архив:
Чтобы установить библиотеку, откройте Arduino IDE, перейдите в «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку» и выберите только что загруженный zip-архив DHTlib.
После установки библиотеки вы можете скопировать следующий скетч в IDE Arduino. Данный скетч выводит значения температуры и относительной влажности в монитор последовательного порта. Попробуйте скетч в работе; а затем мы рассмотрим его подробнее.
Скетч начинается с включения библиотеки DHT. Затем нам нужно определить номер вывода Arduino, к которому подключен вывод данных нашего датчика, и создать объект . Так мы сможем получить доступ к специальным функциям, связанным с библиотекой.
В функции нам нужно инициировать интерфейс последовательной связи, так как для вывода результатов мы будем использовать монитор последовательного порта.
В функции мы будем использовать функцию , которая считывает данные с DHT22/AM2302. В качестве параметра она принимает номер вывода данных датчика. Если вы работаете с DHT11, вам нужно использовать функцию . Вы можете сделать это, раскомментировав вторую строку.
После расчета значений влажности и температуры мы можем получить к ним доступ:
Объект возвращает значение температуры в градусах Цельсия (°C). Его можно преобразовать в градусы Фаренгейта (°F) по простой формуле:
\[T_{^\circ F} = T_{^\circ C} \times 9/5 +32\]
В конце мы выводим значения температуры и влажности в монитор последовательного порта.
Рисунок 8 – Вывод в мониторе последовательного порта показаний датчика DHT11 или DHT22/AM2302