Датчики температуры и влажности dht11 и dht22

CAN модуль (контроллер шины CAN) MCP2515

Модуль MCP2515 включает в себя CAN контроллер MCP2515, который представляет собой высокоскоростной CAN приемопередатчик. Соединение модуля MCP2515 с микроконтроллером осуществляется с помощью интерфейса SPI, поэтому его легко подключить ко всем микроконтроллерам с данным интерфейсом.

Начинающим изучение CAN-шины целесообразно начинать именно с этого модуля ввиду его простоты и легкости подключения к большинству современных микроконтроллеров.

Основные технические характеристики модуля MCP2515:

  • включает в себя высокоскоростной CAN приемопередатчик TJA1050;
  • размеры модуля: 40×28mm;
  • управление по интерфейсу SPI с возможностью подключения к CAN-шине нескольких устройств;
  • кварцевый генератор на 8 МГц;
  • сопротивление на концах 120 Ом;
  • включает независимый ключ, светодиодный индикатор, индикатор мощности;
  • поддерживает скорости передачи данных до 1 Мбит/с;
  • низкий потребляемый ток в режиме ожидания;
  • возможность подключения до 112 устройств (узлов).

Назначение контактов (распиновка) CAN модуля MCP2515 представлено в следующей таблице.

Наименование контакта Назначение контакта
VCC контакт питания 5 В
GND общий провод (земля)
CS SPI SLAVE select pin (Active low) (выбор ведомого)
SO SPI master input slave output lead
SI SPI master output slave input lead
SCLK контакт синхронизации SPI
INT контакт прерывания MCP2515

В данном проекте мы будем передавать данные, считываемые с датчика температуры и влажности DHT11 платой Arduino Nano, плате Arduino Uno с помощью CAN модуля MCP2515.

Changelog

  • v 0.0.1
    • fork from idDHT11 lib
    • change names to idDHTLib
    • added DHT22 functionality
  • v 0.0.2
  • v 0.0.3
  • v 1.0.0
    • autoformat code with Arduino IDE code formatting standards (kcsoft)
    • remove the interrupt number from the constructor by using digitalPinToInterrupt (kcsoft)
    • fix type for us and timeout when no interrupt is triggered (kcsoft)
    • removed the callback parameter from the constructor, added sensor type (DHT11, DHT22) as optional param (kcsoft)
    • removed temp/humid calculation from the isr (kcsoft)
    • new function acquireFastLoop to remove delay when start acquiring (kcsoft)
    • update README.md file (kcsoft)

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

Для подключения можно использовать микроконтроллер 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.

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

Functions

  • Call to initialize the interface, define the GPIO pin to which the sensor is connected and define the sensor type. Valid sensor types are:
    • AUTO_DETECT Try to detect which sensor is connected (default if 2nd parameter is not used)
    • DHT11
    • DHT22
    • AM2302 Packaged DHT22
    • RHT03 Equivalent to DHT22
  • Reset last time the sensor was read

Get the temperature in degree Centigrade from the sensor
Either one of getTemperature() or getHumidity() or getTempAndHumidity() initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
See example DHT_ESP32.ino or DHT_Test.ino

Get the humidity from the sensor
Either one of getTemperature() or getHumidity() or getTempAndHumidity() initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
See example DHT_ESP32.ino or DHT_Test.ino

Get the temperature and humidity from the sensor
Either one of getTemperature() or getHumidity() or getTempAndHumidity() initiates reading a value from the sensor if the last reading was older than the minimal refresh time of the sensor.
Return value is a struct of type TempAndHumidity with temperature and humidity as float values.
See example DHT_Multi.ino

  • Get last error if reading from the sensor failed. Possible values are:
    • ERROR_NONE no error occured
    • ERROR_TIMEOUT timeout reading from the sensor
    • ERROR_CHECKSUM checksum of received values doesn’t match

Get last error as a char *

Get detected (or defined) sensor type

Get minimmum possible sampling period. For DHT11 this is 1000ms, for other sensors it is 2000ms

Get number of decimals in the temperature value. For DHT11 this is 0, for other sensors it is 1

Get lower temperature range of the sensor. For DHT11 this is 0 degree Centigrade, for other sensors this is -40 degree Centrigrade

Get upper temperature range of the sensor. For DHT11 this is 50 degree Centigrade, for other sensors this is 125 degree Centrigrade

Get number of decimals in the humidity value. This is always 0.

Get lower humidity range of the sensor. For DHT11 this is 20 percent, for other sensors this is 0 percent

Get upper temperature range of the sensor. For DHT11 this is 90 percent, for other sensors this is 100 percent

Convert Centrigrade value to Fahrenheit value

Convert Fahrenheit value to Centigrade value

Compute the heat index. Default temperature is in Centrigrade.

Compute the dew point. Default temperature is in Centrigrade.

Compute the absolute humidity in g/m³. Default temperature is in Centrigrade.

Compute the comfort ratio. Default temperature is in Centrigrade. Return values:
0 -> OK
1 -> Too Hot
2 -> Too cold
4 -> Too dry
8 -> Too humid
9 -> Hot and humid
5 -> Hot and dry
10 -> Cold and humid
6 -> Cold and dry

Compute the human perception. Default temperature is in Centrigrade. Return values:
0 -> Dry
1 -> Very comfortable
2 -> Comfortable
3 -> Ok
4 -> Uncomfortable
5 -> Quite uncomfortable
6 -> Very uncomfortable
7 -> Severe uncomfortable

Returns the assigned GPIO for this instance. Usefull when connecting multiple sensors

Возможности BLE в модуле NRF24L01

Технология BLE работает в диапазоне ISM (2,4 ГГц), который во многих странах разрешен для безлицензионного использования (то есть не нужно получать никаких разрешений в радиочастотных органах) в промышленности, науке и медицине. ISM диапазон занимает полосу частот от 2400 МГц до 2483.5 МГц и разделен на 40 каналов. Три из этих 40 каналов имеют статус «информационных», они используются устройствами для передачи специальных приветственных пакетов с информацией о своем состоянии – это позволяет другим устройствам BLE устанавливать с ними связь.

В этой статье мы рассмотрим как использовать модуль NRF24L01 в качестве BLE трансивера (приёмопередатчика). BLE функциональность данного модуля будет продемонстрирована на примере передачи данных температуры в смартфон. Данные температуры будут считываться с датчика DHT11, а управлять всем процессом передачи данных будет плата Arduino. На смартфоне для приема этих данных можно использовать, например, приложение для android под названием Nordic BLE.

Скетч для работы с датчиками 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 и сравните результаты. По моему опыту, в среднем расхождение составляет больше градуса. Учитывайте это, используя эти датчики в своих проектах.

Unified Sensor Drivers

The following drivers are based on the Adafruit Unified Sensor Driver:

Accelerometers

  • Adafruit_ADXL345
  • Adafruit_LSM303DLHC
  • Adafruit_MMA8451_Library

Gyroscope

Adafruit_L3GD20_U

Light

  • Adafruit_TSL2561
  • Adafruit_TSL2591_Library

Magnetometers

  • Adafruit_LSM303DLHC
  • Adafruit_HMC5883_Unified

Barometric Pressure

  • Adafruit_BMP085_Unified
  • Adafruit_BMP183_Unified_Library

Humidity & Temperature

DHT-sensor-library

Humidity, Temperature, & Barometric Pressure

Adafruit_BME280_Library

Orientation

Adafruit_BNO055

All in one device

  • Adafruit_LSM9DS0 (accelerometer, gyroscope, magnetometer)
  • Adafruit_LSM9DS1 (accelerometer, gyroscope, magnetometer)

Исходный код программы

Полный код программы представлен в конце статьи, здесь же сначала рассмотрим его наиболее важные фрагменты.

Для выполнения математических операций в программе мы должны подключить заголовочный файл библиотеки “#include <math.h>”, а для работы с ЖК дисплеем – подключить библиотеку “#include <LiquidCrystal.h>». Далее в функции setup() мы должны инициализировать ЖК дисплей.

Arduino

Void setup(){
lcd.begin(16,2);
lcd.clear();
}

1
2
3
4

Voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

Значение температуры мы будем рассчитывать в программе с помощью рассмотренного выше уравнения Стейнхарта-Харта.

Arduino

float a = 1.009249522e-03, b = 2.378405444e-04, c = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) {
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart
Tc = T — 273.15; // переводим температуру из кельвинов в градусы Цельсия
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}

1
2
3
4
5
6
7
8
9

floata=1.009249522e-03,b=2.378405444e-04,c=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Stein-Hart

Tc=T-273.15;// переводим температуру из кельвинов в градусы Цельсия

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

Также в программе мы считываем значение с аналогового входа платы Arduino.

Arduino

lcd.print((Thermistor(analogRead(0))));

1 lcd.print((Thermistor(analogRead())));

Внешний вид работы нашего проекта показан на следующем рисунке – на ЖК дисплее выводятся значения температуры в кельвинах, градусах Цельсия и по шкале Фаренгейта.

Схему можно запитать по кабелю USB или использовать адаптер на 12 В.

Далее представлен полный текст программы.

Arduino

#include <math.h>
#include «LiquidCrystal.h»
LiquidCrystal lcd(44,46,40,52,50,48);
float A = 1.009249522e-03, B = 2.378405444e-04, C = 2.019202697e-07;
float T,logRt,Tf,Tc;
float Thermistor(int Vo) { // функция для расчета значения температуры
logRt = log(10000.0*((1024.0/Vo-1)));
T = (1.0 / (A + B*logRt + C*logRt*logRt*logRt)); // рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта
Tc = T — 273.15; // переводим температуру из кельвинов в градусы
Tf = (Tc * 1.8) + 32.0; // переводим температуру в шкалу Фаренгейта
return T;
}
void setup(){
lcd.begin(16,2);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(«Temp:»);
lcd.print((Thermistor(analogRead(0))));
lcd.print(«k «);

lcd.setCursor(0,1);
lcd.print((Tc));
lcd.print(» C ;»);
lcd.setCursor(9,1);
lcd.print((Tf));
lcd.print(» F»);
delay(800);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#include <math.h>
#include «LiquidCrystal.h»

LiquidCrystallcd(44,46,40,52,50,48);

floatA=1.009249522e-03,B=2.378405444e-04,C=2.019202697e-07;

floatT,logRt,Tf,Tc;

floatThermistor(intVo){// функция для расчета значения температуры

logRt=log(10000.0*((1024.0Vo-1)));

T=(1.0(A+B*logRt+C*logRt*logRt*logRt));// рассчитываем значение температуры в кельвинах по формуле Стейнхарта-Харта

Tc=T-273.15;// переводим температуру из кельвинов в градусы

Tf=(Tc*1.8)+32.0;// переводим температуру в шкалу Фаренгейта

returnT;

}

voidsetup(){

lcd.begin(16,2);

lcd.clear();

}

voidloop()

{

lcd.setCursor(,);

lcd.print(«Temp:»);

lcd.print((Thermistor(analogRead())));

lcd.print(«k «);

lcd.setCursor(,1);

lcd.print((Tc));

lcd.print(» C ;»);

lcd.setCursor(9,1);

lcd.print((Tf));

lcd.print(» F»);

delay(800);

}

Wrapping Up

In this tutorial we’ve shown you how to build an asynchronous web server with the ESP32 to display sensor readings from a DHT11 or DHT22 sensor and how to update the readings automatically.

If you liked this project, you may also like:

  • Learn ESP32 with Arduino IDE (course)
  • Build an ESP32 Web Server using Files from Filesystem (SPIFFS)
  • ESP32 Web Server – control outputs
  • ESP32 Deep Sleep with Arduino IDE and Wake Up Sources

This tutorial is a preview of the “Learn ESP32 with Arduino IDE” course. If you like this project, make sure you take a look at the ESP32 course page where we cover this and a lot more topics with the ESP32.

Масляный обогреватель

ADC Noise Reduction Mode (режим АЦП и уменьшения шума)

Для перевода платы Arduino в данный спящий режим необходимо в ее биты SM записать ‘001’. Этот режим останавливает CPU, но позволяет функционировать АЦП (аналого-цифровым преобразователям), внешним прерываниям, интерфейсам USART и TWI, сторожевому таймеру и счетчикам. Данный режим останавливает, в основном, CLKCPU, CLKI/O и CLKFLASH. Мы можем вывести плату Arduino из этого режима с помощью:

  • внешнего сброса (Reset);
  • сброс системы от сторожевого таймера;
  • прерывание от сторожевого таймера;
  • сброс с помощью пониженного напряжения;
  • внешнее прерывание;
  • прерывание смены контакта;
  • прерывание от таймера/счетчика;
  • прерывание от SPM/EEPROM.

Power-Down Mode (режим пониженного энергопотребления)

Этот режим останавливает все часы платы и разрешает функционирование только асинхронным модулям (им не нужны импульсы тактовой частоты). Для перевода платы Arduino в данный спящий режим необходимо в ее биты SM записать ‘010’. В этом режиме останавливаются все внешние кварцевые генераторы, но интерфейс TWI, сторожевой таймер и внешние прерывания продолжают работать. Мы можем вывести плату Arduino из этого режима с помощью:

  • внешнего сброса (Reset);
  • сброс системы от сторожевого таймера;
  • прерывание от сторожевого таймера;
  • сброс с помощью пониженного напряжения;
  • внешнее прерывание;
  • прерывание смены контакта.

Команда для перевода платы Arduino в периодический режим Power-Down:

Arduino

LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

1 LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);

С помощью этой команды плата Arduino перейдет в спящий режим на 8 секунд и потом выйдет из него (проснется) автоматически.

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

Arduino

void loop()
{
// разрешаем на контакте wake up прерывание по уровню low.
attachInterrupt(0, wakeUp, LOW);

LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

// отключаем внешнее прерывание на контакте wake up
detachInterrupt(0);

// делаем что-нибудь здесь
}

1
2
3
4
5
6
7
8
9
10
11
12

voidloop()

{

// разрешаем на контакте wake up прерывание по уровню low.

attachInterrupt(,wakeUp,LOW);

LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF);

// отключаем внешнее прерывание на контакте wake up

detachInterrupt();

// делаем что-нибудь здесь

}

Power-Save Mode (режим экономии потребляемой мощности)

Для перевода платы Arduino в данный спящий режим необходимо в ее биты SM записать ‘011’. Этот режим аналогичен режиму power-down, но отличается от него тем, что если таймер/счетчик находится во включенном состоянии (enabled), он будет оставаться в этом состоянии даже в спящем режиме. Устройство можно вывести из данного спящего режима используя переполнение таймера.

Если вы не используете таймер/счетчик, то в этом случае рекомендуется применение режима Power-down вместо режима power-save.

Standby Mode (дежурный режим)

Режим Standby аналогичен режиму Power-Down, но отличается от него тем, что в нем внешний кварцевый генератор (external oscillator) продолжает работать. Для перевода платы Arduino в данный спящий режим необходимо в ее биты SM записать ‘110’.

Extended Standby Mode (расширенный дежурный режим)

Этот режим аналогичен режиму power-save, но отличается от него тем, что в нем внешний кварцевый генератор (external oscillator) продолжает работать. Для перевода платы Arduino в данный спящий режим необходимо в ее биты SM записать ‘111’. Устройству необходимо 6 временных циклов чтобы выйти из данного спящего режима.

В этом проекте мы будет переводить плату Arduino в режим Idle (холостой режим) и измерять снижение ее энергопотребления с помощью USB амперметра.

Доступ к веб-серверу

После загрузки скетча откройте монитор последовательного порта со скоростью 115200 бит/с и нажмите кнопку RESET на NodeMCU. Если всё в порядке, он выведет динамический IP адрес, полученный от вашего маршрутизатора, и покажет сообщение о том, что HTTP сервер запущен.

Рисунок 5 – Монитор последовательного порта – сервер запущен

Затем загрузите браузер и введите IP адрес, указанный в мониторе последовательного порта. ESP8266 NodeMCU должен выдать веб-страницу, показывающую температуру и относительную влажность.

Рисунок 6 – Веб-страница с температурой и влажностью с датчика DHT11/DHT22/AM2302 на веб-сервере ESP8266 (без CSS)

Некоторое железо

  • GyverStepper – высокопроизводительная библиотека для управления шаговым мотором
  • AccelStepper – более интересная и качественная замена стандартной библиотеке Stepper для контроля шаговых моторчиков. Скачать можно со страницы разработчика, или вот прямая ссылка на архив.
  • AccelMotor – моя библиотека для управления мотором с энкодером (превращает обычный мотор в “шаговый” или сервомотор)
  • ServoSmooth – моё дополнение к стандартной библиотеке Servo, позволяющее управлять сервоприводом с настройкой максимальной скорости движения и разгона/торможения (как в AccelStepper, только для серво). Must have любого любителя серво манипуляторов!
  • CapacitiveSensor – библиотека для создания сенсорных кнопок (из пары компонентов рассыпухи). Описание
  • ADCTouchSensor – ещё одна версия библиотеки для создания сенсорных кнопок. Есть ещё одна, так, на всякий случай
  • TouchWheel – библиотека для создания сенсорных слайдеров и колец
  • Buzz – детектор присутствия на основе всего лишь одного провода! (измеряет ЭМ волны)
  • Bounce – библиотека антидребезга для кнопок и всего такого. Сомнительная полезность, но почитайте описание
  • oneButton – библиотека для расширенной работы с кнопкой. На мой взгляд неудобная
  • GyverButton – моя библиотека для расширенной работы с кнопкой. Очень много возможностей!
  • AdaEncoder – библиотека для работы с энкодерами
  • GyverEncoder – моя библиотека для энкодеров с кучей возможностей, поддерживает разные типы энкодеров
  • RTCLib – лёгкая библиотека, поддерживающая большинство RTC модулей
  • OV7670 – библиотека для работы с камерой на OV7670
  • IRremote – базовая библиотека для работы с ИК пультами и излучателями
  • IRLib – более расширенная версия для работы с ИК устройствами
  • IRLremote – самая чёткая библиотека для ИК пультов, работает через прерывания. 100% отработка пульта
  • keySweeper – почти готовый проект для перехвата нажатий с беспроводных клавиатур
  • USB_Host_Shield – позволяет Ардуине работать с геймпадами (PS, XBOX) и другими USB устройствами
  • Brain – библиотека для работы с NeuroSky ЭЭГ модулями
  • TinyGPS – шустрая библиотека для работы с GPS модулями
  • GyverRGB – моя библиотека для работы с RGB светодиодами и лентами
  • FadeLED – библиотека для плавного (ШИМ) мигания светодиодами с разными периодами
  • CurrentTransformer – измерение силы тока при помощи трансформатора (катушки) на проводе. Читай: токовые клещи
  • LiquidCrystal-I2C – библиотека для LCD дисплеев с I2C контроллером. Разработчик – fdebrabander
  • LiquidCrystal-I2C – библиотека для LCD дисплеев с I2C контроллером. Разработчик – johnrickman. Предыдущая вроде бы лучше
  • LiquidTWI2 – быстрая библиотека для LCD дисплеев на контроллерах MCP23008 или MCP23017
  • LCD_1602_RUS – библиотека русского шрифта для LCD дисплеев
  • LCD_1602_RUS_ALL – новая версия предыдущей библиотеки с поддержкой украинского языка
  • u8glib – библиотека для работы с монохромными LCD и OLED дисплеями
  • ucglib – библиотека для работы с цветными LCD и OLED дисплеями
  • Adafruit_SSD1306 – ещё одна библиотека для OLED дисплеев
  • Adafruit-GFX-Library – дополнение для adafruit библиотек дисплеев, позволяет выводить графику
  • SSD1306Ascii – самодостаточная и очень лёгкая библиотека для вывода текста на OLEDы
  • NeoPixelBus – библиотека для работы с адресной светодиодной лентой, адаптированная под esp8266 (NodeMCU, Wemos и др.). 
  • microLED – лёгкая и простая библиотека для работы с адресной лентой
  • – лёгкая библиотека для отправки любых данных через радио модули 433 МГц
  • rc-switch – библиотека для работы с радио модулями 433 МГц и разными протоколами связи

Характеристики модуля KY-001.

Модуль датчика температуры KY-001 состоит из цифрового датчика температуры DS18B20, светодиода и резистора. Модуль совместим с популярными электронными платформами, такими как Arduino, Raspberry Pi и Esp8266.

  • Собран на цифровом сенсоре DS18B20, напряжение питания от 3.0 V до 5.5 V.
  • Измеряемая температура -55 ° C до +125 ° C, по Фаренгейту — 67 ° F до 257 ° F.
  • В диапазоне от -10 °C до +85 ° C точность измерения ± 0.5 ° C.
  • Время измерения не более 750 миллисекунд.

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

Схема подключения модуля KY-001 (DS18B20) к Arduino.

Схема подключения модуля KY-001 (DS18B20) к Arduino NANO.

Схема подключения модуля KY-001 (DS18B20) к Arduino.

Подключите линию питания (посередине) c к +5 Arduino, землю (-) и GND соответственно. Подключите сигнал (S) к контакту 2 на Arduino.

Подключение (слева направо)

  • GND
  • +5V
  • S — Signal, в примере подключаем ко 2 выводу arduino

Скетч вывода температуры с модуля KY-001 (DS18B20) в монитор порта.

Код ниже будет выводить показания температуры с модуля KY-001 (DS18B20) в монитор последовательного порта каждую секунду.

#include <OneWire.h>
OneWire ds(2);
void setup() {
    Serial.begin(9600);
}
void loop() {
    byte i;
    byte data;
    byte addr;
    float celsius;
    // поиск датчика
    if ( !ds.search(addr)) {
        ds.reset_search();
        delay(250);
        return;
    }
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1); // измерение температуры
    delay(1000);
    ds.reset();
    ds.select(addr); 
    ds.write(0xBE); // начало чтения измеренной температуры
    //показания температуры из внутренней памяти датчика
    for ( i = 0; i < 9; i++) {
        data = ds.read();
    }
    int16_t raw = (data << 8) | data;
    // датчик может быть настроен на разную точность, выясняем её 
    byte cfg = (data & 0x60);
    if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс
    else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс
    else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс
    // преобразование показаний в градусы Цельсия 
    celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
}

Вот такой результат мы увидим в мониторе порта.

Данный пример достаточно сложный для понимания. Для упрощения работы с датчиком лучше использовать библиотеку DallasTemperature.h. Данная библиотека ставится поверх OneWire.h, т.е. для ее работы должна быть установлена библиотека OneWire.

С библиотекой DallasTemperature устанавливаются примеры. Вы можете воспользоваться любым из них.

Мы рассмотрим более простотой пример, который я взял из библиотеки, и немного его упростил.

#include <OneWire.h>
#include <DallasTemperature.h>
// контакт 2 на Arduino:
#define ONE_WIRE_BUS 2
// создаем экземпляр класса OneWire, чтобы с его помощью
// общаться с однопроводным устройством
OneWire oneWire(ONE_WIRE_BUS);
// передаем объект oneWire объекту sensors:
DallasTemperature sensors(&oneWire);
void setup(void)
{
  Serial.begin(9600);
  // запускаем библиотеку:
  sensors.begin();
}
void loop(void){
  // вызываем функцию sensors.requestTemperatures(),
  // которая приказывает всем устройствам, подключенным к шине
  sensors.requestTemperatures();
  Serial.print("Celsius temperature: ");
  //  в Цельсиях:
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(" - Fahrenheit temperature: ");
  //  в Фаренгейтах:
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

В данном примере температура выводится 1 раз в секунду, и при этом выводится температура в Цельсиях и Фаренгейтах в монитор последовательного порта.

Как видите, данный пример намного меньше и более понятен для новичка.

KY-001датчик температуры DS18B20 к ArduinoKY-001

Купить модуль KY-001 можно тут:

Описание всех датчиков из набора «37 in 1 Sensors Kit for Arduino» вы можете посмотреть на странице описания данного набора модулей для Arduino.

Понравился Урок KY-001 модуль температуры на базе DS18B20. Подключение Arduino? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу , в группу на .

Спасибо за внимание!

Технологии начинаются с простого!

Фотографии к статье

Файлы для скачивания

Скачивая материал, я соглашаюсь с
Правилами скачивания и использования материалов.

Модуль KY-001 датчика температуры DS18B20.pdf 82 Kb 39 Скачать
Скетч вывода температуры с модуля KY-001 .ino 1 Kb 39 Скачать
Код с использованием бмблиотеки DallasTemperature.h.ino 1 Kb 40 Скачать
Библиотека DallasTemperature .zip 31 Kb 47 Скачать

Schematic

Before proceeding to the web server, you need to wire the DHT11 or DHT22 sensor to the ESP32 as shown in the following schematic diagram.

In this case, we’re connecting the data pin to GPIO 27, but you can connect it to any other digital pin. You can use this schematic diagram for both DHT11 and DHT22 sensors.

(This schematic uses the ESP32 DEVKIT V1 module version with 36 GPIOs – if you’re using another model, please check the pinout for the board you’re using.)

Note: if you’re using a module with a DHT sensor, it normally comes with only three pins. The pins should be labeled so that you know how to wire them. Additionally, many of these modules already come with an internal pull up resistor, so you don’t need to add one to the circuit.

Основные технические характеристики DHT11 и DHT22

Особенности DHT11:

  1. Диапазон замера влажности 20-80% (погрешность до 5%).
  2. Диапазон замера температуры 0-50 °C (точность – 2°C).
  3. Питание 3-5 В.
  4. Потребляемый ток 2,5 мА.
  5. Частота 1 Гц.
  6. Габариты: 15,5 x 12 x 5,5 мм.
  7. Четыре коннектора.

Технические характеристики DHT22:

  1. Диапазон замера влажности 0-100% (погрешность 2-5%).
  2. Диапазон замера температуры от минус 40 °C до плюс 125 °C (точность – 0,5°C).
  3. Питание 3-5 В.
  4. Потребляемый ток 2,5 мА.
  5. Частота 0,5 Гц.
  6. Габариты: 15,1 x 25 x 5,5 мм.
  7. Коннекторы 4 штуки с расстоянием 0,1.

Влажность измеряется в процентах. Когда сделаете замер датчиком и он покажет 55%, это значит, что вокруг места замера в воздухе находится 55% водяного пара.

Если датчик покажет 100% — скорей всего он неисправен или схема подключения неверна. А если он выдаст 0% — скорей всего тоже есть проблемы обработки данных, или же вы находитесь в центре пустыни, или в комическом пространстве.

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

Подключение датчика DHT11, DHT22/AM2302 к плате ESP8266 NodeMCU

Подключить датчик DHT11/DHT22/AM2302 к ESP8266 NodeMCU довольно просто. Начните с установки NodeMCU на макетную плату, чтобы каждая сторона платы NodeMCU была на отдельной стороне макетной платы.

Теперь установите датчик на макетную плату, в стороне от NodeMCU. Подключите вывод VCC датчика к выводу 3,3V на NodeMCU и соедините выводы земли датчика и платы. Также подключите вывод данных датчика к выводу D8 платы ESP8266 NodeMCU. Наконец, нам нужно установить подтягивающий резистор 10 кОм между линией VCC и линией данных, чтобы на ней поддерживался высокий логический уровень для корректной связи между датчиком и NodeMCU. Если у вас датчик установлен на отдельную плату, возможно, вам не нужно добавлять какие-либо внешние подтягивающие резисторы. В этом случае датчик поставляется уже со встроенным подтягивающим резистором.

Когда вы закончите, у вас должно получиться что-то похожее на рисунок ниже.

Рисунок 1 – Подключение DHT11, датчика температуры и влажности, к ESP8266 NodeMCUРисунок 2 – Подключение DHT22, датчика температуры и влажности, к ESP8266 NodeMCU

Подключение 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

/*
  Добавляем необходимые библиотеки
*/
#include <DHT12.h>
#include <LiquidCrystal_I2C.h>
 
#define DEGREE (char)0
 
/*
  Создаём знак градуса
  ..OO.
  .O..O
  .O..O
  ..OO.
  …..
  …..
  …..
*/

uint8_tdegree8={

0b00110,

0b01001,

0b01001,

0b00110,

0b00000,

0b00000,

0b00000

};

/*
  Создаём экземпляр класса DHT12
*/

DHT12dht12;

/*
  Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/

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);

}

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий