//=====================================================
// File name: W4S7-DHT22-LCD.ino
// Developer: Panwad Phaenghorphan, Nitedkaset KMITL
//======================================================
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 13 // ขา D13 ที่ต่อกับ DHT22
#define DHTTYPE DHT22 // ประเภทของ DHT22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 คือที่อยู่ I2C ของหน้าจอ 16x2
float previousTemperature = 0.0; // ค่าอุณหภูมิก่อนหน้า
float previousHumidity = 0.0; // ค่าความชื้นก่อนหน้า
bool temperatureChanged = false; // ตัวแปรสถานะเมื่อมีการเปลี่ยนแปลงค่าอุณหภูมิ
bool humidityChanged = false; // ตัวแปรสถานะเมื่อมีการเปลี่ยนแปลงค่าความชื้น
unsigned long t = 0;
void ledblinkmillis(){
if (millis()-t>100){
t=millis();
if (digitalRead(12)==1){
digitalWrite(12,0);
}
else digitalWrite(12,1);
}
}
void setup() {
lcd.init();
lcd.begin(16,2); // กำหนดขนาดหน้าจอ 16x2
lcd.backlight(); // เปิดแสงหน้าจอ
pinMode(12, OUTPUT);
Serial.begin(115200);
dht.begin();
lcd.setBacklight(HIGH);
lcd.setCursor(2, 0);
lcd.print("K217 FARM"); // ข้อความ Developer
lcd.setCursor(4, 1);
delay(2000);
}
void blinkText(const char* text, int row) {
byte i;
for (i = 0; i < 6; i++) {
lcd.setCursor(7, row); // ตำแหน่งที่ต้องการให้กระพริบ (ตำแหน่งที่ 8 ของแถวที่กำหนด)
lcd.print(" "); // ลบข้อความที่แสดงอยู่ก่อนหน้า
delay(250);
lcd.setCursor(7, row); // ตำแหน่งที่ต้องการให้กระพริบ (ตำแหน่งที่ 8 ของแถวที่กำหนด)
lcd.print(text); // แสดงข้อความ
delay(300);
}
}
void loop() {
float currentTemperature = dht.readTemperature(); // อ่านค่าอุณหภูมิปัจจุบัน
float currentHumidity = dht.readHumidity(); // อ่านค่าความชื้นจาก DHT22
lcd.clear();
Serial.print("Temperature: ");
Serial.print(currentTemperature);
Serial.print(" °C, Humidity: ");
Serial.print(currentHumidity);
Serial.println(" %");
char bufTemperature[6]; // ประกาศตัวแปร buf ที่มีขนาดเท่ากับสตริงที่ต้องการแปลง (6 ตัวอักษร)
char bufHumidity[6]; // ประกาศตัวแปร buf ที่มีขนาดเท่ากับสตริงที่ต้องการแปลง (6 ตัวอักษร)
ledblinkmillis();
lcd.setCursor(0, 0); // กำหนดตำแหน่งเริ่มต้นในการแสดงผล (แถวที่ 1)
lcd.print("Temp : ");
lcd.print(dtostrf(currentTemperature, 4, 1, bufTemperature)); // แปลงค่าอุณหภูมิเป็นสตริงพร้อมทศนิยม 1 ตำแหน่ง
lcd.print(" C");
ledblink();
lcd.setCursor(0, 1); // กำหนดตำแหน่งเริ่มต้นในการแสดงผล (แถวที่ 2)
lcd.print("Humi : ");
lcd.print(dtostrf(currentHumidity, 4, 1, bufHumidity)); // แปลงค่าความชื้นเป็นสตริงพร้อมทศนิยม 1 ตำแหน่ง
lcd.print(" %");
//ledblink();
// เช็คว่าค่าอุณหภูมิเปลี่ยนแปลงหรือไม่
if (currentTemperature != previousTemperature) {
temperatureChanged = true;
previousTemperature = currentTemperature;
} else {
temperatureChanged = false;
}
// เช็คว่าค่าความชื้นเปลี่ยนแปลงหรือไม่
if (currentHumidity != previousHumidity) {
humidityChanged = true;
previousHumidity = currentHumidity;
} else {
humidityChanged = false;
}
// ตรวจสอบการเปลี่ยนแปลงในอุณหภูมิและความชื้น
if (temperatureChanged) {
lcd.setBacklight(HIGH); // เปิดแสงหน้าจอ
Serial.println("Temperature changed!");
blinkText(bufTemperature, 0);
} else if (humidityChanged) {
lcd.setBacklight(HIGH); // เปิดแสงหน้าจอ
Serial.println("Humidity changed!");
blinkText(bufHumidity, 1);
} else {
Serial.println("Temperature and humidity same!");
delay(2000);
for (int i = 0; i < 13; i++) {
lcd.scrollDisplayLeft();
delay(250);
}
}
delay(250); // หน่วงเวลา 1/4 วินาที
}
void ledblink(){
digitalWrite(12,1);
delay(500);
digitalWrite(12,0);
delay(500);
digitalWrite(12,1);
delay(500);
digitalWrite(12,0);
delay(500);
}