#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
const int DHT_PIN = 26;
DHTesp dhtSensor;
#define button1 27
#define button2 14
#define button3 12
#define button4 13
#define led1 16
#define led2 4
#define led3 0
#define led4 2
const int motorPin = 15;
const int potPin = 25;
int buttonPins[] = {27, 14, 12, 13};
int ledPins[] = {16, 4, 0, 2};
bool ledStates[] = {false, false, false, false};
int motorSpeed = 0;
// MQTT
String clientId = "myClient";
String broker = "broker.emqx.io";
int port = 1883;
long prev;
WiFiClient wifiClient;
PubSubClient wifiMQTT(wifiClient);
void setup() {
Serial.begin(115200);
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
pinMode(buttonPins[i], INPUT);
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
pinMode(motorPin, OUTPUT);
pinMode(potPin, INPUT);
connectToWiFi();
setupMQTT();
prev = millis();
}
void loop() {
handleTemperatureAndHumidity();
handleButtonPresses();
handlePotentiometer();
wifiMQTT.loop();
}
void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void setupMQTT() {
wifiMQTT.setServer(broker.c_str(), port);
wifiMQTT.setCallback(mqttCallback);
clientId += (String)random(1, 1000);
Serial.print("MQTT id: ");
Serial.println(clientId);
if (wifiMQTT.connect(clientId.c_str())) {
Serial.println("MQTT Connected!");
for (int i = 1; i <= 4; i++) {
wifiMQTT.subscribe(("led" + String(i)).c_str());
}
wifiMQTT.subscribe("motor/speed");
} else {
Serial.println("MQTT error!");
}
}
void handleTemperatureAndHumidity() {
if (millis() - prev > 1000UL) {
prev = millis();
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
wifiMQTT.publish("temperatura", String(data.temperature, 2).c_str());
wifiMQTT.publish("humedad", String(data.humidity, 2).c_str());
if (data.temperature > 25.0 || data.humidity > 60.0) {
analogWrite(motorPin, 255);
} else {
analogWrite(motorPin, 0);
}
}
}
void handleButtonPresses() {
for (int i = 0; i < 4; i++) {
if (digitalRead(buttonPins[i]) == 0) {
delay(50);
if (digitalRead(buttonPins[i]) == 1) {
ledStates[i] = !ledStates[i];
digitalWrite(ledPins[i], ledStates[i] ? HIGH : LOW);
String topic = "led" + String(i + 1);
String state = ledStates[i] ? "on" : "off";
if (!wifiMQTT.publish(topic.c_str(), state.c_str())) {
Serial.println("Failed to publish message");
}
while (digitalRead(buttonPins[i]) == 0) {
delay(10);
}
}
}
}
}
void handlePotentiometer() {
int potValue = analogRead(potPin);
int newMotorSpeed = map(potValue, 0, 4095, 0, 255);
if (newMotorSpeed != motorSpeed) {
motorSpeed = newMotorSpeed;
analogWrite(motorPin, motorSpeed);
wifiMQTT.publish("motor/speed", String(motorSpeed).c_str());
}
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
Serial.print("Topic: ");
Serial.println(topic);
String strTopic = String(topic);
String mqttdata = "";
for (int i = 0; i < length; i++) {
mqttdata += (char)payload[i];
}
Serial.println(mqttdata);
if (strTopic.startsWith("led")) {
int ledIndex = strTopic.substring(3).toInt() - 1;
if (ledIndex >= 0 && ledIndex < 4) {
if (mqttdata.equals("on")) {
digitalWrite(ledPins[ledIndex], HIGH);
ledStates[ledIndex] = true;
} else if (mqttdata.equals("off")) {
digitalWrite(ledPins[ledIndex], LOW);
ledStates[ledIndex] = false;
}
}
}
if (strTopic.equals("motor/speed")) {
int speed = mqttdata.toInt();
analogWrite(motorPin, speed);
}
}
void reconnectMQTT() {
while (!wifiMQTT.connected()) {
Serial.print("Attempting MQTT connection...");
if (wifiMQTT.connect(clientId.c_str())) {
Serial.println("connected");
for (int i = 1; i <= 4; i++) {
wifiMQTT.subscribe(("led" + String(i)).c_str());
}
wifiMQTT.subscribe("motor/speed");
} else {
Serial.print("failed, rc=");
Serial.print(wifiMQTT.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}