#include <WiFi.h>
#include <HTTPClient.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <PubSubClient.h>
//LED PIN
const uint8_t LED_Blue = 7;
//DHT22 constants
const uint16_t DHT22_Ts = 5000;
//DHT22 variables
uint32_t DHT22_Timer = 0;
uint32_t DHT22_deltaTimer = 0;
float temp = 0;
JsonDocument doc_in;
String doc_in_str;
bool led_mode;
//WiFi constants
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const String url2 = "https://api.open-meteo.com/v1/forecast?latitude=50.4547&longitude=30.5238&hourly=temperature_2m&timezone=auto&forecast_days=1";
//MQTT
const char* mqttServer = "broker.hivemq.com";
const char* myTopic = "GroupRE/Temp/18";
const char* groupTopic = "GroupRE/#";
const uint16_t port = 1883;
const char * clientId = "Assholien_RE-22_18_2"; // Придумати власний Id
WiFiClient wifiClient;
PubSubClient client(wifiClient);
LiquidCrystal_I2C lcd(0x27, 20 , 4 );
void loadPage1();
void recieveDHT22_broker();
void reconnect();
void setup()
{
pinMode(LED_Blue, OUTPUT);
// Ініціалізація порту для виведення даних у консоль
Serial.begin(115200);
Serial.println("Hello, ESP32-C3!");
// Ініціалізація дисплею
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
// Підключення до Wi-Fi
WiFi.begin(ssid, password);
lcd.print("Wi-Fi : Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
lcd.print (".");
}
lcd.clear();
lcd.print("Wi-Fi : Online");
client.setServer(mqttServer, port);
client.setCallback(callback);
recieveDHT22_broker();
DHT22_Timer = millis();
}
void loop()
{
digitalWrite(LED_Blue, led_mode);
DHT22_deltaTimer = millis() - DHT22_Timer;
lcd.setCursor(0, 1);
lcd.printf("Timer: %.4lu ms", DHT22_deltaTimer);
recieveDHT22_broker();
if (DHT22_deltaTimer >= DHT22_Ts)
{
DHT22_Timer = millis();
Serial.print("DHT22 temperature = ");
Serial.print(temp, 1);
Serial.println("°C");
lcd.setCursor(0, 2);
lcd.print("DHT22T = ");
lcd.printf("%+.1f", temp);
lcd.print(" *C ");
}
}
void loadPage1()
{
//Перевірка наявності Wi-Fi підключення
if (WiFi.status() == WL_CONNECTED)
{
HTTPClient http;
http.begin(url2);
// http.begin(url1);
uint16_t httpResponseCode = http.GET();
if (httpResponseCode > 0)
{
Serial.print("HTTP код відповіді: ");
Serial.println(httpResponseCode);
JsonDocument doc_in;
String payload = http.getString();
Serial.println(payload);
deserializeJson(doc_in, payload);
//Варіант №18, 17:00
float temp = doc_in["hourly"]["temperature_2m"][17];
Serial.print(temp, 1);
Serial.println("*C");
lcd.setCursor(0, 1);
lcd.print("T(17:00)=");
lcd.printf("%.1f", temp);
lcd.print("*C");
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
}
else
{
Serial.println("З'єднання Wi-Fi втрачено");
}
}
void recieveDHT22_broker()
{
// Перевірка підключення по MQTT
if (!client.connected())
{
reconnect();
}
client.loop();
}
void reconnect()
{
while (!client.connected())
{
Serial.println ("Підключення по MQTT...");
if (client.connect(clientId))
{
client.subscribe(myTopic);
client.subscribe(groupTopic);
Serial.print("Клієнт: ");
Serial.print(clientId);
Serial.println(" підключений.");
}
else
{
Serial.print ("помилка: ");
Serial.print(client.state());
Serial.println(" повторна спроба через 3 секунди");
delay (3000);
}
}
}
void callback(char* topic, uint8_t* message , uint16_t length)
{
doc_in_str = "";
for (uint16_t i = 0; i < length; i++)
doc_in_str += (char)message[i];
//Вивід всіх повідомлень крім власних
if (topic != myTopic)
{
Serial.print("Отримано повідомлення з топіка ");
Serial.print(topic);
Serial.print (": ");
Serial.println(doc_in_str);
lcd.setCursor(0, 2);
deserializeJson(doc_in, doc_in_str);
temp = doc_in["temperature"];
if (doc_in["led_mode"] == "on")
{
led_mode = true;
}
else if (doc_in["led_mode"] == "off")
{
led_mode = false;
}
}
}Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1