#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "DHT.h"
#include <HTTPClient.h>
#define relayPin 18 // กำหนดพินสำหรับรีเลย์
#define ldrPin 35 // กำหนดพินสำหรับเซ็นเซอร์ความสว่าง LDR
#define DHT_PIN 15 // กำหนดพินสำหรับเซ็นเซอร์ DHT22
#define DHTTYPE DHT22 // กำหนดประเภทของเซ็นเซอร์ DHT
#define LED_PIN 33 // กำหนดพินสำหรับ LED
DHT dht(DHT_PIN, DHT22); // สร้างอ็อบเจกต์ DHT สำหรับเซ็นเซอร์ DHT22
LiquidCrystal_I2C lcd(0x27,20,4); // สร้างอ็อบเจกต์ LiquidCrystal_I2C สำหรับหน้าจอ LCD
LiquidCrystal_I2C lcd2(0x27,20,4); // สร้างอ็อบเจกต์ LiquidCrystal_I2C เพิ่มเติม
// Representasi sensor FC28 โดยใช้ค่าคงที่
#include "FC28.h"
#define SensorFC28_Pin 34 // กำหนดพินสำหรับเซ็นเซอร์ FC28
float soil_moisture; // ตัวแปรเก็บค่าความชื้นในดิน
FC28Sensor mySensor; // สร้างอ็อบเจกต์ FC28Sensor
const float gama = 0.7; // ค่าคงที่สำหรับการคำนวณความสว่าง
const float rl10 = 50; // ค่าคงที่สำหรับการคำนวณความสว่าง
void setup() {
Serial.begin(9600); // เปิดพอร์ต Serial สำหรับการแสดงผลบน Serial Monitor
Serial.flush(); // ล้างค่าใน Serial Buffer
pinMode(ldrPin, INPUT); // กำหนดพิน LDR เป็นอินพุต
pinMode(DHT_PIN, INPUT); // กำหนดพิน DHT22 เป็นอินพุต
pinMode(LED_PIN, OUTPUT); // กำหนดพิน LED เป็นเอาท์พุต
pinMode(relayPin, OUTPUT); // กำหนดพินรีเลย์เป็นเอาท์พุต
mySensor.initFC28Sensor(115200, SensorFC28_Pin); // เริ่มต้นใช้งานเซ็นเซอร์ FC28
Wire.begin(); // เริ่มต้นใช้งาน I2C
// กำหนดข้อความแสดงเริ่มต้นบนหน้าจอ LCD
Serial.println("Smart Farming System");
dht.begin(); // เริ่มต้นใช้งานเซ็นเซอร์ DHT22
lcd.init(); // เริ่มต้นใช้งานหน้าจอ LCD
lcd.backlight(); // เปิดไฟหน้าจอ LCD
lcd.setCursor(0,0); // กำหนดตำแหน่งแสดงผลบน LCD
lcd.print("Final Project");
lcd.setCursor(0,1);
lcd.print("IoT Bootcamp Edspert");
lcd.setCursor(0,2);
lcd.print("Smart Farming and");
lcd.setCursor(0,3);
lcd.print("Monitoring System");
delay(2000); // รอเป็นเวลา 2 วินาที
lcd.clear(); // ล้างหน้าจอ
}
void loop() {
// อ่านค่าจากเซ็นเซอร์ DHT22
float hum = dht.readHumidity(); // อ่านค่าความชื้นจาก DHT22
float temp = dht.readTemperature(); // อ่านค่าอุณหภูมิจาก DHT22
Serial.println("Suhu : " + String(temp, 2) + " °C"); // แสดงค่าอุณหภูมิบน Serial Monitor
Serial.println("Kelembaban : " + String(hum, 1) + " %"); // แสดงค่าความชื้นบน Serial Monitor
// อ่านค่าจากเซ็นเซอร์ LDR
int ldrValue = analogRead(ldrPin); // อ่านค่าความสว่างจาก LDR
ldrValue = map(ldrValue, 4095, 0, 1024, 0); // แปลงค่าอ่านจาก LDR
float ldrVoltage = ldrValue / 1024. * 5; // คำนวณแรงดันจากค่าอ่าน LDR
float ldrResistance = 2000 * ldrVoltage / (1-ldrVoltage/5); // คำนวณค่าเส้นคงที่ของ LDR
float lux = pow(rl10*1e3*pow(10,gama)/ldrResistance,(1/gama)); // คำนวณค่าความสว่างในหน่วย Lux
Serial.println("Kecerahan : " + String(lux, 3) + " Lux"); // แสดงค่าความสว่างบน Serial Monitor
String luxmsg = lux < 807 ? "Kurang" : lux > 808 && lux < 1614? "Medium" : "Tinggi"; // กำหนดข้อความสถานะความสว่าง
// อ่านค่าจากเซ็นเซอร์ Soil Moisture FC28
soil_moisture = mySensor.getSoilMoisture(); // อ่านค่าความชื้นในดินจากเซ็นเซอร์ Soil Moisture FC28
String msg = soil_moisture < 33.33 ? "Basah" : soil_moisture > 66.66 ? "Kering" : "Normal"; // กำหนดข้อความสถานะความชื้นในดิน
Serial.println("Soil Moisture Value : "+String(soil_moisture,2)+" %"); // แสดงค่าความชื้นในดินบน Serial Monitor
// Relay เพื่อควบคุมการรดน้ำตามสถานะความชื้นในดิน
if((soil_moisture > 66.66)){
digitalWrite(relayPin, HIGH); // เปิดรีเลย์เมื่อความชื้นในดินต่ำ
}
else{
digitalWrite(relayPin, LOW); // ปิดรีเลย์เมื่อความชื้นในดินเพียงพอ
}
// แสดงข้อมูลบนหน้าจอ LCD เพื่อตรวจสอบสถานะการปลูกพืช
// สถานะของดิน
lcd.setCursor(0,0);
lcd.print("Tanah :");
lcd.setCursor(13,0);
lcd.print(msg);
// สถานะของความสว่างและสถานะการเปิด LED
if (lux < 807){
digitalWrite(LED_PIN, HIGH);
lcd.setCursor(0,1);
lcd.print("Kecerahan : ");
lcd.setCursor(13,1);
lcd.print(luxmsg);
}
else if (lux > 808 && lux < 1614){
digitalWrite(LED_PIN, LOW);
lcd.setCursor(0,1);
lcd.print("Kecerahan : ");
lcd.setCursor(13,1);
lcd.print(luxmsg);
}
else{
digitalWrite(LED_PIN, LOW);
lcd.setCursor(0,1);
lcd.print("Kecerahan : ");
lcd.setCursor(13,1);
lcd.print(luxmsg);
}
// สถานะของอุณหภูมิ
lcd.setCursor(0,2);
lcd.print("Suhu :");
lcd.setCursor(13,2);
lcd.print(temp);
lcd.setCursor(19,2);
lcd.print("C");
// สถานะของความชื้น
lcd.setCursor(0,3);
lcd.print("Kelembaban :");
lcd.setCursor(13,3);
lcd.print(hum);
lcd.setCursor(19,3);
lcd.print("%");
Serial.println("--------------"); // ขีดกลางระหว่างข้อมูล
delay(2000); // รอเป็นเวลา 2 วินาที
lcd.clear(); // ล้างหน้าจอ LCD
sendDataToServer(soil_moisture, lux, temp, hum); // ส่งข้อมูลไปยังเซิร์ฟเวอร์
delay(2000); // รอเป็นเวลา 2 วินาที
lcd.clear(); // ล้างหน้าจอ LCD
}
void sendDataToServer(float soil_moisture, float lux, float temp, float hum) {
HTTPClient http;
http.begin("http://172.111.138.132:8000/post"); // กำหนด URL ของเซิร์ฟเวอร์ที่รับข้อมูล
http.addHeader("Content-Type", "application/json"); // กำหนดส่วนหัวของข้อมูลเป็น JSON
String httpRequestData = "{\"soil_moisture\": " + String(soil_moisture)
+ ", \"lux\": " + String(lux)
+ ", \"temperature\": " + String(temp)
+ ", \"humidity\": " + String(hum) + "}"; // สร้าง JSON ข้อมูล
int httpResponseCode = http.POST(httpRequestData); // ส่งข้อมูลด้วย POST request
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println(httpResponseCode); // แสดงรหัสสถานะ HTTP response บน Serial Monitor
Serial.println(response); // แสดงข้อมูลตอบกลับจากเซิร์ฟเวอร์บน Serial Monitor
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode); // แสดงข้อความเมื่อเกิดข้อผิดพลาดในการส่งข้อมูล
}
http.end(); // ปิดการเชื่อมต่อ HTTP
}