В прошлой статье https://dzen.ru/media/quazartech/internet-vescei-esp8266-dannye-onlain-v-liuboi-tochke-mira-cherez-brauzer-ispolzovanie-oblaka-638384aa03e99c68d81970cd
было рассмотрено вывод дынный с датчика температуры и влажности в облако и использование их в любой точке мира с помощью браузера. Сегодня разовьем тему: подключим LCD дисплей и реле для управления нагрузкой. При установленной температуре реле будет включаться, при снижении – отключаться.
Для начала предоставим общую схему
В первою очередь к Node MCU подключим только LCD 1602 (черно-белый дисплей с 2 строками по 16 символов). Обратите внимание, что тут дисплей совмещен с модулем IIC/I2C / interface LCD-1602 он также может покупаться отдельно
Подключим D1 и D2 нашей платы Node MCU к SCL и SDA соответственно модуля LCD (провода I2C). VIN и GND соответственно соединяются с VCC и GND (подача питания). Только D1 и D2 платы Node MCU предназначены для передачи данных по I2C, поэтому это нужно учитывать при подключении других устройств.
Чтобы определить адрес нашего LCD дисплея воспользуемся следующем скетчем:
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Сканер");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Сканирование...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C устройство найдено по адресу 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
nDevices++;
}
else if (error==4)
{
Serial.print("Неизвестная ошибка по адресу 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("I2C устройство НЕ найдено\n");
else
Serial.println("Выполнено\n");
delay(5000);
}
Заливаем скетч и открываем COM порт. В нем при правильном подключении LCD дисплея определится адрес дисплея, в нашем случае 0x27 (бывает и 0x3F, и другие). Он нам потребуется в дальнейшем.
Теперь, используя простейшую программу, проверим работу дисплея. Но до этого подключим библиотеку LiquidCrystal_I2C в менеджере библиотек
//Пример для подключения дисплея по шине I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.init(); // Инициализируем дисплей
lcd.backlight(); // Включаем
lcd.setCursor(2, 0);
lcd.print("Hello WORLD");
lcd.setCursor(1, 1);
lcd.print("Arduino - 2022");
}
void loop()
{
}
LiquidCrystal_I2C lcd(0x27, 16, 2), здесь 0x27 – адрес дисплея, определенный нами ранее, 16 – количество символов в строке дисплея, 2 – количество строк.
После загрузки скетча на дисплее должно появится "Hello WORLD" в первой строке и "Arduino - 2022" во второй. Если этого не произошло, то в первую очередь следует подкрутить вот эту штуку, которая добавляет яркости отображаемым символам.
Теперь можем полностью собрать схему (см. схему в самом начале), подключив датчик DHT и модуль реле. В моем случае это выглядит так (из 4 реле использую только одно):
Заливаем скетч:
// импортируем библиотеку поддержки ESP8266
#include <ESP8266WiFi.h>
#include "DHT.h"
#include <Wire.h> //библиотека шины I2C
#include <LiquidCrystal_I2C.h> //библиотека для дисплеев
#define DHTPIN 2 // определяем цифровой пин для датчика
#define DHTTYPE DHT11
#define RELEPIN 0 //определяем цифровой пин для реле
//объявление объекта DHT
DHT dht (DHTPIN, DHTTYPE);
LiquidCrystal_I2C LCD(0x27, 16, 2); //присваиваем имя дисплею и обозначаем его характеристики
//Параметры сети WiFi
const char* ssid = " имя вашей сети ";
const char* password = " пароль от вашей сети ";
float temperature;
float humidity;
// Host
const char* host = "dweet.io";
void setup() {
pinMode(RELEPIN, OUTPUT);
// put your setup code here, to run once:
Serial.begin(115200);
dht.begin();
//ВЫВОД ДАННЫХ НА ДИСПЛЕЙ
LCD.init(); //инициализация дисплея
LCD.backlight(); //включаем подсветку
//выводим текст ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ на дисплей
LCD.setCursor(0,0); //ставим курсор на 0 символ 1 строки
LCD.print("T:"); //выводим текст Т
LCD.setCursor(8,0); //ставим курсор на 9 символ 1 строки
LCD.print("H:"); //выводим текст H
LCD.setCursor(14,0); //ставим курсор на 15 символ 1 строки
LCD.print("%"); //выводим текст %
//выводим текст порогов включения выключения на дисплей
LCD.setCursor(0,1); //
LCD.print("On:"); //
LCD.setCursor(6,1); //
LCD.print("Off:"); //
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
Serial.print("Connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// put your main code here, to run repeatedly:
humidity = dht.readHumidity();
temperature = dht.readTemperature();
// This will send the request to the server
client.print(String("GET /dweet/for/myespdweet8266qzt437?temperature=") + String(temperature) + "&humidity=" + String(humidity) + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
//выводим переменные на дисплей
LCD.setCursor(2,0); //ставим курсор на 2 символ 1 строки
LCD.print(temperature, 1); //выводим переменную температуры
LCD.setCursor(10,0); //ставим курсор на 11 символ 1 строки
LCD.print(humidity, 1); //выводим переменную влажности
//вывод переменных порогов включения выключения реле
LCD.setCursor(3,1); //
LCD.print(29, 0); //
LCD.setCursor(10,1); //
LCD.print(28, 0); //
if(temperature>= 29) //условие включения реле
{
digitalWrite(RELEPIN, LOW); //включение реле (инвертируем если нужна обратная логика)
Serial.println("HIGH"); //отладка, вывод в сериал, инвертируем если обратная логика
}
else if (temperature <= 28) // условие отключения реле
{
digitalWrite(RELEPIN, HIGH); //отключение реле (инвертируем если нужна обратная логика)
Serial.println("LOW"); //отладка, вывод в сериал, инвертируем если обратная логика
}
// Repeat every 5 seconds
delay(5000);
}
Жирным выделены изменения по сравнению с кодом прошлой статьи (https://dzen.ru/media/quazartech/internet-vescei-esp8266-dannye-onlain-v-liuboi-tochke-mira-cherez-brauzer-ispolzovanie-oblaka-638384aa03e99c68d81970cd)
Теперь данные температуры и влажности будут выводиться не только в https://freeboard.io, но и отображаться на дисплее, также при температуре выше 29 градусов реле будет замыкаться, включая нагрузка, а при температуре ниже 28 градусов отключаться. Таким образом имитируется включение вентилятора и поддержание температуры в помещении.