Быстрые ссылки на Aliexpress
Что нам понадобиться:
- Три провода
- Макетная плата
- DHT22
- NodeMCU
- Micro-USB
Подключение
- Не перепутайте стороны датчика DHT22, на картинке датчик передней частью обращен к вам
- Самый левый вывод DHT22 — это плюс. Вы должны подключить его в 3v.
- Второй вывод слева — это вывод данных. Вы должны подключить его в D2 на MCU.
- Второй вывод справа ничего не делает.
- Последний вывод минус. Он должен быть подключен в GND
Настройка
Для того, чтобы запрограммировать контроллер, нам нужна программа, программу мы будем использовать IDE Arduino. После того, как вы установили программу, вам понадобиться еще две библиотеки. А так же настроить программу IDE Arduino так, чтобы она видела контроллер ESP8266.
Первое что надо сделать, это зайти в программу IDE Arduino -> Файл -> Настройки. И указать дополнительную ссылку, как на картинке:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Поставьте галочки в соответствии с картинкой выше!
Для того чтобы скачать библиотеки, нужно зайти в программу IDE Arduino -> Перейти во вкладку «Инструменты» -> и нажать на «Управлять библиотеками»
Первая библиотека, это Adafruit_Sensor. Воспользуйтесь поиском, как на картинке:
И вторая библеотека:
После того, как вы все установили, можно приступать к коду:
Код, подключаем датчик DHT22 и выводим данные в консоль
/**
* Пример для считывания температуры и влажности
* Используются DHT22 и ESP8266
*
* Copyright (c) 2018 smartideal. All rights reserved.
* https://smartideal.net
*/
#include "DHT.h"
#define DHTPIN 4 // Номер пина, который подключен к DHT22
#define DHTTYPE DHT22 // Указываем, какой тип датчика мы используем
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.setTimeout(2000);
// Ждем, пока все загрузится.
while(!Serial) { }
Serial.println("Устройство запущено");
Serial.println("-------------------------------------");
Serial.println("Запускаем DHT!");
Serial.println("-------------------------------------");
}
int timeSinceLastRead = 0;
void loop() {
// Каждые 2 секунды.
if(timeSinceLastRead > 2000) {
// Считывание температуры и влажности около 250 милисекунд!
// Показания датчика также могут составлять до 2 секунд
float h = dht.readHumidity(); // Влажность
float t = dht.readTemperature(); // Температура
// Проверяем, получили ли данные с датчика.
if (isnan(h) || isnan(t)) {
Serial.println("Данных нет! Останавливаем цикл и запускаем по новой");
timeSinceLastRead = 0;
return;
}
// Вычисляем индекс тепла в градусах Цельсия
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Влажность: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Температура: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print("Индекс тепла: ");
Serial.print(hic);
Serial.print(" *C ");
timeSinceLastRead = 0;
}
delay(100);
timeSinceLastRead += 100;
}
Теперь, когда код готов, нужно загрузить его в контроллер, до того как загружать, нужно убедиться, что в настройках указана верная плата: Инструменты -> Плата Generic esp8266 Module
Когда плата выбрана, нажимаем сверху слева на галочку (Проверить код). Если проверка прошла успешно, можно загружать (стрелочка, рядом с галочкой). Если нет, то нужно исправить ошибку в коде.
После того как загрузили, нужно проверить, все ли работает. Для этого нужно перейти в Инструменты -> Монитор Порта
Если вы все правильно сделали, то вы увидите список, где каждые 2 секунды добавляется строчка с данной температурой.
Все это здорово, но теперь нужно передать всю информацию в majordomo, где можно ввести график вашей температуры или влажности.
Отправка данных по Wi-Fi
Перед тем как приступать к отправке данных, убедитесь что у вас уже работает протокол MQTT, если нет, то эта статья обязательна к прочтению!
Код:
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define DHTPIN 4 // Номер пина, который подключен к DHT22
#define DHTTYPE DHT22 // Указываем, какой тип датчика мы используем
byte mqtt_server[] = { 192, 168, 88, 254 }; // ip адресс mqtt сервера
char buffer[10];
DHT dht(DHTPIN, DHTTYPE);
// WiFi
const char* WIFI_SSID = "your_SSID"; // Укажите ваш SSID
const char* WIFI_PASS = "your_PASSWORD"; // Укажите ваш wifi пароль
// Читаем MQTT сообщения
void callback(char* topic, byte* payload, unsigned int length) {
}
WiFiClient wifiClient;
PubSubClient client(mqtt_server, 1883, callback, wifiClient);
void connect() {
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
unsigned long wifiConnectStart = millis();
while (WiFi.status() != WL_CONNECTED) {
if (WiFi.status() == WL_CONNECT_FAILED) {
Serial.println("Ошибка соединения WIFI. Проверьте данные: ");
Serial.println();
Serial.print("SSID: ");
Serial.println(WIFI_SSID);
Serial.print("Password: ");
Serial.println(WIFI_PASS);
Serial.println();
}
delay(500);
if(millis() - wifiConnectStart > 5000) {
Serial.println("Ошибка соединения WiFi");
Serial.println("Попробуйте отправить обновленные параметры конфигурации.");
return;
}
}
Serial.println("WiFi соединение установлено");
Serial.println("IP адрес: ");
Serial.println(WiFi.localIP());
Serial.println();
}
void setup() {
Serial.begin(9600);
Serial.setTimeout(2000);
// Ждем, пока все загрузится.
while(!Serial) { }
Serial.println("Устройство запущено");
Serial.println("-------------------------------------");
Serial.println("Запускаем DHT!");
Serial.println("-------------------------------------");
connect();
}
// Собираем данные, складывем воедино и отправляем
void report(double humidity, double tempC) {
StaticJsonBuffer<500> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["humidity"] = humidity;
root["tempC"] = tempC;
char payload[256];
root.printTo(payload, sizeof(payload));
char* s = payload;
client.publish("ESP/Temp", s);
Serial.println("Отправлено!");
}
int timeSinceLastRead = 0;
void loop() {
bool toReconnect = false;
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Disconnected from WiFi");
toReconnect = true;
}
if (toReconnect) {
connect();
}
if(timeSinceLastRead > 5000) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Данных нет! Останавливаем цикл и запускаем по новой");
timeSinceLastRead = 0;
return;
}
report(h, t); // Функция отправки данных
timeSinceLastRead = 0;
}
delay(100);
timeSinceLastRead += 100;
client.loop();
}
Вот и все дела, данные отправляются. Это хороший вариант, только в том случае, если ваш контроллер будет работать от розетки. А если же будет работать от батарейки, то данный вариант не подходит. С таким вариантом батарейка сядет за пару недель. Чтобы батарейка служила пол года, а то и год нужно использовать Deep sleep. А об этом мы уже поговорим в следующих записях.
при проверке дает ошибку и останавливается на этой строчке
PubSubClient client(mqtt_server, 1883, callback, wifiClient);
Да, извиняюсь, видимо случайно удалил фигурную скобку, сейчас проверил, 100% рабочий код
Спасибо за статью. Я бы не советовал использовать VIN для подключения датчика! Данный пин не для этого.
Статья устарела сейчас используется ArduinoJson version 6…
я так понял никто скетч не грузил, потому как без dht.begin() в setup() получить данные с датчика невозможно
У меня на брокере стоит логин и пароль, как добавить в программу идентификацию при подключении к брокеру? Где прописать этот логин и пароль?