How to use dht11 and dht22 sensors with arduino
Содержание:
- 2Работа с цифровым акселерометром ADXL345 по интерфейсу SPI
- Installing DHT11/DHT22 Library in Arduino IDE
- DHT11/DHT22 troubleshooting guide
- Описание методов библиотеки DHT12.zip
- Характеристики датчиков
- Пример работы
- Принцип работы датчика
- Способ 2: чтение датчика DS18B20 по адресу
- Introducing the DHT11 and DHT22 Sensors
- Troubleshooting – Failed to read from DHT sensor
- Динамическая загрузка данных датчика с помощью AJAX
- Подключение DHT12 к Arduino и вывод на LCD1602
- Код Arduino. Вывод значений на монитор последовательного порта
2Работа с цифровым акселерометром ADXL345 по интерфейсу SPI
Акселерометр ADXL345 поддерживает 3- и 4-проводные варианты интерфейса SPI. Мы рассмотрим только 4-проводное подключение. Кроме того, акселерометр работает в режиме 3 интерфейса SPI (помните, мы уже обсуждали: CPOL=1, CPHA=1). Диаграмма, показывающая обмен с акселерометром ADXL345 по 4-проводному интерфейсу SPI:
Работа с ADXL345 по SPI
Здесь бит MB – это признак того, что мы собираемся читать много байтов за раз (если бит установлен в 1). Для тестирования работы с SPI устройствами и быстрого освоения порядка обмена с ними я обычно использую отладочную плату с микросхемой FT2232H. Эта микросхема поддерживает множество режимов, в том числе I2C и SPI. Управление работой микросхемы FT2232H – с помощью программы SPI via FTDI, о которой я уже неоднократно рассказывал.
Подключим акселерометр к отладочной плате и прочитаем регистр DEVID, в котором хранится постоянное значение-идентификатор акселерометра ADXL345. Значение идентификатора должно быть 0xE5.
ADXL345 соединён с отладочной платой на FT2232H
Не забудем перед чтением записать команду 0x80, которая укажет акселерометру, что мы собираемся читать, начиная с регистра по адресу 0x0 (см. диаграмму выше, рисунок 38 – SPI 4-Wire Read):
Чтение регистра ID акселерометра ADXL345 по SPI
Видно, что в регистре содержится число 0xE5, которое и является значением идентификатора акселерометра ADXL345, согласно техническому описанию (datasheet). Вот как это выглядит на временной диаграмме:
Временная диаграмма чтения регистра ID акселерометра ADXL345 по SPI
Устройство отвечает, всё нормально. Теперь нам нужно перевести акселерометр в режим измерений. Для этого необходимо записать в регистр POWER_CTL (адрес регистра 0x2D) число 0x08 (установить бит Measure в HIGH). После этого можно начинать читать регистры с 0x32 по 0x37, в которых хранятся данные об ускорениях по трём осям. Сделаем это с помощью Arduino. Напишем такой скетч:
Скетч для чтения данных ADXL345 по SPI (разворачивается)
#include <SPI.h> const byte READ = 0x80; // бит маркер чтения const byte MB = 0x40; // бит MB (многобайтовая передача) const int CS = 10; // пин выбора ведомого void setup() { Serial.begin(115200); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV32); // делитель частоты 500 кГц SPI.setDataMode(SPI_MODE3); // задаём 3-ий режим SPI byte id; readRegister(0x00, 1, id); // читаем регистр DEVID Serial.print("ID = "); Serial.println(id, HEX); writeRegister(0x2D, 0x08); // переводим ADXL345 в режим измерения } void loop() { byte buff; readRegister(0x32, 6, buff); // читаем значения по осям X, Y, Z int x = ((int)buff } // записывает значение в регистр void writeRegister(byte reg, byte value) { digitalWrite(CS, LOW); SPI.transfer(reg); SPI.transfer(value); digitalWrite(CS, HIGH); } // читает из регистра заданное число байтов void readRegister(byte reg, int bytesToRead, byte *outBuff) { digitalWrite(CS, LOW); reg = reg | READ; // покажем акселерометру, что хотим из него читать if (bytesToRead > 1) { reg = reg | MB; // и читать хотим много байтов } SPI.transfer(reg); // записываем адрес регистра, с которого начинаем чтение for (int i=0; i}
Вот так выглядит временная диаграмма работы этого скетча:
Временная диаграмма чтения значений по осям X, Y, Z акселерометра ADXL345
Ясно, почему первый байт передачи от Arduino при чтении значений ускорений по осям – число 0xF2? Это адрес первого регистра, с которого начинаем чтение (0x32), объединённый по ИЛИ с 0x80 – маркером чтения READ – и с 0x40 – маркером многобайтовой передачи MB: 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2
Что означают считанные значения? Этот вопрос рассматривается в последнем разделе статьи. Кроме того, существует ряд библиотек для Arduino, которые упрощают настройку и чтение данных с акселерометра, позволяя не думать о таких низкоуровневых вещах как регистры, биты и байты. Ссылки на библиотеки также приведены в конце статьи.
Installing DHT11/DHT22 Library in Arduino IDE
Both DHT11 and DHT22 provide the output of temperature and humidity in the complex digital output format which can not be directly read with GPIO pins without writing any technique which can read these output signals. These sensors provide data through a single wire two-way communication protocol. A single process communication consists of 40 bits. But we do not need to worry about the working of these sensors and on which protocol we can receive this data. We have an Arduino library for DHT sensors which can be easily used to get values of temperature and humidity only by calling two lines of functions. We will see later on how to do it. Now let’s see how to install the DHT library in Arduino. This library is provided by Adafruit. Follow these steps to install the DHT sensor library:
Go to Sketch menu>> include file and click on manage libraries option.
When you click on the manage libraries option, you will get this window. In this window write ‘DHT sensor‘ in the search bar and press enter.
You will see many options available for DHT11 and DHT22 libraries. Select Adafruit library and click on the install button. You can select the latest version from the version window.
The same library can be used for both DHT11 and DHT22/AM2302 sensors. After that, you will see the message of library correctly installed.
Now click on the close button. This library is now successfully included in the library manager of Arduino IDE. This is a very powerful library. Because we can use the same library for different types of microcontrollers like Arduino and STM32 microcontrollers.
Adafruit also provides libraries for other sensors. So they provided a support package which is used to handle all sensor libraries. We also need to install the Adafruit Unified Sensor library. To install this, paste the Adafruit Unified Sensor search bar and select this option and click on install button.
You may like to check other tutorials which used this sensor:
- DHT11 interfacing with Arduino Uno
- DHT11 interfacing with pic microcontroller
DHT11/DHT22 troubleshooting guide
When working with these sensors, you might get the following error messages:
“Failed to read from DHT sensor!”
This message can appear in the serial monitor when the sensor does not return a reading. This can have several causes:
- Sensor type: Make sure you have uncommented the correct DHTTYPE in the code setup. Check the example above.
- Sampling rate: The DHT sensors are quite slow, the maximum sampling rate is around 2 seconds. Increasing the delay between measurements might solve this error.
- Power: Although the DHTxx sensors can work from 3.3 to 5 V, the manufacturer recommends 5 V. In some cases, powering the sensor with 5 V solves the problem. Make sure that your microcontroller also supports 5 V on the GPIO pins.
Fatal error: Adafruit_Sensor.h: No such file or directory
You might get this error when you try to compile the code. This means that you did not (properly) install the Adafruit Unified Sensor library.
Just scroll up a bit in this post and you will see where and how you can download and install the library.
Описание методов библиотеки DHT12.zip
begin(uint8_t, uint8_t)
Инициализация DHT12 на ESP8266
void begin(uint8_t sda, uint8_t scl);
1 | voidbegin(uint8_tsda,uint8_tscl); |
begin()
Инициализация DHT12
void begin();
1 | voidbegin(); |
read()
Читает, преобразовывает и сохраняет данные с DHT12. Возвращает статус , если всё прошло нормально или , , в случае ошибки.
int8_t read();
1 | int8_tread(); |
getHumidity()
Возвращает относительную влажность. Данные обновляются при вызове метода .
float getHumidity();
1 | floatgetHumidity(); |
getTemperature()
Возвращает температуру. Данные обновляются при вызове метода .
float getTemperature();
1 | floatgetTemperature(); |
Характеристики датчиков
Остановимся на основных характеристиках обоих датчиков.
DHT11
- Питание от 3 до 5В.
- Максимально потребляемый ток – 2.5мА при преобразовании (при запросе данных).
- Рассчитан на измерение уровня влажности в диапазоне от 20% до 80%. При этом точность измерений находится в диапазоне 5%.
- Измеряет температуру в диапазоне от 0 до 50 градусов с точностью плюс-минус 2%.
- Частота измерений не более 1 Гц (одно измерение в секунду).
- Размер корпуса: 15.5 мм x 12 мм x 5.5 мм.
- 4 коннектора. Расстояние между соседними – 0.1″.
DHT22
- Питание от 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″.
DHT22 более точный и имеет больший диапазон измеряемых значений.
Как видите, DHT22 более точный и имеет больший диапазон измеряемых значений, но стоит немного дороже DHT11. Оба датчика имеют по одному цифровому выходу. Запросы к ним можно отправлять не чаще чем один в секунду или две.
Пример работы
Итак, с теоретической основой закончили, можно приступать к соединению датчика температуры и Arduino. Схема подключения:
Естественно, речь идет об использовании сенсора в воздушной среде. В том случае, если требуется измерять нагрев жидкости, то нужен герметичный датчик температуры DS18B20.
Алгоритм обработки
Сама последовательность действий достаточно проста. Только для упрощения, в приведенном примере, она рассчитана на наличие единственного сенсора на линии 1-Wire.
- Определить ИД датчика термостата
- Отправить команду по ИД на измерение температуры
- Ждать 750 мс, пока устройство отработает и поместит данные в оперативную память
- Дать функциональную команду на чтение памяти датчика температуры ds18b20
Сам скетч для Arduino
Здесь требуется примечание. Существует множество библиотек работы с 1-Wire выполняющих подключение датчика температуры DS18B20 к Arduino. В представленном скетче, будет использоваться вариант «OneWire», которую можно скачать с официальной страницы разработчиков ПО Arduino (https://playground.arduino.cc/Learning/OneWire). Там же, есть информация для ознакомления со списком функций в библиотеке.
Есть нюанс в приведенном скетче, он относится к физической схеме подключения питания датчика и соответствующим взаимодействием процедур библиотеки. Если используется паразитное, то DataSerial.Write(0х44), о запросе температуры, нужно заменить на DataSerial.Write(0x44, 1).
Что касается конечных пользователей, то пользуясь этой инструкцией, им будет несложно выполнить подключение инфракрасного датчика ds18b20 температуры для Ардуино. Все достаточно прозрачно, скетч элементарен, а простота схемы достойна уважения.
Принцип работы датчика
DHT22 (AM2302) использует упрощенную технологию единой шины для связи, в которой для обмена и управления данными в системе применяется только одна линия данных. В приложениях обычно требуется внешний подтягивающий резистор, около 5,1 кОм. Когда шина свободна, ее статус переключится на HIGH. SDA используется для передачи данных и синхронизации между микропроцессором и AM2302. Он принимает формат данных с одной шиной, 40 бит данных в одной передаче, старший бит первым. Соответствующая временная диаграмма показана ниже.
Название | Данные по одной шине и формат сигнала |
Start signal (Стартовый сигнал ) | Микропроцессор устанавливает SDA на LOW на период времени (не менее 800 мкс), чтобы информировать датчик для подготовки данных. |
Response signal (Ответный сигнал) | Датчик устанавливает SDA на LOW на 80 мкс, а затем на HIGH на 80 мкс, чтобы ответить на сигнал запуска. |
Data format (Формат данных) | После получения сигнала запуска датчик считывает строку данных (40 бит) через SDA, старший бит выводится сначала. |
Humidity (Влажность) | Разрешение по влажности 16 бит, старший бит первым; Значение, считываемое датчиком, в 10 раз превышает фактическую влажность. |
Temp. (Температура) | Разрешение по температуре составляет 16 бит, старший бит первый; Значение, считываемое датчиком, в 10 раз превышает фактическую температуру. Когда MSB (бит 15) равен «1», это указывает на отрицательную температуру; Когда MSB (бит 15) равен «0», это указывает на положительную температуру; Другие биты (бит 14 ~ бит 0) указывают на обнаруженное значение температуры. |
Parity bit (Бит четности) | Бит четности = влажность высокая + влажность низкая + температура высокая + температура низкая |
Способ 2: чтение датчика DS18B20 по адресу
Мы знаем, что каждому DS18B20 назначен уникальный 64-битный адрес, чтобы отличать их друг от друга. В этом методе мы найдем этот адрес для соответствующей маркировки каждого датчика. Затем этот адрес можно использовать для считывания каждого датчика в отдельности.
Поиск адресов датчиков DS18B20s на шине
Следующий скетч обнаруживает все DS18B20, присутствующие на шине, и печатает их адреса на 1-Wire в монитор последовательного порта.
Вы можете подключать только один датчик за раз, чтобы определить его адрес (или последовательно добавлять по одному новому датчику, чтобы вы могли идентифицировать каждый из них по его адресу). Затем вы можете пометить каждый датчик.
Теперь откройте монитор последовательного порта. Вы должны получить что-то подобное:
Рисунок 6 – Нахождение адресов 1-Wire всех датчиков DS18B20 на шине
Скопируйте все адреса, так как они нам понадобятся в следующем скетче.
Чтение показаний датчиков DS18B20 по адресу
Следующий скетч считывает температуру датчиков DS18B20 по их адресам. Прежде чем приступить к загрузке скетча, вам нужно изменить адреса датчиков DS18B20 на те, которые вы определили в предыдущем скетче.
Вывод вышеприведенного эскиза выглядит так
Рисунок 7 – Вывод показаний нескольких датчиков DS18B20 методом адреса
Объяснение кода
Как обычно, скетч начинается с включения библиотек, объявления вывода, к которому подключена шина датчиков, и создания объекта библиотеки .
Далее мы вводим адреса, которые были найдены ранее для каждого датчика температуры. В нашем случае имеем следующее.
Во фрагменте настройки мы инициализируем библиотеку путем вызова функции и инициализируем последовательную связь с ПК.
В цикле мы просто посылаем команду всем датчикам для преобразования температуры, используя функцию .
Затем, чтобы напечатать температуру датчика, мы вызываем пользовательскую функцию , для которой передается в качестве параметра.
Вышеприведенная функция просто вызывает библиотечные функции для отображения температуры в градусах Цельсия и для отображения температуры в градусах Фаренгейта.
Introducing the DHT11 and DHT22 Sensors
The DHT11 and DHT22 sensors are used to measure temperature and relative humidity. These are very popular among makers and electronics hobbyists.
These sensors contain a chip that does analog to digital conversion and spit out a digital signal with the temperature and humidity. This makes them very easy to use with any microcontroller.
DHT11 vs DHT22
The DHT11 and DHT22 are very similar, but differ in their specifications. The following table compares some of the most important specifications of the DHT11 and DHT22 temperature and humidity sensors. For a more in-depth analysis of these sensors, please check the sensors’ datasheet.
Temperature range | 0 to 50 ºC +/-2 ºC | -40 to 80 ºC +/-0.5ºC |
Humidity range | 20 to 90% +/-5% | 0 to 100% +/-2% |
Resolution | Humidity: 1%Temperature: 1ºC | Humidity: 0.1%Temperature: 0.1ºC |
Operating voltage | 3 – 5.5 V DC | 3 – 6 V DC |
Current supply | 0.5 – 2.5 mA | 1 – 1.5 mA |
Sampling period | 1 second | 2 seconds |
Price | $1 to $5 | $4 to $10 |
Where to buy | Check prices | Check prices |
The DHT22 sensor has a better resolution and a wider temperature and humidity measurement range. However, it is a bit more expensive, and you can only request readings with 2 seconds interval.
The DHT11 has a smaller range and it’s less accurate. However, you can request sensor readings every second. It’s also a bit cheaper.
Despite their differences, they work in a similar way, and you can use the same code to read temperature and humidity. You just need to select in the code the sensor type you’re using.
Troubleshooting – Failed to read from DHT sensor
If you’re trying to read the temperature and humidity from the DHT11/DHT22 sensor and you get an error message in your Serial Monitor, follow the next steps to see if you can make your sensor work (or read our dedicated DHT Troubleshooting Guide).
“Failed to read from DHT sensor!” or Nan readings
If your DHT sensor returns the error message “Failed to read from DHT sensor!” or the DHT readings return “Nan”:
Try one of the following troubleshooting tips:
- Wiring: when you’re building an electronics project, you need to double-check the wiring or pin assignment. After checking and testing that your circuit is properly connected, if it still doesn’t work, continue reading the next troubleshooting tips.
- Power: the DHT sensor has an operating range of 3V to 5.5V (DHT11) or 3V to 6V (DHT22). If you’re powering the sensor from the ESP32 3.3V pin, in some cases powering the DHT with 5V solves the problem.
- Bad USB port or USB cable: sometimes powering the ESP32 directly from a PC USB port is not enough. Try to plug it to a USB hub powered by an external power source. It might also help replacing the USB cable with a better or shorter one. Having a USB port that supplies enough power or using a good USB cable often fixes this problem.
- Power source: as mentioned in the previous tip, your ESP might not be supplying enough power to properly read from the DHT sensor. In some cases, you might need to power the ESP with a power source that provides more current.
- Sensor type: double-check that you’ve uncommented/commented in your code the right sensor for your project. In this project, we were using the DHT22:
- Sampling rate: the DHT sensor is very slow getting the readings (the sensor readings may take up to 2 seconds). In some cases, increasing the time between readings solves the problem.
- DHT sensor is fried or broken: unfortunately, these cheap sensors sometimes look totally fine, but they are fried/broken. So, even though you assembled the right circuit and code, it will still fail to get the readings. Try to use a different sensor to see if it fixes your problem.
- Wrong baud rate or failed to upload code: if you don’t see anything in your Arduino IDE Serial Monitor double-check that you’ve selected the right baud rate, COM port or that you’ve uploaded the code successfully.
While building our projects, we’ve experienced similar issues with the DHT and it was always solved by following one of the methods described earlier.
Fatal error: Adafruit_Sensor.h: No such file or directory
There’s also a common error that happens when you try to compile the code. If you receive the following error:
You need to install the Adafruit Unified Sensor driver library. In your Arduino IDE, type in the search box “Adafruit Unified Sensor“, scroll all the way down to find the library and install it.
After installing the library, restart your Arduino IDE and the code should compile without the error message.
Динамическая загрузка данных датчика с помощью 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 запрос инициируется с помощью функций и .
Подключение 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