#include <ESP32Servo.h> // Підключення бібліотеки для керування серводвигуном
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
#define LED_R_pin 4
#define LED_G_pin 6
#define LED_Y_pin 5
Servo servo; // Створення об'єкту для керування серводвигуном
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const char* clientId = "9grwtqtm0m4vihlbjaud";
const char* mqttUsername = "Assholien";
const char* mqttPassword = "admin0123456789";
const char* mqttServer = "mqtt.eu.thingsboard.cloud";
const uint16_t mqttPort = 1883;
const char* myTopic = "v1/devices/me/telemetry";
#define DHTPIN 2 // Визначаємо пін, до якого підключено датчик DHT
#define DHTTYPE DHT22 // Визначаємо тип датчика DHT (DHT22)
DHT dht (DHTPIN, DHTTYPE); // Створюємо об'єкт класу DHT з вказаним піном і типом
//DHT22 constants
const uint16_t DHT22_Ts = 1000; // Interval
//DHT22 variables
uint32_t DHT22_Timer = 0; //Timer_variable
float temperature = 0, humidity = 0;
uint8_t servo_var = 0;
bool LED_R = false, LED_G = false, LED_Y = false;
//Json
JsonDocument doc_in;
JsonDocument doc_out;
String doc_out_str;
WiFiClient wifiClient;
PubSubClient client(wifiClient);
void reconnect();
void sendDHT22_broker();
void setParameters(String stMessage);
void setup ()
{
servo.attach(10); // Підключення серводвигуна до піна 10
// Ініціалізація порту для виведення даних у консоль
Serial.begin(115200);
// Підключення до Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Підключення до Wi-Fi...");
while(WiFi.status() != WL_CONNECTED)
{
delay(300);
Serial.print(".");
}
Serial.println("\nПідключення успішне");
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
dht.begin(); // Ініціалізуємо датчик DHT
DHT22_Timer = millis();
pinMode(LED_R_pin, OUTPUT);
pinMode(LED_G_pin, OUTPUT);
pinMode(LED_Y_pin, OUTPUT);
}
void loop ()
{
if (!client.connected())
reconnect();
//Sampling rate 1kHz, while servo + LEDs are working with min. delay
if ( (millis() - DHT22_Timer) >= DHT22_Ts)
{
temperature = dht.readTemperature(); // Отримуємо значення температури з датчика DHT
humidity = dht.readHumidity();
DHT22_Timer = millis(); // Період - DHT22_Ts мс
Serial.print("DHT22 Temperature = ");
Serial.print(temperature, 2);
Serial.print(" *C; Humidity = ");
Serial.print(humidity, 2);
Serial.println(" %");
//To Json
doc_out["temperature"] = temperature;
doc_out["humidity"] = humidity;
serializeJson(doc_out, doc_out_str);
sendDHT22_broker();
Serial.println("JSON sent: " + doc_out_str);
}
//LEDS
digitalWrite(LED_R_pin, LED_R);
digitalWrite(LED_G_pin, LED_G);
digitalWrite(LED_Y_pin, LED_Y);
//Servo
servo.write(servo_var);
client.loop();
}
void reconnect()
{
//Перевірка і перепідключення до Wi-Fi
while (!client.connected())
{
if (WiFi.status () != WL_CONNECTED)
{
Serial.print("Підключення до Wi-Fi...");
WiFi.begin(ssid, password);
while(WiFi.status () != WL_CONNECTED)
{
delay(300 );
Serial.print (".");
}
Serial.println("Підключено");
}
//Перепідключення до хмари
Serial.println("Підключення до ThingsBoard...");
if (client.connect(clientId, mqttUsername, mqttPassword))
{
Serial.println("Клієнт: " + String(clientId) + " підключений.");
client.subscribe ("v1/devices/me/rpc/request/+");
}
else
{
Serial.println("помилка: " + String(client.state()) + " повторна спроба через 3 секунди.");
delay(3000);
}
}
}
void sendDHT22_broker()
{
// Перевірка підключення по MQTT
if (!client.connected())
reconnect();
client.publish(myTopic, doc_out_str.c_str());
}
void callback(char* topic, byte* message, unsigned int length )
{
String stMessage;
for (uint16_t i = 0; i < length; i++)
stMessage += (char)message [i];
//Вивід всіх повідомлень в консоль
Serial.print("Отримано повідомлення з топіка ");
Serial.print(topic);
Serial.print(": ");
Serial.println(stMessage);
setParameters(stMessage);
}
void setParameters(String stMessage)
{
deserializeJson(doc_in, stMessage);
String method = doc_in["method"];
if(!strcmp(method.c_str(),"LED_R"))
LED_R = (bool)doc_in["params"];
else if(!strcmp(method.c_str(),"LED_G"))
LED_G = (bool)doc_in["params"];
else if(!strcmp(method.c_str(),"LED_Y"))
LED_Y = (bool)doc_in["params"];
else if(!strcmp(method.c_str(),"setServoValue"))
servo_var = (uint8_t)doc_in["params"];
}Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1