#include <DHT.h> //เรียกใช้งาน Library DHT สำหรับตัววัดอุณหภูมิและความชื้น
#include <Wire.h> //เรียกใช้งาน Library Wire สำหรับใช้งานในการสื่อสารแบบ I2C
#include <LiquidCrystal_I2C.h> //เรียกใช้งาน Library ของจอ LCD แบบI2C
#include <Servo.h> //เรียกใช้งาน Library ในการควบคุมเซอร์โวมอเตอร์
#define DHTPIN 13 //define DHTPIN ให้มีค่าเท่ากับ 4(ขาบอร์ดที่ต่อกับเซ็นเซอร์ DHT22)
#define DHTTYPE DHT22 //define DHTTYPE ให้มีค่าเท่ากับ DHT22 (ชนิดของเซ็นเซอร์ DHT)
Servo myservo; //ประกาศตัวแปรประเภท Servo ชื่อ myservo
int pos = 0; //ประกาศตัวแปร pos ชนิด int มีค่าเท่ากับ 0
int r1 = 12; //กำหนดให้ r1 แทนขา 12
int gLED = 3;//กำหนดให้ gLED1(สีเขียว) แทนขา 3
float h; //ประกาศตัวแปร h ชนิด float
float t; //ประกาศตัวแปร t ชนิด float
//---------- LCD ----------//
// Set the LCD address to 0x27 for a 20 ตัวอักษร และ 4 บรรทัดในการแสดงผล
LiquidCrystal_I2C lcd(0x27,20,4);
//---------- DHT22 ----------//
DHT dht(DHTPIN,DHTTYPE); //เรียกใช้ไลบรารี่ DHT โดยใช้ชื่อ dht
void setup()
{
Serial.begin(115200); // ตั้งความเร็วสื่อสารที่ 115200
dht.begin(); //ตั้งค่าเริ่มต้นใช้งาน เซ็นเซอร์ DHT ที่ชื่อ dht
// initialize Timer counter
noInterrupts(); // disable all interrupts
TCCR1A = 0; // กำหนดค่าเริ่มต้นของ timer
TCCR1B = 0; // เคลียร์ทุกบิต
TCNT1 = 59286; // preload timer 65536-16MHz/256*10Hz ทุกๆ 0.1 s
TCCR1B = 0; // ตั้งค่าเป็น normal mode (Have a look at Table 2-2)
TCCR1B |= (1 << CS12); // ตั้งค่าเลือกใช้งาน prescaler ที่ 256
TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt(เปิดการทำงานการขัดจังหวะ)
interrupts(); // enable all interrupts
lcd.init(); //ตั้งค่า initialize the lcd
lcd.backlight(); //ตั้งค่าให้ backlight ติด
pinMode(r1, OUTPUT); //ตั้งค่าให้ r1 ทำงานเป็นเอาต์พุต
pinMode(gLED, OUTPUT); //ตั้งค่าให้ gLED ทำงานเป็นเอาต์พุต
myservo.attach(9); //ตั้งค่าการส่งสัญญาณ pwm เพื่อควบคุม servo ที่ pin 9
}
// เมื่อเกิด overflow จะส่งสัญญาณ interrupts ในโปรแกรม interrupts
ISR(TIMER1_OVF_vect)
{
TCNT1 = 59286; // preload timer 65536-16MHz/256*10Hz ทุกๆ 0.1 s
t = dht.readTemperature(); //คำสั่งอ่านค่าความชื้นในอากาศเป็นเปอร์เซ็นต์ เก็บไว้ในตัวแปร h
h = dht.readHumidity(); //คำสั่งอ่านค่าอุณหภูมิในหน่วยองศาเซลเซียส เก็บไว้ในตัวแปร t
//แสดงผลข้อความและข้อมูลอุณหภูมิและความชื้นที่วัดได้ออกทาง serial monitor
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.println(F("°C "));
}
void loop()
{
lcd.setCursor(0,0) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 0 บรรทัดที่ 0
lcd.print("Temp & Humid Control"); //แสดงผลข้อความ "Temp & Humid Control"
lcd.setCursor(0,1) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 0 บรรทัดที่ 1
lcd.print("Temp : "); //แสดงผลข้อความ "Temp : "
lcd.setCursor(7,1) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 7 บรรทัดที่ 1
lcd.print(t); //แสดงผลค่าที่อ่านได้จาก dht ที่เก็บไว้ในตัวแปร t
lcd.setCursor(12,1) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 12 บรรทัดที่ 1
lcd.print(" C"); //แสดงผลข้อความ " C"
lcd.setCursor(0,2) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 0 บรรทัดที่ 2
lcd.print("Humid : "); //แสดงผลข้อความ "Humid : "
lcd.setCursor(7,2) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 7 บรรทัดที่ 2
lcd.print(h); //แสดงผลค่าที่อ่านได้จาก dht ที่เก็บไว้ในตัวแปร h
lcd.setCursor(12,2) ; //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 12 บรรทัดที่ 2
lcd.print(" %"); //แสดงผลข้อความ " %"
if (t >25 && h<60) //เช็คเงื่อนไขถ้า t>25และh<60 จะให้ทำตามคำสั่งนี้
{
//ให้ r1 ทำงาน(relay switch on) LEDสีแดง กับ servo ที่ต่อกับrelay เริ่มทำงานด้วย
digitalWrite(r1,HIGH);
lcd.setCursor(4,3); //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 4 บรรทัดที่ 3
lcd.print("Sprinkler ON"); //แสดงผลข้อความ "Sprinkler ON"
for(pos=0;pos<=180;pos+=1){ //หมุนจาก 0 องศา ถึง 180 องศา
myservo.write(pos); // สั่งให้ servo หมุนตามค่าของตัวแปร pos
delay(10);} //หน่วงเวลา 0.01 วินาที
}
else if (t==25 && h==60) //เช็คเงื่อนไขถ้า t=25และh=60 จะให้ทำตามคำสั่งนี้
{
digitalWrite(r1,LOW); //ให้ r1 หยุดทำงาน(relay switch off)
digitalWrite(gLED, HIGH); //ให้ LEDสีเขียว ไฟติด
lcd.setCursor(3,3); //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 3 บรรทัดที่ 3
lcd.print("Sprinkler OFF"); //แสดงผลข้อความ "Sprinkler OFF"
}
else
{
digitalWrite(r1,LOW); //สั่งให้ r1 หยุดทำงาน(relay switch off)
digitalWrite(gLED, LOW); //ให้ LEDสีเขียว ไฟดับ
lcd.setCursor(3,3); //กำหนดตำแหน่ง Cursor เริ่มที่ตัวอักษรที่ 3 บรรทัดที่ 3
lcd.print("Sprinkler OFF"); //แสดงผลข้อความ "Sprinkler OFF"
}
}