Урок №13 DS18B20 и DHT22
В данном уроке мы научимся подключать датчики DS18B20 и DHT22
Описание
  • датчик температуры DS18B20 в герметичном корпусе знакомый нам по уроку № 5
  • датчик температуры и влажности DHT22 – урок №

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

Часть 1 Герметичный датчик температуры
Что нам понадобится?
Достаньте и подготовьте необходимые детали из коробки.
Arduino Uno
Мозг нашей схемы
Популярный микроконтроллер, его мощности достаточно пока нам для начальных экспериментов
Светодиод
Любого цвета
Длинная ножка на положительно заряженный, короткая на отрицательно
Макетная плата
на 400 точек
Соединения идут параллельно, плата разделена на 2 части горизонтальной линией
Резистор
На 10 кОм
О резисторах подробно мы подробно поговорим чуть ниже в разделе "Базовые знания"
Здесь для вас возможно будет сложностью подключение резистора 4.7кОм – так как на схеме и резистор и датчик соединяются в одной точке на макетной плате. Если у вас не получится, то вы можете использовать параллельное подключение. Подглядите его в уроке с Arduino.

Подключение
Скетч
#include <OneWire.h> //Библиотека OneWire для работы с датчиком DS18B20
OneWire ds(17);//порт датчика температуры ds18b20. Датчик температуры для почвы.
float temperature; //Переменная для хранения данных с датчика DS18B20
void setup() {
  /*Включаем экран*/
  pinMode(16,OUTPUT); //Обьявляем пин как выходной. Reset экрана
  digitalWrite(16, LOW);    
  delay(50); 
  digitalWrite(16, HIGH); 
  display.init();
  display.flipScreenVertically();
}
void loop() {
  // Определяем температуру от датчика DS18b20
  byte data[2]; // Место для значения температуры
  ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
  ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
  ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
  delay(1000); // Микросхема измеряет температуру, а мы ждем. 
  ds.reset(); // Теперь готовимся получить значение измеренной температуры
  ds.write(0xCC); 
  ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
  // Получаем и считываем ответ
  data[0] = ds.read(); // Читаем младший байт значения температуры
  data[1] = ds.read(); // А теперь старший
 
  // Формируем итоговое значение: 
  //    - сперва "склеиваем" значение, 
  //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)1
  temperature =  ((data[1] << 8) | data[0]) * 0.0625;
 display.setFont(ArialMT_Plain_16); //Размер шрифта
 display.setTextAlignment(TEXT_ALIGN_LEFT); //Выравнивание по левому краю
 display.clear();   // Очистка дисплея
 display.drawString(0, 0,  "temp: " + String(temperature) + "C");
 display.display();
}


На экране должно появиться значение «temp: ____»
Часть 2 Датчик температуры и влажности
На схеме также указано подключение датчика DHT22 без платы. Но у вас в комплекте может быть датчик уже подключенный к плате с тремя пинами. В таком случае, вы подключаете датчик как обычно:

Минус к GND, или к линии минуса если вы заземлили боковую линии макетной платы

Плюс к питанию 5V, или к линии напряжения 5 вольт на макетной плате

Out – Сигнальный к пину № 22 ( предпоследний по верхней стороне)

Подключение
Код
/*Обьявление переменных экрана*/
#include "SSD1306.h" 
#define SDA_PIN 4// GPIO4 -> SDA
#define SCL_PIN 15// GPIO15 -> SCL
#define SSD_ADDRESS 0x3c
SSD1306  display(SSD_ADDRESS, SDA_PIN, SCL_PIN);
/* DHT */
#include "DHT.h"
#define DHTPIN 22  //Пин к которому подключен DHT22
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);
float localHum = 0;
float localTemp = 0;
void setup() {
  dht.begin();//Считывание данных
  /*Включаем экран*/
  pinMode(16,OUTPUT); //Обьявляем пин как выходной. Reset экрана
  digitalWrite(16, LOW);    
  delay(50); 
  digitalWrite(16, HIGH); 
  display.init();
  display.flipScreenVertically();
}
void loop() {
  float tempIni = localTemp;
  float humIni = localHum;
  localTemp = dht.readTemperature();
  localHum = dht.readHumidity();
  if (isnan(localHum) || isnan(localTemp))   // Check if any reads failed and exit early (to try again).
  {
    localTemp = tempIni;
    localHum = humIni;
    return;
  } 
 display.setFont(ArialMT_Plain_16); //Размер шрифта
 display.setTextAlignment(TEXT_ALIGN_LEFT); //Выравнивание по левому краю
 display.clear();   // Очистка дисплея
 display.drawString(0, 0,  "air temp: " + String(localTemp) + "C");
 display.drawString(0, 20,  "humidity: " + String(localHum) + "%");
 display.display();
 delay(100);
}
Вопросы и задания
1. Попробуйте объединить два кода так, чтобы датчики работали одновременно.

2. Внимательно просмотрите скетчи, какие изменения вы есть в работе датчиков между ESP32 и Arduino?

3. Замерьте влажность воздуха у себя в помещении

4. Замерьте свою температуру тела, используя датчик как градусник