#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// PIN CONFIGURATION
#define RED_LED_PIN 13 // Red LED on GPIO13
#define DHT_PIN 15 // DHT22 on GPIO15
#define DHTTYPE DHT22
// WIFI
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic_control = "wokwi/alexa/control";
const char* mqtt_topic_status = "wokwi/alexa/status";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHT_PIN, DHTTYPE);
void setup_wifi() {
Serial.println("\nš Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nā
WiFi Connected!");
Serial.print("š” IP: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("\n========================================");
Serial.println("šØ MESSAGE RECEIVED!");
String message = "";
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Command: ");
Serial.println(message);
Serial.println("========================================");
// Turn LED ON
if (message == "ON" || message == "RED_ON" || message == "LIGHT_ON") {
digitalWrite(RED_LED_PIN, HIGH);
Serial.println("š“ RED LED ā ON");
client.publish(mqtt_topic_status, "Red light is ON");
}
// Turn LED OFF
else if (message == "OFF" || message == "RED_OFF" || message == "LIGHT_OFF") {
digitalWrite(RED_LED_PIN, LOW);
Serial.println("ā« RED LED ā OFF");
client.publish(mqtt_topic_status, "Red light is OFF");
}
// Get Temperature
else if (message == "TEMP" || message == "GET_TEMP" || message == "TEMPERATURE") {
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
if (!isnan(temp) && !isnan(humidity)) {
char msg[100];
sprintf(msg, "Temperature: %.1f°C, Humidity: %.1f%%", temp, humidity);
Serial.println("š”ļø " + String(msg));
client.publish(mqtt_topic_status, msg);
} else {
Serial.println("ā Sensor error!");
client.publish(mqtt_topic_status, "Sensor error");
}
}
else {
Serial.println("ā ļø Unknown: " + message);
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("š Connecting to MQTT...");
String clientId = "Wokwi-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" ā
Connected!");
client.subscribe(mqtt_topic_control);
Serial.println("š” Subscribed to: " + String(mqtt_topic_control));
} else {
Serial.print(" ā Failed, rc=");
Serial.println(client.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\nš WOKWI ALEXA CONTROLLER");
Serial.println("Red LED: GPIO13");
Serial.println("DHT22: GPIO15");
pinMode(RED_LED_PIN, OUTPUT);
digitalWrite(RED_LED_PIN, LOW);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
Serial.println("\nā
READY! Waiting for commands...\n");
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}