#define BLYNK_TEMPLATE_ID "TMPL6eTqi32wr"
#define BLYNK_TEMPLATE_NAME "Smart Home"
#define BLYNK_AUTH_TOKEN "94cm0rfZPcEAse7-ktOqlL9D8FhyscUx"
#define BLYNK_PRINT Serial
#include <LiquidCrystal_I2C.h>
#include <cstdint>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"
#define DHTPIN 27
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
unsigned long previousMillis = 0; // เก็บค่าเวลาล่าสุด
const long interval = 2000; // ช่วงเวลาที่ต้องการ
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST"; // สร้าตัวแปรอาเรย์ ssid[] กำหนดชื่อ ssid
char pass[] = ""; // สร้าตัวแปรอาเรย์ pass[] กำหนดรหัสผ่านของ ssid
BlynkTimer timer;
Servo myservo; // ประกาศตัวแปรของคลาส Servo
#define button1_pin 32
#define button2_pin 33
#define button3_pin 23
#define button4_pin 18
#define button5_pin 19
#define relay1_pin 26
#define relay2_pin 2
#define relay3_pin 15
#define relay4_pin 5
#define relay5_pin 4
#define ServoMotor 14
#define pirPin 13 // กำหนดพินเชื่อมต่อกับ OUT/SIGNAL ของ PIR Sensor
int relay1_state = 0;
int relay2_state = 0;
int relay3_state = 0;
int relay4_state = 0;
int relay5_state = 0;
int servo_state = 0;
int servoValue;
int pirValue;
//Change the virtual pins according the rooms
#define button1_vpin V1
#define button2_vpin V2
#define button3_vpin V3
#define button4_vpin V4
#define button5_vpin V5
#define buttonServo_vpin V6
#define pir_vpin V0
//------------------------------------------------------------------------------
// This function is called every time the device is connected to the Blynk.Cloud
// Request the latest state from the server
BLYNK_CONNECTED() {
Blynk.syncVirtual(button1_vpin);
Blynk.syncVirtual(button2_vpin);
Blynk.syncVirtual(button3_vpin);
Blynk.syncVirtual(button4_vpin);
Blynk.syncVirtual(button5_vpin);
Blynk.syncVirtual(buttonServo_vpin);
Blynk.syncVirtual(pir_vpin);
}
//--------------------------------------------------------------------------
// This function is called every time the Virtual Pin state change
//i.e when web push switch from Blynk App or Web Dashboard
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
digitalWrite(relay1_pin, relay1_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
digitalWrite(relay2_pin, relay2_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button3_vpin) {
relay3_state = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
digitalWrite(relay3_pin, relay3_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button4_vpin) {
relay4_state = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
digitalWrite(relay4_pin, relay4_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button5_vpin) {
relay5_state = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
digitalWrite(relay5_pin, relay5_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(buttonServo_vpin) {
servoValue = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
}
//--------------------------------------------------------------------------
BLYNK_WRITE(pir_vpin) {
pirValue = param.asInt(); // แปลงค่าใน param เป็นจำนวนเต็ม
}
//--------------------------------------------------------------------------
void setup()
{
dht.begin(); // คำสั่งเริ่มต้นการทำงานของ DHT
Serial.begin(115200);
LCD.init();
LCD.backlight(); // ปิดแสงหน้าจอ
LCD.setCursor(0, 0); // กำหนดตำแหน่งเริ่มต้นของข้อความบนหน้าจอ
LCD.print("Connecting to "); // แสดงข้อความบนหน้าจอ
LCD.setCursor(0, 1); // กำหนดตำแหน่งเริ่มต้นของข้อความบนหน้าจอ
LCD.print("WiFi "); // แสดงข้อความบนหน้าจอ
/* เช็คการทำงานของ WiFi*/
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
LCD.setCursor(5, 1); // กำหนดตำแหน่งเริ่มต้นของข้อความบนหน้าจอ
LCD.print(WiFi.localIP()); // แสดง IP Address
LCD.clear(); // คำสั่งล้างหน้าจอ
}
//--------------------------------------------------------------------
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
pinMode(button3_pin, INPUT_PULLUP);
pinMode(button4_pin, INPUT_PULLUP);
pinMode(button5_pin, INPUT_PULLUP);
pinMode(pirPin, INPUT); // กำหนดโหมดของพินเป็น INPUT
//--------------------------------------------------------------------
pinMode(relay1_pin, OUTPUT);
pinMode(relay2_pin, OUTPUT);
pinMode(relay3_pin, OUTPUT);
pinMode(relay4_pin, OUTPUT);
pinMode(relay5_pin, OUTPUT);
//--------------------------------------------------------------------
//During Starting all Relays should TURN OFF
digitalWrite(relay1_pin, LOW);
digitalWrite(relay2_pin, LOW);
digitalWrite(relay3_pin, LOW);
digitalWrite(relay4_pin, LOW);
digitalWrite(relay5_pin, LOW);
//--------------------------------------------------------------------
Blynk.begin(auth, ssid, pass);
myservo.attach(ServoMotor); // กำหนดขาพิน 14 เป็นขาที่เชื่อมต่อกับเซอร์โว
}
void loop()
{
unsigned long currentMillis = millis(); // ดึงค่าเวลาปัจจุบัน
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
humtemValue();
}
Blynk.run();
timer.run();
listen_push_buttons();
servoStatus();
// pirSensor();
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void listen_push_buttons(){
//--------------------------------------------------------------------------
if(digitalRead(button1_pin) == LOW){
delay(200);
control_relay(1);
Blynk.virtualWrite(button1_vpin, relay1_state); //update button state
}
//--------------------------------------------------------------------------
else if (digitalRead(button2_pin) == LOW){
delay(200);
control_relay(2);
Blynk.virtualWrite(button2_vpin, relay2_state); //update button state
}
//--------------------------------------------------------------------------
else if (digitalRead(button3_pin) == LOW){
delay(200);
control_relay(3);
Blynk.virtualWrite(button3_vpin, relay3_state); //update button state
}
//--------------------------------------------------------------------------
else if (digitalRead(button4_pin) == LOW){
delay(200);
control_relay(4);
Blynk.virtualWrite(button4_vpin, relay4_state); //update button state
}
//--------------------------------------------------------------------------
else if (digitalRead(button5_pin) == LOW){
delay(200);
control_relay(5);
Blynk.virtualWrite(button5_vpin, relay5_state); //update button state
}
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void control_relay(int relay){
//------------------------------------------------
if(relay == 1){
relay1_state = !relay1_state;
digitalWrite(relay1_pin, relay1_state);
Serial.print("Relay1 State = ");
Serial.println(relay1_state);
delay(50);
}
//------------------------------------------------
else if(relay == 2){
relay2_state = !relay2_state;
digitalWrite(relay2_pin, relay2_state);
delay(50);
}
//------------------------------------------------
else if(relay == 3){
relay3_state = !relay3_state;
digitalWrite(relay3_pin, relay3_state);
delay(50);
}
//------------------------------------------------
else if(relay == 4){
relay4_state = !relay4_state;
digitalWrite(relay4_pin, relay4_state);
delay(50);
}
//------------------------------------------------
else if(relay == 5){
relay5_state = !relay5_state;
digitalWrite(relay5_pin, relay5_state);
delay(50);
}
}
void humtemValue() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Blynk.virtualWrite(V7, t);
Blynk.virtualWrite(V8, h); // Set Virtual Pin 1 frequency to PUSH in Blynk app
Serial.println (t);
Serial.println (h);
LCD.setCursor(0, 0); // กำหนดตำแหน่งเริ่มต้นของข้อความบนหน้าจอ
LCD.print("Humidity="); // แสดงข้อความบนหน้าจอ
LCD.setCursor(10, 0);
LCD.print(h); // แสดงข้อความบนหน้าจอ
LCD.setCursor(0, 1); // กำหนดตำแหน่งเริ่มต้นของข้อความบนหน้าจอ
LCD.print("Temperature="); // แสดงข้อความบนหน้าจอ
LCD.setCursor(12, 1);
LCD.print(t); // แสดงข้อความบนหน้าจอ
}
void servoStatus(){
if(servoValue == LOW){
myservo.write(0);
}else{
myservo.write(90);
}
}
void pirSensor(){
if (digitalRead(pirPin) == HIGH) { // ถ้า PIR Sensor ส่งค่าเป็น HIGH
Blynk.virtualWrite(pirValue, 1); // update button state
Serial.println("Motion detected!"); // พิมพ์ข้อความ
delay(10); // หน่วงเวลา 0.01 วินาที
} else { // ถ้าไม่ใช่
Blynk.virtualWrite(pirValue, 0); // update button state
delay(10);
}
}