#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
const char* ssid = "Wokwi-GUEST"; /// wifi ssid
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";// mosquitto server url
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define DHTPIN 12 // Utiliser la broche 12 pour le capteur DHT11
#define DHTTYPE DHT22
#define led_vert 27
#define TEST_RELAIS2 2
const int ledPin = 26; // Utiliser la broche 26 pour la LED
const int servoPin = 4; // Utiliser la broche 4 pour le servomoteur
const int voltagePin = 32; // Broche analogique pour la mesure de la tension
const int currentPin = 34; // Broche analogique pour la mesure du courant
Servo servoMotor; // Créer une instance de la classe Servo
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4); // Remplacez 0x27 par l'adresse I2C de votre écran LCD
int LED_VERT = 0;
int test_relais2 = 0;
/*********************************************************************************************/
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
client.publish("/ThinkIOT/Publish", "Welcome");
client.subscribe("/ThinkIOT/Subscribe");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}}
}
void setup() {
Serial.begin(115200);
Wire.begin(22, 18);
pinMode(ledPin, OUTPUT);
pinMode(led_vert, OUTPUT);
pinMode(TEST_RELAIS2, OUTPUT);
dht.begin();
servoMotor.attach(servoPin);
lcd.begin(20, 4); // Écran LCD 20x4
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) { //perintah publish data
lastMsg = now;
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
client.publish("/Thinkitive/temp", String(temperature).c_str()); //
client.publish("/Thinkitive/hum", String(humidity).c_str()); //
client.publish("/Thinkitive/TEST_RELAIS2", String(test_relais2).c_str()); //
/////////////////////////////////////////////////////////////////////////////
delay(500); // Attendre 500ms entre les mesures
// Mesure de la température et de l'humidité
// Mesure de la tension
int voltageValue = analogRead(voltagePin);
float voltage = 75*voltageValue * (3.3 / 4095.0); // Convertir la valeur analogique en tension
// Mesure du courant
int currentValue = analogRead(currentPin);
float current = 7*currentValue * (3.3 / 4095.0); // Convertir la valeur analogique en courant
client.publish("/Thinkitive/voltage", String(voltage).c_str()); //
client.publish("/Thinkitive/current", String(current).c_str()); //
client.publish("/Thinkitive/Relais", String(LED_VERT).c_str());
//Serial.print("TEST_RELAIS2 : ");
//Serial.print(test_relais2);
Serial.print("Temp : ");
Serial.print(temperature);
Serial.print("C Humid : ");
Serial.print(humidity);
Serial.print("% Tension : ");
Serial.print(voltage);
Serial.print("V Courant : ");
Serial.print(current);
Serial.println("A");
// Affichage sur l'écran LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("%");
lcd.setCursor(0, 2);
lcd.print("Tension: ");
lcd.print(voltage);
lcd.print("V");
lcd.setCursor(0, 3);
lcd.print("Courant: ");
lcd.print(current);
lcd.print("A");
if (temperature > 30.0) {
digitalWrite(ledPin, HIGH); // Allumer la LED
digitalWrite(led_vert, HIGH); // Allumer la LED
LED_VERT = 1;
// Faire tourner le servomoteur continuellement remplacement ventillo
for (int angle = 0; angle <= 180; angle++) {
servoMotor.write(angle);
delay(15);
}
} else {
digitalWrite(ledPin, LOW); // Éteindre la LED
digitalWrite(led_vert, LOW); // Allumer la LED
servoMotor.write(0); // Ramener le servomoteur à la position initiale
LED_VERT = 0;
}
/////////////////////////////////////////////////////////////////////////////
if(test_relais2)
{
digitalWrite(TEST_RELAIS2, HIGH);
}
else
{
digitalWrite(TEST_RELAIS2, LOW);
}
}
}