#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ESP32Servo.h>
// ----- Configuration -----
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NETPIE2020 MQTT Broker details
const char* mqtt_server = "mqtt.netpie.io";
const int mqtt_port = 1883;
// NETPIE2020 device credentials
const char* mqtt_Client = "f8122ba1-59cd-4de7-9c3f-054cd8b9f259";
const char* mqtt_username = "hr1u6q4KudGycbujLcjC25SamGfhrDEY";
const char* mqtt_password = "2BR33ixpsfQ5nhTGNMyhDy1ev6nRmMeE";
// LED pin
const int LED_RED = 2;
const int LED_GREEN = 16; // GPIO pin connected to the LED
const int LED_YELLOW = 17;
const int LED_BLUE = 18;
const int LED_PINK = 21;
const int LED_DHT = 23;
// ----- Initialize Objects -----
WiFiClient espClient;
PubSubClient client(espClient);
char msg[100];
// ตั้งค่าพินและประเภทของ DHT22
#define DHTPIN 23
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ----- Servo -----
String datastr;
int servoValue1, servoValue2, servoValue3;
Servo myServo1; // Servo ตัวที่ 1
Servo myServo2; // Servo ตัวที่ 2
Servo myServo3; // Servo ตัวที่ 3
const int servoPin1 = 5; // PWM-capable pin for Servo 1
const int servoPin2 = 15; // PWM-capable pin for Servo 2
const int servoPin3 = 4; // PWM-capable pin for Servo 2
const int minPulseWidth = 500; // Minimum pulse width in microseconds
const int maxPulseWidth = 2400; // Maximum pulse width in microseconds
const int frequency = 50; // 50Hz for servo motors
// ----- Setup Function -----
void setup() {
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_RED, LOW);
pinMode(LED_GREEN, OUTPUT);
digitalWrite(LED_GREEN, LOW);
pinMode(LED_YELLOW, OUTPUT);
digitalWrite(LED_YELLOW, LOW);
pinMode(LED_BLUE, OUTPUT);
digitalWrite(LED_BLUE, LOW);
pinMode(LED_PINK, OUTPUT);
digitalWrite(LED_PINK, LOW);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
myServo1.setPeriodHertz(frequency); // Set frequency for Servo 1
myServo1.attach(servoPin1, minPulseWidth, maxPulseWidth); // Attach Servo 1
myServo2.setPeriodHertz(frequency); // Set frequency for Servo 2
myServo2.attach(servoPin2, minPulseWidth, maxPulseWidth); // Attach Servo 2
myServo3.setPeriodHertz(frequency); // Set frequency for Servo 3
myServo3.attach(servoPin3, minPulseWidth, maxPulseWidth); // Attach Servo 3
}
// ----- Wi-Fi Setup -----
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(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
// ----- MQTT Reconnection -----
void reconnect() {
while (!client.connected()) {
Serial.print("Sensor MQTT connection…");
if (client.connect(mqtt_Client, mqtt_username, mqtt_password)) {
Serial.println("NETPIE2020 connected");
client.subscribe("@msg/#");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
// ----- MQTT Callback -----
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String message;
for (int i = 0; i < length; i++) {
message = message + (char)payload[i];
}
Serial.println(message);
if (String(topic) == "@msg/LED_RED") {
if (message == "on") {
digitalWrite(LED_RED, HIGH);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_RED\" : \"1\"}}");
Serial.println("LED ON");
} else if (message == "off") {
digitalWrite(LED_RED, LOW);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_RED\" : \"0\"}}");
Serial.println("LED OFF");
}
}
if (String(topic) == "@msg/LED_GREEN") {
if (message == "on") {
digitalWrite(LED_GREEN, HIGH);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_GREEN\" : \"1\"}}");
Serial.println("LED ON");
} else if (message == "off") {
digitalWrite(LED_GREEN, LOW);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_GREEN\" : \"0\"}}");
Serial.println("LED OFF");
}
}
if (String(topic) == "@msg/LED_BLUE") {
if (message == "on") {
digitalWrite(LED_BLUE, HIGH);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_BLUE\" : \"1\"}}");
Serial.println("LED ON");
} else if (message == "off") {
digitalWrite(LED_BLUE, LOW);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_BLUE\" : \"0\"}}");
Serial.println("LED OFF");
}
}
if (String(topic) == "@msg/LED_YELLOW") {
if (message == "on") {
digitalWrite(LED_YELLOW, HIGH);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_YELLOW\" : \"1\"}}");
Serial.println("LED ON");
} else if (message == "off") {
digitalWrite(LED_YELLOW, LOW);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_YELLOW\" : \"0\"}}");
Serial.println("LED OFF");
}
}
if (String(topic) == "@msg/LED_PINK") {
if (message == "on") {
digitalWrite(LED_PINK, HIGH);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_PINK\" : \"1\"}}");
Serial.println("LED ON");
} else if (message == "off") {
digitalWrite(LED_PINK, LOW);
client.publish("@shadow/data/update", "{\"data\" : {\"LED_PINK\" : \"0\"}}");
Serial.println("LED OFF");
}
}
Serial.println(message);
if (String(topic) == "@msg/servo") {
servoValue1 = message.toInt();
myServo1.write(servoValue1); // Use myServo1
Serial.println(servoValue1);
datastr = "{\"data\" : {\"servo\" : " + String(servoValue1) + "}}";
datastr.toCharArray(msg, (datastr.length() + 1));
client.publish("@shadow/data/update", msg);
}
if (String(topic) == "@msg/servo2") {
servoValue2 = message.toInt();
myServo2.write(servoValue2); // Use myServo2
Serial.println("Servo 2: " + String(servoValue2));
datastr = "{\"data\" : {\"servo2\" : " + String(servoValue2) + "}}";
datastr.toCharArray(msg, (datastr.length() + 1));
client.publish("@shadow/data/update", msg);
}
if (String(topic) == "@msg/servo3") {
servoValue3 = message.toInt();
myServo3.write(servoValue3); // Use myServo3
Serial.println("Servo 3: " + String(servoValue3));
datastr = "{\"data\" : {\"servo3\" : " + String(servoValue3) + "}}";
datastr.toCharArray(msg, (datastr.length() + 1));
client.publish("@shadow/data/update", msg);
}
}
// ----- Main Loop -----
void loop() {
if (!client.connected()) {
reconnect();
}
float hum = dht.readHumidity();
float temp = dht.readTemperature();
if (isnan(hum) || isnan(temp)) {
Serial.println("Failed to read from sensors!");
return;
}
// พิมพ์ค่าอุณหภูมิและความชื้น
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print("%, Temperature: ");
Serial.print(temp);
Serial.println(" Celsius");
// ตรวจสอบอุณหภูมิและควบคุม LED
if (temp > 50) {
digitalWrite(LED_PINK, HIGH); // เปิดไฟ LED
} else {
digitalWrite(LED_PINK, LOW); // ปิดไฟ LED
}
// ส่งข้อมูลอุณหภูมิและความชื้นไปยัง MQTT
String data = "{\"data\": {\"temp\":" + String(temp) + ", \"hum\":" + String(hum) + "}}";
data.toCharArray(msg, (data.length() + 1));
client.publish("@shadow/data/update", msg);
delay(1000); // หน่วงเวลา 1 วินาที
client.loop();
}