Есть такой хороший датчик температуры и влажности, как AM2320. По характеристикам он почти идентичен с более известными датчиками серии DHT, но в то же время имеет возможность работы по I2C.
Сравнение аналогов
Если сравнивать датчики серии DHT и AM2320, получаем следующую картину:
| Характеристика | Датчик | ||
|---|---|---|---|
| DHT11 | DHT22 | AM2320 | |
| Диапазон температур | 0 … +50°C | -40 … +80°C | -40 … +80°C |
| Шаг измерения температуры | 1°C | 0,1°C | 0,1°C |
| Погрешность температуры | ±2°C | ±0,5°C | ±0,5°C |
| Диапазон влажности | 20 … 90% | 0 … 100% | 0 … 99,9% |
| Шаг измерения влажности | 1% | 0,1% | 0,1% |
| Погрешность влажности | ±5% | ±5% | ±3% |
| Цена | 70 руб. | 260 руб. | 190 руб. |
Цены для сравнения взяты из одного и того же магазина (какого – рекламы делать не буду). Так что выбор в пользу AM2320 был очевиден.
Достаточно непонятный момент – зачем делать такой шаг измерения, если погрешность превышает его в десятки раз? Но это вопрос скорее риторический.
Особенности работы
Важное преимущество этого датчика перед DHT – умение работать по шине I2C, но это же является причиной одного из главных недостатков. Дело в том, что работа по I2C предполагает обмен данными по запросу, при этом передаётся адрес устройства (от 0 до 127). И проблема в том, что датчики имеют один и тот же адрес, соответственно, подключить на эту шину более одного датчика будет очень сложно. Тем не менее, мне встречались упоминания о возможности.
Если у вас несколько таких датчиков, работать с ними следует как с DHT – по одному проводу. Для этого достаточно заземлить четвёртый вывод, который в режиме I2C используется для синхронизации AM2320.
Чтение данных с датчика
Мы в примере будем использовать работу по I2C. Для работы с датчиком скачаем соответствующую библиотеку, а также для поддержки I2C подключим библиотеку Wire. Поскольку нашей целью является работы с датчиком, а не с дисплеем, вместо отображения будем отправлять данные в последовательный порт, а смотреть их при помощи монитора порта в среде разработки.
Выводы датчика подключаем следующим образом:
- 1 – к выводу +5В.
- 2 – к выводу SDA (A4 для Arudino Uno);
- 3 – к выводу 0В.
- 4 – к выводу SCL (A5 для Arudino Uno).
И получаем следующую конструкцию:

Стоит отметить, что функция чтения информации с датчика передаёт код завершения операции, по которому можно судить об отсутствии ошибок. Скетч для работы с датчиком будет достаточно простой, поэтому весь код будет приведён здесь, а файла для скачивания не будет.
#include <Wire.h>
#include <AM2320.h>
AM2320 th;
void setup() {
Serial.begin(9600);
}
void loop() {
switch(th.Read()) {
case 0:
Serial.print("T: ");
Serial.print(th.t);
Serial.print(", H: ");
Serial.println(th.h);
break;
case 1:
Serial.println("Sensor is offline!");
break;
case 2:
Serial.println("Data CRC error!");
break;
default:
Serial.println("Something impossible...");
}
delay(1000);
}
После запуска приложения открываем монитор порта и наблюдаем передачу данных с датчика.

Комментарии: