Найти в Дзене
Квазартек

ESP8266. Вывод данных на LCD дисплей. Управление нагрузкой. Как по температуре включать вентилятор?

В прошлой статье https://dzen.ru/media/quazartech/internet-vescei-esp8266-dannye-onlain-v-liuboi-tochke-mira-cherez-brauzer-ispolzovanie-oblaka-638384aa03e99c68d81970cd

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

Для начала предоставим общую схему

-2

В первою очередь к Node MCU подключим только LCD 1602 (черно-белый дисплей с 2 строками по 16 символов). Обратите внимание, что тут дисплей совмещен с модулем IIC/I2C / interface LCD-1602 он также может покупаться отдельно

-3
-4

Подключим 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 в менеджере библиотек

-5

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

-6

Теперь можем полностью собрать схему (см. схему в самом начале), подключив датчик DHT и модуль реле. В моем случае это выглядит так (из 4 реле использую только одно):

-7

Заливаем скетч:

// импортируем библиотеку поддержки 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 градусов отключаться. Таким образом имитируется включение вентилятора и поддержание температуры в помещении.

-8