/*
* Implementación de un sistema IoT para un sistema De monitoreo de Temp y Hum
*/
// Sensors and actuator libraries
#include <DHTesp.h>
#include <ESP32Servo.h>
// JSON, WiFi and MQTT libraries
#include <ArduinoJson.h>
#include <WiFi.h>
#include <PubSubClient.h>
const int SERVO_PIN = 13;
Servo myservo;
const int DHT_PIN = 15;
DHTesp dhtSensor;
// WiFi Configuration
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASS ""
const char* mqtt_server = "broker.mqttdashboard.com";
// WiFi and MQTT clients setup
WiFiClient espClient;
PubSubClient client(espClient);
StaticJsonDocument<200> publishDoc;
StaticJsonDocument<200> subscribeDoc;
void setup() {
myservo.attach(SERVO_PIN);
myservo.setPeriodHertz(50);
pinMode(2,OUTPUT);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.begin(115200);
delay(500);
initWiFi();
delay(500);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void initWiFi() {
Serial.println("Conecting ....");
WiFi.begin(WIFI_AP,WIFI_PASS, 6);
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("Connected!");
}
void connectMqtt() {
while (!client.connected()) {
Serial.print("Esperando Conexión MQTT...");
if (client.connect("MACCliente")) { // Configure client connection name
Serial.println("connectada");
client.subscribe("MACActuadores"); // Configure subscribe topic name
} else {
Serial.print("falla, rc=");
Serial.print(client.state());
Serial.println("Intento de nuevo en 5 segundos");
delay(2000);
}
}
}
void loop() {
if (!client.connected()) {
connectMqtt();
}
client.loop();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
publishDoc["Temp"] = data.temperature;
publishDoc["Hum"] = data.humidity;
char buffer[300];
serializeJson(publishDoc, buffer);
client.publish("MACSensores",buffer); // Configure publish topic name
delay(2000);
}
void callback(char* topic, byte* payload, unsigned int length) {
char rec[50];
String inputString = "";
String sr = "";
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
rec[i] = payload[i];
sr += rec[i];
inputString = sr;
}
char msg[inputString.length()];
inputString.toCharArray(msg, inputString.length() + 1);
DeserializationError error = deserializeJson(subscribeDoc, msg);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
int Pos = subscribeDoc["SetServo"];
String Led = subscribeDoc["SetLed"];
if (Led.equals("false")) {
digitalWrite(2, LOW);
}
if (Led.equals("true")) {
digitalWrite(2, HIGH);
}
int pos_esc = map(Pos, 0, 100, 0, 180);
myservo.write(pos_esc);
}