Posted by : Unknown วันอาทิตย์ที่ 23 กุมภาพันธ์ พ.ศ. 2557

ปลายๆ กุมภา 57 : กรุงเทพ อากาศร้อนใช้ได้เลย... ความชื้นสัมพัทธ์ ประมาณนี้กำลังอึดอัด เหนี่ยวเหนอะ สุดๆ  (ความชื้นที่กำลังสบายๆ เหมือนตอนหน้าหนาวคือ ประมาณ 40% )
 T01 คือ อุณภูมิจาก DHT11 , T02 คือ อุณภูมิจาก LM35 (จากที่สังเกตุบางช่วงก็ใกล้เคียงกัน บางช่วงก็ห่างกันอย่างที่เห็นในภาพ)

อุปกรณ์สำหรับงานนี้ ... แต่มีรีเลย์เพิ่มมาด้วย เพราะ งานนี้ผมใส่ 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;

    }

}
}
}

 

{ 1 ความคิดเห็น... read them below or add one }

  1. สอบถามหน่อยครับถ้าต้องการเขียนโค้ด รับค่าจาก PIR แล้วแสดงผลทางLCD โดยการถ้ามีการเคลื่อนไหว จอ LCD จะติด และถ้าไม่มีการเคลื่อนไหว
    จอ LCD จะดับ อยากทราบว่าเขียนโค้ดอย่างไรครับ

    ตอบลบ

- Copyright © arduino Thai for fun - Skyblue - Powered by Blogger - Designed by Johanes Djogan -