#include <WiFi.h>;
#include <LiquidCrystal_I2C.h>
#include <MQTT.h>
#include <ESP32Servo.h>
#include <NusabotSimpleTimer.h>
#include <DHTesp.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
WiFiClient net;
MQTTClient client;
Servo servo;
NusabotSimpleTimer timer;
DHTesp dhtSensor;
const char privateBroker[] = "deviot777.cloud.shiftr.io";
const char username[] = "deviot777";
const char password[] = "OrgjmTtCnZesgx4l";
const char clientId[] = "mqttx_e2cbdb6f";
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const int redRGB = 2;
const int greenRGB = 4;
const int blueRGB = 16;
const int pinLED = 13;
const int pinServo = 18;
const int pinPotentio = 33;
const int pinDHT = 25;
int potentio, oldPotentio = 0;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(redRGB, OUTPUT);
pinMode(greenRGB, OUTPUT);
pinMode(blueRGB, OUTPUT);
pinMode(pinLED, OUTPUT);
pinMode(pinPotentio, INPUT);
servo.attach(pinServo, 500, 2400);
dhtSensor.setup(pinDHT, DHTesp::DHT22);
WiFi.begin(ssid, pass);
client.begin(privateBroker, net);
rgb(1,0,0);
lcd.setCursor(0,0);
lcd.print("Welcome");
delay(1000);
lcd.clear();
client.onMessage(subscribe);
timer.setInterval(1000, publishPotentio);
timer.setInterval(2000, publishDHT);
connect();
}
void loop() {
client.loop();
timer.run();
if(!client.connected()){
connect();
}
}
void subscribe(String &topic, String &payload){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(payload);
if(topic == "deviot/led" && payload == "on"){
digitalWrite(pinLED, 1);
}else{
digitalWrite(pinLED, 0);
}
if(topic == "deviot/servo"){
int positionServo = payload.toInt();
servo.write(positionServo);
}
}
void rgb(bool red, bool green, bool blue){
digitalWrite(redRGB, red);
digitalWrite(greenRGB, green);
digitalWrite(blueRGB, blue);
}
void connect(){
lcd.setCursor(0,0);
lcd.print("Connecting");
lcd.setCursor(0,1);
lcd.print("WiFi");
while(WiFi.status() != WL_CONNECTED){
rgb(0,1,0);
lcd.print(".");
delay(500);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Waiting...");
client.setWill("deviot/esp1/status", "offline", true, 1);
while(!client.connect(clientId, username, password)){
delay(500);
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Connected");
rgb(0,0,1);
client.publish("deviot/esp1/status", "online", true, 1);
client.subscribe("deviot/#", 1);
}
void publishPotentio(){
potentio = analogRead(pinPotentio);
Serial.println(potentio);
if(potentio != oldPotentio){
client.publish("deviot/potentiometer", String(potentio), true, 1);
oldPotentio = potentio;
}
}
void publishDHT(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
client.publish("deviot/temp", String(data.temperature, 2), true, 1);
client.publish("deviot/humidity", String(data.humidity, 1), true, 1);
}