- Back to Home »
- Arduino กับ LCD 16x2 + DHT11 + LM35 + PIR + 4 Relay ยำรวมกันในตัวเดียว
Posted by : Unknown
วันอาทิตย์ที่ 23 กุมภาพันธ์ พ.ศ. 2557
ปลายๆ กุมภา 57 : กรุงเทพ อากาศร้อนใช้ได้เลย... ความชื้นสัมพัทธ์ ประมาณนี้กำลังอึดอัด เหนี่ยวเหนอะ สุดๆ (ความชื้นที่กำลังสบายๆ เหมือนตอนหน้าหนาวคือ ประมาณ 40% ) |
อุปกรณ์สำหรับงานนี้ ... แต่มีรีเลย์เพิ่มมาด้วย เพราะ งานนี้ผมใส่ PIR sensor ที่ control 4 relay เข้าไปด้วย |
บอร์ดที่ใช้มี 2 ตัวซ้อนกัน คือ arduino UNO + Ethernet Shield |
Relay On เพราะ pir ตรวจเจอความเคลื่อนไหว |
DHT11 |
ข้อจำกัดอย่างหนึ่งที่เห็นจากโครงงานนี้คือ เมื่อใช้ arduino UNO ต่อกับ LCD คือ pin เต็ม |
serial ด้านขวามือ จะเห็นว่าผมเพิ่มประโยคให้พิมพ์แสดงผลจาก PIR |
วิธีการต่อขาของ LCD ขาไหนไปไหนดูกันเอาเอง |
โค้ดเที่ยวนี้ (อันไหนไม่ใช้ตัดออกได้)
สีแดง คือ ชุดคำสั่งแสดงผลอุณภูมิผ่าน LCD
สีดำ คือ ชุดคำสั่งควบคุม รีเลย์ โดยใช้ PIR sensor
#include <dht.h> // ไลบราลี่ที่ใช้ควบคุม DHT11
#include <LiquidCrystal.h> // ไลบราลี่ควบคุม LCD
#define dht_dpin 2 // สัญญาณเข้าบอร์ดที่ pin 2
#define RELAY_ON 1
#define RELAY_OFF 0
#define Relay_1 9 // รีเลยตัวที่ 1 เข้าที่ pin 9
#define Relay_2 10 // รีเลยตัวที่ 1 เข้าที่ pin 10
#define Relay_3 11 // รีเลยตัวที่ 1 เข้าที่ pin 11
#define Relay_4 12 // รีเลยตัวที่ 1 เข้าที่ pin 12/*-----( Declare objects )-----*/
/*-----( Declare Variables )-----*/
float temp;
int tempPin = 0;
int waittime; // Delay between changes
int inputPin = 13; // choose the input pin (for PIR sensor) สัญญาณของ PIC เข้าที่ pin 13
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
dht DHT;
LiquidCrystal lcd(3, 4, 5, 6, 7, 8); // ขาเข้าของ LCD ในโครงงานนี้คือ 3,4,5,6,7,8 จะเห็นว่าเมื่อต่อ LCD 1 ตัวจะเสีย pin ไป 6 ช่องเป็นอย่างต่ำ อันนี้ยังไม่รวมไฟบวก ไฟลบ เขียนและลบอีก
void setup(){
Serial.begin(9600);
delay(300);//Let system settle
Serial.println("Humidity and temperature\n\n");
lcd.begin(16, 2);
lcd.println("DHT11 LCD Show");
delay(1500);
waittime = 1000;
pinMode(inputPin, INPUT); // declare PIR-sensor as input ประกาศขาเข้าสัญญาณ PIR
pinMode(Relay_1, OUTPUT); // declare RELAY-channel 1 as output ผมต่อพ่วงกัน 4 ตัว คือ เปิดทีละ 4 ตัวเลย
pinMode(Relay_2, OUTPUT); // ประกาศขาออกคือ Relay (คือ ควบคุมรีเลย์นั่นเอง)
pinMode(Relay_3, OUTPUT); // ประกาศขาออกคือ Relay (คือ ควบคุมรีเลย์นั่นเอง)
pinMode(Relay_4, OUTPUT); // ประกาศขาออกคือ Relay (คือ ควบคุมรีเลย์นั่นเอง)
//-------( Initialize Pins so relays are inactive at reset)----
digitalWrite(Relay_1, RELAY_OFF);
digitalWrite(Relay_2, RELAY_OFF);
digitalWrite(Relay_3, RELAY_OFF);
digitalWrite(Relay_4, RELAY_OFF);
//---( THEN set pins as outputs )----
pinMode(Relay_1, OUTPUT);
pinMode(Relay_2, OUTPUT);
pinMode(Relay_3, OUTPUT);
pinMode(Relay_4, OUTPUT);
delay(4000); //Check that all relays are inactive at Reset
}
void loop(){
DHT.read11(dht_dpin);
temp = analogRead(tempPin); // สัญญาณอุณภูมิที่เป็นอนาลอก คือจาก LM35 ใช้ชื่อว่า temp
temp = temp * 0.48828125;
if (isnan(DHT.humidity) || isnan(DHT.temperature)) {
lcd.println("Failed to read from DHT");
}
else {
lcd.setCursor(0,0); // LCD เริ่มแสดงผลที่มุมซ้ายของแถวบนสุด
lcd.print("LEK Humidity="); // แสดงผล LEK Humidity=
lcd.print((float)DHT.humidity, 0); // คำสั่ง float เพื่อปัดจุดทศนิยมด้านหลังออก ถ้าไม่ปัดจะแสดงผลเช่น 29.00 คำสั่ง float จะปัด .00 ทิ้ง เหลือเพียง 29
lcd.print("%");
lcd.setCursor(0,1); // LCD เริ่มแสดงผลที่มุมซ้ายของแถวล่าง
lcd.print("T01=");
lcd.print((float)DHT.temperature, 0);
lcd.print("C, T02=");
lcd.print((float)temp, 0);
lcd.print("C");
delay(500);
val = digitalRead(inputPin); // read input value // ชุดคำสั่งนี้มาจาก PIR เพื่อสั่งเปิดหรือปิด รีเลย์ ถ้าจะให้แสดงแค่อุณภูมิ ลบทิ้งได้
if (val == HIGH) { // check if the input is HIGH
digitalWrite(Relay_1, RELAY_ON);// set the Relay ON
digitalWrite(Relay_2, RELAY_ON);// set the Relay ON
digitalWrite(Relay_3, RELAY_ON);// set the Relay ON
digitalWrite(Relay_4, RELAY_ON);// set the Relay ON
delay(5000); // for 5 seconds
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!"); // คำสั่งให้แสดงคำว่า motion detected เมื่อ PIR ตรวจพบความเคลื่อนไหว
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
digitalWrite(Relay_1, RELAY_OFF);// set the Relay OFF
digitalWrite(Relay_2, RELAY_OFF);// set the Relay OFF
digitalWrite(Relay_3, RELAY_OFF);// set the Relay OFF
digitalWrite(Relay_4, RELAY_OFF);// set the Relay OFF
if (pirState == HIGH){
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}
}
สอบถามหน่อยครับถ้าต้องการเขียนโค้ด รับค่าจาก PIR แล้วแสดงผลทางLCD โดยการถ้ามีการเคลื่อนไหว จอ LCD จะติด และถ้าไม่มีการเคลื่อนไหว
ตอบลบจอ LCD จะดับ อยากทราบว่าเขียนโค้ดอย่างไรครับ