#define BLYNK_TEMPLATE_ID "TMPL6Lkj2BlVR"
#define BLYNK_TEMPLATE_NAME "WokwiProject"
#define BLYNK_AUTH_TOKEN "VOGCBnMXDDRJeV7EZxDn8sKQuJa8XHUg"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>
char ssid[] = "Wokwi-GUEST"; // ประกาศตัวแปร SSID WiFi
char pass[] = ""; // ประกาศตัวแปรรหัสผ่าน WiFi
// กำหนดพินสำหรับเซ็นเซอร์ต่าง ๆ
#define DHTPIN 26 // พินของ DHT22 สำหรับวัดอุณหภูมิและความชื้นในอากาศ
#define DHTTYPE DHT22 // กำหนดชนิดของเซ็นเซอร์เป็น DHT22
#define ONE_WIRE_BUS 2 // พินของ DS18B20 สำหรับวัดอุณหภูมิใต้ดิน
// กำหนดอ็อบเจ็กต์เซ็นเซอร์
DHT dht(DHTPIN, DHTTYPE); // สร้างอ็อบเจ็กต์ในการเชื่อมต่อกับ DHT22
OneWire oneWire(ONE_WIRE_BUS); // สร้างอ็อบเจ็กต์สำหรับ OneWire บนพิน D0
DallasTemperature sensors(&oneWire); // สร้างอ็อบเจ็กต์ DS18B20
// กำหนดหน้าจอ LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600); // กำหนดความเร็ว baud rate
Wire.begin(17, 16); // กำหนดพินของหน้าจอ LCD สำหรับ SDA และ SCL
lcd.begin(16, 2); // เริ่มทำงานหน้าจอ LCD
lcd.backlight(); // เปิดแบ็คไลท์ของหน้าจอ LCD
dht.begin(); // เริ่มทำงานเซ็นเซอร์ DHT22
sensors.begin(); // เริ่มทำงานเซ็นเซอร์ DS18B20
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // เชื่อมต่อกับ Blynk
}
void loop() {
Blynk.run(); // รันฟังก์ชัน Blynk
// อ่านค่าความชื้นและอุณหภูมิจากเซ็นเซอร์ DHT22
float h = dht.readHumidity();
float t_air = dht.readTemperature(); // อุณหภูมิในอากาศ (เซลเซียส)
float f_air = dht.readTemperature(true); // อุณหภูมิในอากาศ (ฟาเรนไฮต์)
// อ่านค่าอุณหภูมิจากเซ็นเซอร์ DS18B20 (ใต้ดิน)
sensors.requestTemperatures(); // สั่งให้เซ็นเซอร์เริ่มอ่านค่า
float t_soil = sensors.getTempCByIndex(0); // อ่านค่าอุณหภูมิในเซลเซียส
// ตรวจสอบความผิดพลาดในการอ่านข้อมูลจาก DHT22
if (isnan(h) || isnan(t_air) || isnan(f_air)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// แสดงข้อมูลที่หน้าจอ LCD
// ความชื้นในอากาศ
lcd.setCursor(0, 0);
lcd.print("Hum: ");
lcd.setCursor(5, 0);
lcd.print(h);
lcd.print(" % ");
delay(5000);
lcd.clear();
// อุณหภูมิในอากาศ (เซลเซียส)
lcd.setCursor(0, 0);
lcd.print("AirTemp: ");
lcd.setCursor(9, 0);
lcd.print(t_air);
lcd.print(" C ");
delay(5000);
lcd.clear();
// อุณหภูมิในดิน (เซลเซียส)
lcd.setCursor(0, 0);
lcd.print("SoilTemp: ");
lcd.setCursor(10, 0);
lcd.print(t_soil);
lcd.print(" C ");
delay(5000);
lcd.clear();
Blynk.virtualWrite(V1, f_air); // ส่งค่าอุณหภูมิ (ฟาเรนไฮต์) ไปยัง Virtual Pin V5
Blynk.virtualWrite(V2, h); // ส่งค่าอุณหภูมิไปยัง Virtual Pin V2
Blynk.virtualWrite(V3, t_air); // ส่งค่าความชื้นไปยัง Virtual Pin V3
Blynk.virtualWrite(V4, t_soil); // ส่งค่าความชื้นดินไปยัง Virtual Pin V4
}