Dht11 vs dht22

Содержание:

Описание датчика

DHT11 имеет два измерительных прибора – емкостный датчик температуры и гигрометр. Первый замеряет температуру, второй – влажность воздуха. Чип, что находится внутри датчика, работает как АЦП и выдает цифровой сигнал, считываемый микроконтроллером, к которому он подключен.

DHT11 как и его модификация DHT22, предлагается на рынке в двух вариантах:

  1. Датчик в пластиковом корпусе с металлическими контактами в количестве 4 штучки.
  2. Модуль с датчиком на плате, содержащей дополнительно резистор подтяжки и трехконтактный штыревой разъем.

Монтаж можно проводить как с одним так и со вторым вариантом реализации компонента. Для практики монтажа новичкам и в реальных проектах Arduino, рекомендуется использовать модуль.

Датчики DHT11 и 12 похожи внешне друг на друга, но имеют отличия в характеристиках.

Метеостанция на Ардуино с блютуз

Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • Bluetooth модуль HC-05/HC-06;
  • датчик LM35 или DHT11;
  • смартфон с ОС Andrioid;
  • макетная плата;
  • провода «папа-папа», «папа-мама».

Схема блютуз метеостанции на Ардуино своими руками

В данном проекте мы представим два варианта скетча для метеостанции — с датчиком DHT11 и с датчиком температуры LM35. Приложение на смартфоне подходит к двум вариантам.  После прошивки модуля, соберите домашнюю метеостанцию, как на схеме выше и загрузите скетч. Оба скетча с приложением для смартфона и всеми необходимыми библиотеками можно скачать одним архивом здесь.

Скетч для метеостанции на Ардуино с DHT11

#include <SoftwareSerial.h>    //  подключение библиотеки SoftwareSerial.h
SoftwareSerial mySerial(2, 3); // указываем пины rx и tx соответственно

#include "DHT.h"   // подключаем библиотеку для датчика
DHT dht(8, DHT11); // сообщаем на каком порту будет датчик

String stringT = String("*");
String stringH = String("%");

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

void loop() {
  float h = dht.readHumidity();    // считываем значение температуры
  float t = dht.readTemperature(); // считываем значение влажности

  Serial.println(t + stringT);   // отправляем значение температуры на монитор
  Serial.println(h + stringH);   // отправляем значение влажности на монитор
  Serial.println("");
  mySerial.println(t + stringT); // отправляем значение температуры на телефон
  mySerial.println(h + stringH); // отправляем значение влажности на телефон

  delay(10000); // ставим задержку на 10 секунд
}

Пояснения к коду:

  1. массивы и нужны в этом скетче, чтобы приложение на телефоне считывало данные с нужным символом в соответствующей строке;
  2. блютуз модуль HC-05/06 работает на частоте 9600 бит/сек — .

Приложение для метеостанция на смартфоне Андроид

После загрузки скетча, скачайте и установите на своем телефоне приложение dht11.apk — снимки экрана размещены на картинке выше. Выполните сопряжение смартфона и блютуз модуля, согласно этой статьи — Подключение блютуз модуля и запустите приложение. Далее вам необходимо подключиться к блютуз метеостанции, нажав на кнопку «Подключиться» и дождаться обновления данных с датчика DHT11.

DHT22 vs DHT11 (difference) Specifications:

Parameter DHT11 (RHT01) DHT22 (RHT03)
Relative Humidity Range 20 ~ 90% 0 ~ 100%
Relative Humidity Accuracy: ±5%RH ±2%RH
Temperature Accuracy: ±2°C ±0.5°C
Resolution 1%RH,1°C 0.1%RH,0.1°C
Repeatability ±1% ±1%
Long Term Stability ±1% per year ±0.5% per year
Operating Temperature Range 0 ~ 50°C -40 ~ 80°C
Power Supply: 3,3V ~ 5.5V 3.3 ~5.5V
Supply Current: 0.5mA ~ 2.5mA 1 ~ 1.5mA
Idle Supply Current: 100uA ~ 150uA 40 ~ 50uA
Max sampling period(Max device update rate). 1 second 2s
Manufacturer MaxDetect Technology Co. Ltd.

The data sheet indicates it can cope with a cable length of more than 20m.
For less than 20m a 5k pull-up is recommended (most breakout boards have this
pull up resistor built-in). If you use more than a 20m cable run then the
resistor is not defined and you have to find it experimentally — for a longer
cable, resistance increases, therefore you need more current to pull up the
voltage successfully, so you you will need a smaller pull-up resistor .

Note : The AM2302 is similar to the RHT03 but has a lower max.cable
length and lower max. supply (5.5V). Check the device you have AM2302 is made
by Aosong.

Warning:The serial protocol used is strictly
Single-Master-Slave only, meaning that each DHT11 you use has
to have a dedicated processor pin and this pin must be bi-directional i.e. can
be changed from input to output on the fly.

Программа 2

Теперь будем выводить такую строку: “температура с момента запуска программы” -> “текущая температура”. Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её . При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:

#include <LiquidCrystal_I2C.h>      // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк

#include <microDS18B20.h>
MicroDS18B20<2> sensor;

float prevT;    // переменная для хранения температуры

void setup() {
  lcd.init();               // инициализация
  lcd.backlight();          // включить подсветку
  sensor.requestTemp();     // запрос температуры
  delay(1000);              // ждём
  prevT = sensor.getTemp(); // запомнили
}

void loop() {
  sensor.requestTemp(); // запрос температуры
  delay(1000);          // ждём
  
  lcd.home();           // курсор в 0,0
  lcd.print(prevT, 1);  // вывод prevT с точностью 1 знак
  lcd.write(223);       // градус
  lcd.print(' ');       // пробел
  lcd.write(126);       // стрелочка
  lcd.print(' ');       // пробел
  lcd.print(sensor.getTemp(), 1); // текущая температура
  lcd.write(223);       // градус
}

Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.

  • У нас есть функция , которая возвращает время работы программы в миллисекундах.
  • даст нам секунды, запишем в переменную .
  • Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60:
  • Чтобы получить количество минут из общего количества секунд – нужно выполнить операцию остаток от деления, опять же на 60:
  • Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие:
  • Обернём вывод времени в функцию для лучшей читаемости кода
#include <LiquidCrystal_I2C.h>      // подключаем библу
LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес, столбцов, строк

#include <microDS18B20.h>
MicroDS18B20<2> sensor;

float prevT;    // переменная для хранения температуры

void setup() {
  lcd.init();               // инициализация
  lcd.backlight();          // включить подсветку
  sensor.requestTemp();     // запрос температуры
  delay(1000);              // ждём
  prevT = sensor.getTemp(); // запомнили
}

void loop() {
  sensor.requestTemp(); // запрос температуры
  delay(1000);          // ждём
  
  lcd.home();           // курсор в 0,0
  lcd.print(prevT, 1);  // вывод prevT с точностью 1 знак
  lcd.write(223);       // градус
  lcd.print(' ');       // пробел
  lcd.write(126);       // стрелочка
  lcd.print(' ');       // пробел
  lcd.print(sensor.getTemp(), 1); // текущая температура
  lcd.write(223);       // градус
  
  printTime();          // выводим время
}

// функция вывода времени
void printTime() {
  lcd.setCursor(0, 1);          // курсор на вторую строку
  int sec = millis() / 1000;    // общее количество секунд  
  byte thisM = sec / 60;        // количество минут
  if (thisM < 10) lcd.print(0); // ведущий 0
  lcd.print(thisM);             // минуты
  lcd.print(':');               // двоеточие
  byte thisS = sec % 60;        // количество секунд
  if (thisS < 10) lcd.print(0); // ведущий 0
  lcd.print(thisS);             // секунды
}

Процесс передачи данных от датчика DHT11 к Arduino

Вначале плата Arduino подает на датчик DHT11 сигнал перепада с высокого уровня на низкий с задержкой 18 мкс чтобы запустить датчик DHT11 в работу. Затем Arduino pull-up (подтягивает ее к Vcc как показано на рисунке) линию передачи данных ждет 20-40 мкс ответа от датчика DHT11. Как только датчик DHT11 обнаруживает сигнал, запускающий его в работу (сигнал старта), он передает ответ в виде сигнала низкого уровня длительностью около 80 мкс. А затем контроллер DHT датчика pull up линию передачи данных и удерживает ее в этом состоянии около 80 мкс пока DHT модуль готовится к передаче данных.

Как только на линии передачи данных появилось напряжение низкого уровня это значит что датчик DHT11 передает ответный сигнал на Arduino. Как только этот процесс будет завершен, DHT снова «подтягивает» (pull-up) линию передачи данных на 80 мкс чтобы подготовиться к передаче данных.

Формат данных, передаваемых с DHT на Arduino, для каждого бита начинается с 50 мкс напряжения низкого уровня, а продолжительность напряжения высокого уровня после этого зависит от того какой бит передается — “0” или “1”.

Но если вы мало что поняли в этих процессах, не расстраивайтесь, потому что для Arduino написана специальная библиотека для работы с модулем DHT, которая сводит все операции с этим модулем к очень простым действиям – и вы это наглядно увидите в тексте программы, представленном в конце статьи. А вот если бы вы вместо Arduino использовали бы, к примеру, микроконтроллер AVR, то вам все описанные операции пришлось бы программировать вручную.

В рассмотренных процессах весьма важным является правильный выбор значения подтягивающего (pull up) резистора. Поскольку мы располагаем датчик DHT на расстоянии менее чем 20 метров от Arduino, то подтягивающего резистора номиналом 5 кОм будет достаточно. Если же мы будем располагать датчик DHT на расстоянии более 20 метров, то в этом случае необходимо использование соответствующего значения подтягивающего резистора.

Схема на датчике DHT11

Выбор этого средства измерения температуры/влажности обусловлен его популярностью, дешевизной и надежностью — такой набор характеристик делает датчик отличным вариантом для домашнего проекта. DHT11 состоит из:

  • определяющего влажность резистора;
  • измеряющего температуру термистора.

Информация с выходов датчика идет на контроллер, в нашем случае это Ардуино.

Сенсор имеет следующие характеристики:

  • рабочее напряжение — 3–5 В;
  • питание — от источника в 2.5 мА;
  • диапазон измерения влажности окружающей среды — 20–80% с погрешностью в 5%;
  • диапазон измеряемых температур — 0–50 °С с погрешностью в 2%;
  • частота измерений — раз в секунду;
  • габариты — 15 на 15.15 на 5.5 мм.

На корпусе имеются четыре выхода, благодаря чему можно подключать сенсор к различным измерительным приборам. В домашней схеме будут использоваться лишь три:

  • DATA;
  • VCC;
  • GND.

В продаже встречаются и датчики DHT11 по отдельности, и в составе готового модуля. Рекомендуется найти последний вариант — он удобнее

В разных модулях внешний вид и конфигурация выходов могут различаться, но принцип везде одинаков, следует лишь обращать внимание на распиновку

Методика взаимодействия

Датчик транслирует цифровой сигнал с закодированными в нем значениями влажности и температуры. Оба параметра передаются одновременно.

Связь происходит по следующему принципу:

  • микроконтроллер отправляет сенсору запрос проверки состояния;
  • DHT11 меняет битовую кодировку и отдает на Arduino результат;
  • если формат запроса-ответа согласован с обеих сторон, на управляющую плату поступает пятибайтовый отчет о влажности и температуре.

Состав отчета:

  • первые два байта — уровень температуры;
  • вторые два — влажность;
  • пятый байт — нужная для предотвращения ошибки измерений и передачи контрольная сумма.

Программная часть

Чтобы собранная метеостанция на базе Ардуино заработала, понадобится подходящий скетч.

Скетч можно скачать здесь: https://cloud.mail.ru/public/JDX7/HJ94PKwoe

Принципиальная схема

Так будет выглядеть схема сборки станции:

После сборки, прошивки и запуска на экране станет отображаться влажность и температура. Дисплей покажет:

  • тепловой индекс — HiX;
  • температуру воздуха — Т (temperature, в градусах);
  • влажность — H (Humidity, в процентах).

Используется I2C-дисплей 1602.

Недостатки

Приведенная конструкция имеет один минус — при взаимодействии с экраном цифры округляются до целых. Для домашних вычислений это некритично, но при необходимости получить более точные величины придется заменить датчик на более продвинутый DHT22. Его поддержка в скетче есть по умолчанию.

Теперь рассмотрим образец метеостанции под Ардуино на основе DHT22 и с дополнительной функцией — измерением давления.

Установка библиотеки датчиков DHT

Связь с датчиками DHT11, с датчиками DHT22/AM2302 – это сложная задача, поскольку для передачи данных они используют собственный однопроводный протокол. Этот протокол требует точной синхронизации. К счастью, нам не нужно беспокоиться об этом, потому что мы собираемся использовать библиотеку DHT от Adafruit, которая позаботится почти обо всем. Эта библиотека настолько мощна, что работает как на архитектуре Arduino, так и на архитектуре ESP.

Чтобы установить библиотеку, перейдите в меню Скетч (Sketch) → Подключить библиотеку (Include Library) → Управлять библиотеками… (Manage Libraries…). Подождите, пока менеджер библиотек загрузит индекс библиотек и обновит список установленных библиотек.

Рисунок 3 – Установка библиотеки Arduino – выбор управления библиотеками в Arduino IDE

Отфильтруйте результаты поиска, введя «DHT sensor». Должна остаться пара записей. Найдите DHT sensor library by Adafruit. Нажмите на эту запись, а затем выберите Установить (Install).

Рисунок 4 – Установка библиотеки Adafruit DHT

Библиотека датчиков DHT использует Adafruit Sensor support backend. Поэтому поищите в менеджере библиотек Adafruit Unified Sensor и установите его тоже (возможно, придется немного прокрутить).

Устройство DTH11 Ардуино: распиновка, datasheet

На занятии мы будем использовать датчик DHT11 или DHT22, смонтированный на плате. DHT11 — это цифровой датчик, состоящий из термистора и емкостного датчика влажности. Наряду с невысокой стоимостью DHT11 имеет следующие характеристики: питание осуществляется от 3,5-5V, определение температуры от 0 до 50 градусов с точностью 2 град, определение влажности от 20% до 95% с 5% точностью.

Arduino dht11 распиновка (datasheet на русском)

Модуль DHT11 оборудован трех пиновым разъемом и подключается по схеме:

G — Подключается к выводу GNDV — Подключается к выводу +5VS — Подключается к цифровому выводу ( Pin2 )

Термистор — это термический резистор, сопротивление которого изменяется с температурой, т.е. увеличение температуры приводит к падению его сопротивления. По сути термистор — это термометр сопротивления, изготовленный на основе смешанных оксидов переходных металлов.  Относится к измерительной технике и может быть использован для автоматического измерения температуры в различных средах.

Емкостной датчик влажности — это конденсатор с переменной емкостью, который содержит токопроводящие обкладки из медной фольги на текстолите. Этот конденсатор заключен в герметичный чехол, поверх которого расположен влагопоглощающий слой. При попадании частиц воды на этот слой, меняется его диэлектрическая проницаемость, что приводит к изменению емкости конденсатора.

2Схема подключения датчика температуры и влажности DHT11

Рассмотрим схему подключения датчика температуры и влажности DHT11 к микроконтроллеру, в частности, к Arduino.

Схема подключения датчика температуры и влажности DHT11

Давайте посмотрим, что показано на рисунке.

Обозначение на рисунке Описание Примечание
MCU Микроконтроллер или одноплатный компьютер Arduino / Raspberry Pi и др.
DHT11 Датчик температуры и влажности Выводы 1Pin, 2Pin и 4Pin задействованы в схеме, один из выводов датчика – 3-ий пин 3Pin – ни к чему не подключается.
DATA Шина данных Если длина соединительного кабеля от датчика к микроконтроллеру не превышает 20 метров, то эту шину рекомендуется подтянуть к питанию резистором 5,1 кОм; если больше 20 метров – то другой подходящий номинал (меньший).
VDD Питание датчика Допустимы напряжения от ~3,0 до ~5,5 вольт постоянного тока; если используется питание ~3,3 В, то желательно использовать питающий провод не длиннее 20 см.

Соберём рассмотренную схему. Я также по традиции включу в цепь логический анализатор, чтобы можно было изучить временную диаграмму информационного обмена с датчиком.

Сенсор температуры и влажности DHT11 подключён к Arduino UNO

Сенсор DHT11 часто продаётся в виде готовой сборки с необходимой обвязкой – подтягивающими резистором и фильтрующим конденсатором (как на предыдущей фотографии). Для экспериментов с Arduino я рекомендую покупать именно такой.

Скетч для работы с датчиками DHT11 и DHT22 в Arduino

#include "DHT.h"
#define DHTPIN 2 // Тот самый номер пина, о котором упоминалось выше
// Одна из следующих строк закоментирована. Снимите комментарий, если подключаете датчик DHT11 к arduino
DHT dht(DHTPIN, DHT22); //Инициация датчика
//DHT dht(DHTPIN, DHT11);
void setup() {
  Serial.begin(9600);
  dht.begin();
}
void loop() {
  delay(2000); // 2 секунды задержки
  float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  if (isnan(h) || isnan(t)) {  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
    Serial.println("Ошибка считывания");
    return;
  }
  Serial.print("Влажность: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Температура: ");
  Serial.print(t);
  Serial.println(" *C "); //Вывод показателей на экран
}

После загрузки скетча и подключения датчика, результат измерений можно посмотреть в окне монитора порта. Там будут выводиться значения температуры и влажности. Если что-то пошло не так, проверьте правильность подключения датчика, соответствие номера порта на плате Arduino и в скетче, надежность контактов.
Если все работает и датчик дает показания, можете провести эксперименты. Например, поместить датчик в более холодное место или подышать на него, отслеживая при этом изменения . Если при запотевании уровень влажности увеличивается, значит датчик работает исправно. Подуйте на него тонкой струйкой – влажность уменьшится и температура вернется в норму.

На этом этапе вы сможете заметить разницу между реальным значением температуры и показаниями датчика с ардуино. Точность DHT11 гораздо хуже точности DHT22, о чем мы уже говорили в этой статье. Если у вас есть оба датчика, подключите их к плате Arduino и сравните результаты. По моему опыту, в среднем расхождение составляет больше градуса. Учитывайте это, используя эти датчики в своих проектах.

Комплект подключения

Для подключения можно использовать микроконтроллер Arduino UNO, компактную плату NANO или MEGA – для больших решений. Комплект подключения №1 следующий:

  1. Плата Arduino UNO.
  2. Датчик
  3. Резистор 4,7 кОм.
  4. Беспечная макетная плата.
  5. Проводники для соединения элементов.

Комплект подключения №2:

  1. Плата Ардуино Уно, можно нано.
  2. Модуль
  3. Проводники со штекерами для Arduino.

Комплект подключения №3:

  1. Плата Ардуино Уно.
  2. Модуль
  3. LCD-дисплей.
  4. Проводники со штекерами для Arduino.
  5. Переходник для питания 2 в 1.

Последний комплект сможет не только замерить, но и вывести данные на экран без подключения к компьютеру. То есть, работать автономно.

Testing All Temperature Sensors

This experiment logged temperature readings from different temperature sensors over time in the same conditions.

We wired all the following temperature sensors to an Arduino Mega:

  • DHT11
  • DHT22
  • LM35
  • 2x DS18B20 in the same data bus
  • BME280
  • BMP180

The data was recorded on a microSD card using a microSD card module. The experiment run for approximately 36 hours and temperature readings were logged every 5 minutes.

We wired the data pins of the temperature sensors to the following pins on Arduino Mega:

  • DHT11: Pin 11
  • DHT22: Pin 12
  • DS18B20: Pin 14
  • LM35: Pin A0
  • BME280: software SPI on these pins: Pin 4 (MISO), Pin 5 (CS), Pin 6 (SCK), Pin 7 (MOSI)
  • BMP180: Pin 20 (SDA) and Pin 21 (CSL)

The microSD card module was connected via hardware SPI: Pin 51 (MOSI), Pin 50 (MISO), Pin 52 (SCK), Pin 53 (CS).

This is the code running in the Arduino Mega.

Note: in order to compile and run this code, you must install in your Arduino IDE all sensor libraries mentioned in the comparison table at the beginning of this article.

Как подключить DHT11 к Ардуино Уно

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • модуль DHT11 / DHT22 Ардуино;
  • макетная плата;
  • 2 светодиода и 2 резистора на 220 Ом;
  • провода «папа-папа» и «папа-мама».

На этом занятии мы приведем для примера два скетча. Первый скетч будет отсылать данные с модуля DHT11 на последовательный монитор порта  компьютера. Во втором скетче мы будем использовать вывод данных на жк дисплей — LCD 1602 модуль. LCD модуль можно будет использовать в дальнейшем в любом автономном устройстве, например, при конструировании «Домашней метеостанции» или «Умной теплицы».

Схема подключения модуля DHT11 к плате Ардуино Уно

Скетч. Ардуино датчик температуры и влажности DHT11

#include <DHT.h>      // подключаем библиотеку для датчика
DHT dht(2, DHT11);  // сообщаем на каком порту будет датчик

void setup() {
   dht.begin();                // запускаем датчик DHT11
   Serial.begin(9600);   // подключаем монитор порта
}

void loop() {
   // считываем температуру (t) и влажность (h)
   float h = dht.readHumidity();
   float t = dht.readTemperature();

   // выводим температуру (t) и влажность (h) на монитор порта
   Serial.print("Humidity: ");
   Serial.println(h);
   Serial.print("Temperature: ");
   Serial.println(t);
}

Пояснения к коду:

  1. переменные «h» и «t» являются типом данных float, которая служит для хранения чисел с десятичным разделителем (вре11 подключение к ардуино);
  2. команда выводит информацию на порт без переноса строки, команда выводит информацию на порт с переносом строки.

Схема подключения DHT11 и LCD 1602 к Ардуино

Скетч. Подключение к Ардуино DHT11 и вывод на LCD 1602 i2c

#include <Wire.h>                       // библиотека для протокола I2C 
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 1602
#include <DHT.h>                         // подключаем библиотеку для датчика

LiquidCrystal_I2C LCD(0x27,16,2);  // присваиваем имя LCD для дисплея
DHT dht(2, DHT11);                          // сообщаем на каком порту будет датчик

void setup() {
   LCD.init();            // инициализация LCD дисплея
   LCD.backlight();  // включение подсветки дисплея
   dht.begin();         // запускаем датчик DHT11
}

void loop() {
   // считываем температуру (t) и влажность (h)
   float h = dht.readHumidity();
   float t = dht.readTemperature();

   // выводим температуру (t) и влажность (h) на жк дисплей
   LCD.setCursor(0,0);
   LCD.print("Humidity: ");
   LCD.print(h);

   LCD.setCursor(0,1);
   LCD.print("Temperature: ");
   LCD.print(t);

   delay(1000);
   LCD.clear();
}

Пояснения к коду:

  1. для подключения датчика к микроконтроллеру можно использовать любой пин общего назначения, указав его в скетче;
  2. команда в программе очищает экран дисплея от надписей для вывода новых значений с сенсора температуры DHT11 Arduino.

Исходный код

Код автономной части

meteo_sensor.ino
#include <Arduino.h>
#include <SHT1x.h>
#include <LowPower_Teensy3.h>
#include <ampline.h>
 
 
// Таймаут между посылками (не более 65535)
#define TIMEOUT 60000
 
// Количество попыток отправки посылки
#define ATTEMPTS 3
 
// Информационный пин передатчика
#define RF_PIN 5
 
// Пины датчика температуры и влажности
#define GND1_PIN 10
#define VCC1_PIN 11
#define GND2_PIN 7
#define VCC2_PIN 8
#define DATA_PIN 12
#define CLK_PIN  9
 
 
AmperkaLine rf(RF_PIN);
SHT1x sht1x(CLK_PIN, DATA_PIN);
 
 
void loop(void);
 
 
// Функция усыпления платы. Каждые TIMEOUT секунд
// будет вызываться функция loop_func.
TEENSY3_LP LP = TEENSY3_LP();
sleep_block_t* LP_config;
 
void sleep_mode(void)
{
    LP_config = (sleep_block_t*)calloc(1,sizeof(sleep_block_t));
 
    // Просыпаться будем по таймеру
    LP_config->modules = (LPTMR_WAKE);
    // Задаём таймаут для таймера
    LP_config->lptmr_timeout = TIMEOUT;
    // По истечении таймаута будет вызываться функция loop
    LP_config->callback = loop;
 
    LP.Hibernate(LP_config);
}
 
 
// Функция включения периферии
void periferial_start(void)
{
    // Включаем линию передачи данных
    pinMode(RF_PIN, OUTPUT);
 
    // Включаем питания и земли датчиков температуры и влажности
    pinMode(GND1_PIN, OUTPUT);
    pinMode(GND2_PIN, OUTPUT);
    pinMode(VCC1_PIN, OUTPUT);
    pinMode(VCC2_PIN, OUTPUT);
    digitalWrite(GND1_PIN, LOW);
    digitalWrite(GND2_PIN, LOW);
    digitalWrite(VCC1_PIN, HIGH);
    digitalWrite(VCC2_PIN, HIGH);
 
    // Включаем светодиод для индикации передачи
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
 
    // Выбираем в качестве опорного напряжения внутренний
    // источник (=1.2 В)
    analogReference(INTERNAL);
}
 
 
// Функция выключения периферии
void periferial_stop(void)
{
    // Выключаем линию передачи данных
    pinMode(RF_PIN, INPUT);
 
    // Выключаем датчик температуры и влажности
    pinMode(GND1_PIN, INPUT);
    pinMode(GND2_PIN, INPUT);
    pinMode(VCC1_PIN, INPUT);
    pinMode(VCC2_PIN, INPUT);
 
    pinMode(18, INPUT_PULLUP);
    pinMode(19, INPUT_PULLUP);
 
    // Выключаем светодиод
    digitalWrite(LED_BUILTIN, LOW);
}
 
void setup(void)
{
    // Ничего не инициализируем, сразу засыпаем
    sleep_mode();
}
 
// Эта функция выполняется раз в TIMEOUT секунд
void loop(void)
{
    unsigned long msg;
    byte temp, humidity, voltage;
 
    // Включаем периферию
    periferial_start();
 
    // Подождём, пока включится датчик температуры и влажности
    delay(30);
 
    // Получаем входные данные с сенсоров
    temp = (byte)(sht1x.readTemperatureC() + 40.)*2;
    humidity = (byte)sht1x.readHumidity();
    voltage = analogRead(A0)4;
 
    // Составляем из данных посылку
    msg = ;
    msg |= voltage;
    msg <<= 8;
    msg |= humidity;
    msg <<= 8;
    msg |= temp;
 
    // Отправляем несколько раз посылку
    for(int i = ; i < ATTEMPTS; i++) rf.send(msg);
 
    // Выключаем периферию
    periferial_stop();
 
    // После выхода из функции плата снова уснёт
}

Код платы, работающей в помещении

receiver.ino
#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <ampline.h>
 
 
byte mac = { 0x90, 0xA7, 0xDA, 0x0F, 0xBC, 0x75 };
 
char server = "narodmon.ru";
 
EthernetClient client;
 
const int rfpin = 7;
AmperkaLine rf(rfpin);
 
void setup(void)
{
    pinMode(rfpin, INPUT);
    pinMode(6, OUTPUT);
 
    Serial.begin(9600);
    Serial.println("Started.");
}
 
void loop(void)
{
    static unsigned long pushtimeout = ;
    static float temp, humidity, voltage;
    unsigned long msg;
    int res;
 
    if((res = rf.receive(&msg)) == )
    {
        temp = ((float)(msg&0xFF))2. - 40.;
        msg >>= 8;
        humidity = (float)(msg&0xFF);
        msg >>= 8;
        voltage = (float)(msg&0xFF)  256. * 1.2 * 10 * 1.1;
 
        digitalWrite(6, HIGH);
 
        Serial.print("Temp: ");
        Serial.print(temp);
        Serial.print(", humidity: ");
        Serial.print(humidity);
        Serial.print(", voltage: ");
        Serial.println(voltage);
 
        digitalWrite(6, LOW);
    }
    else Serial.println('E');
 
    if(millis() - pushtimeout > 60000*5)
    {
        pushtimeout = millis();
 
        Serial.println("Starting Ethernet...");
 
        if (Ethernet.begin(mac) == )
        {
            Serial.println("Failed to configure Ethernet using DHCP");
            while(1) { }
        }
        delay(1000);
        Serial.println("connecting...");
 
        if (client.connect(server, 8283))
        {
            Serial.println("connected");
 
            client.println("#90-A7-DA-0F-BC-75#Sensor#55.751775#37.616856#0.0");
 
            client.print("#90A7DA0FBC7501#");
            client.print(temp, DEC);
            client.println("#In");
 
            client.print("#90A7DA0FBC7502#");
            client.print(humidity, DEC);
            client.println("#Humidity");
 
            client.print("#90A7DA0FBC7503#");
            client.print(voltage, DEC);
            client.println("#Voltage");
 
            client.println("##");
        } 
        else Serial.println("connection failed");
 
        {
            unsigned long tm = millis();
 
            while(millis() - tm < 5000) {
                if (client.available()) {
                    char c = client.read();
                    Serial.print(c);
                }
            }
        }
 
        client.stop();
    }
}

Использование датчиков в системах умного дома

Конструктор Arduino предоставляет возможность любому человеку создать собственную систему умного дома, под конкретные задачи. Универсальная плата с микроконтроллером Arduino UNO позволяет подключать различные модули и взаимодействовать с ними. Пример этого показан в статье. Модуль влажности и температуры, которым можно измерять концентрацию пара в воздухе, теперь подключен к дисплею и выводит соответствующую информацию. Можно задействовать и другие сценарии работы:

  1. Информацию выводить на удаленный сервер и считывать ее через приложение со своего смартфона.
  2. Задействовать в схеме реле, которое будет включать вентилятор в вытяжке, если концентрация пара в ванной достигнет 85%. И отключать, когда замеры покажут норму.
  3. Или использовать в схеме умную розетку, которая включит кондиционер, чтобы привести влажность в квартире в нормальное состояние.
  4. Можно использовать и более сложные моторы, например электроприводы для окон, чтобы автоматически оно открывалось на проветривание, если концентрация влаги не в норме.
  5. Использование сенсора в фермерстве, и на той же птицефабрике – неотъемлемая часть автоматизации. С помощью несложной системы можно с легкостью контролировать процессы в инкубаторе и корректировать их, в случае отхождения от нормы.

Wrapping Up

In this article we’ve compared several temperature sensors that you can use with the ESP32, ESP8266, Arduino and other development boards. These sensors all measure temperature but they behave differently when put to the test in the same environment at the same time.

We hope you’ve found this article useful and that it helps you pick the best temperature sensor for your project requirements.

You might also like reading:

  • 9 Arduino Compatible Temperature Sensors for Your Electronics Projects
  • ESP32/ESP8266 Plot Sensor Readings in Real Time Charts
  • Enroll in our electronics Courses and eBook

If there’s any other sensor that you’d like to see in this comparison, post a comment below.

Thanks for reading.

Схема подключения

Чтобы подключить измеритель исходя из первого комплекта подключения, нужно использовать такой макет.

Подключение датчика температуры DHT11 к Ардуино, схема №1:

  1. Первый вывод DHT11 к Arduino UNO +5V (красный).
  2. Второй вывод к четвертому контакту Digital (синий).
  3. Третий контакт не задействован.
  4. Четвертый подключается к GND (черный)

Второй коннектор, отвечающий за передачу сигнала, нужно подключить не только к четвертому разъему интерфейса ввода/вывода, но и к питанию, через резистор. Подтянуть линию данных DHT11 к питанию необходимо для обеспечения правильной работы сенсора.

 Принципиальную схему можно посмотреть ниже.

Лишен таких нюансов модуль датчика, потому как уже включает в себя «элементы подтяжки».

Как подключить датчик температуры и влажности по схеме №2 к Ардуино:

  1. VCC к +5V (питание, красный).
  2. OUT к цифровому разъему (данные, зеленый).
  3. GND к GND (земля, черный).

Принципиальная схема выглядит так.

Схема подключения №3:

  1. SCL дисплея в A5 (данные, оранжевый).
  2. SDA в А4 (данные, желтый).
  3. GND в GND (земля, черный).
  4. VCC в 5V (питание, красный).
  5. GND датчика в GND (земля, черный).
  6. DATA в A0 (данные, фиолетовый).
  7. VCC в 5V (питание, красный).

Питание с LCD дисплея и датчика подключите к одному разъему через соединительный провод 2 к 1.

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

Код 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector