วันจันทร์ที่ 1 ตุลาคม พ.ศ. 2561

How To Make Arduino Based Home Automation Project via Bluetooth

Circuit Diagram

Arduino Based Home Automation Circuit Diagram

Hardware

1. Arduino uno R3

2. Module Relay

3. HC – 05 Bluetooth Module

4. โทรศัพท์



Software

#include <SoftwareSerial.h> //อ่านไฟล์จากไดเร็กทอรี
const int rxPin = 4;//ตัวแปร rxPin เท่ากับ 
const int txPin = 2;//ตัวแปร txpin เท่ากับ 2
SoftwareSerial mySerial(rxPin, txPin);//SoftwareSerialกำหนกพอร์ต rxPin และ txPin
const int Loads[] = {9, 10, 11, 12};//Loads มีค่าเท่ากับ 9.10.11.12
int state = 0;//state มีค่าเท่ากับ 0
int flag = 0;//flag มีค่าเท่ากับ 0
void setup()//ประกาศค่าเริ่มต้น
{
for (int i=0;i<4;i++)//กำหนดไห้ i เท่ากับ 0 ถ้า i น้อยกว่า 4 i จะเพิ่มขึ้นทีละ 1
{
pinMode(Loads[i], OUTPUT);//ขา Loads เป็น OUTPUT
}
mySerial.begin(9600);
for (int i=0;i<4;i++)//กำหนดไห้ i เท่ากับ 0 ถ้า i น้อยกว่า 4 i จะเพิ่มขึ้นทีละ 1
{
digitalWrite(Loads[i], LOW);//loade เป็น LOW
}
}
void loop()//ฟังก์ชั่นวนลูป
{
if(mySerial.available() > 0)//mySerial.available มีค่ามากกว่า 0 ไห้ทำปีกกาข้างล่าง
{
state = mySerial.read();//อ่าตัวแปรของ state
flag=0;//flag เท่ากับ 0
}
switch(state)//ทำงานโดยเลือกเงื่อนไขไหนก็ได้
{
case '0':digitalWrite(Loads[0], HIGH);//ไห้ loads เป็น 0 HIGH
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '1':digitalWrite(Loads[0], LOW);//ไห้ loads เป็น 0 LOW
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '2':digitalWrite(Loads[1], HIGH);//ไห้ loads เป็น 1 HIGH
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '3':digitalWrite(Loads[1], LOW);//ไห้ loads เป็น 1 LOW
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '4':digitalWrite(Loads[2], HIGH);//ไห้ loads เป็น 2 HIGH
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '5':digitalWrite(Loads[2], LOW);//ไห้ loads เป็น 2 LOW
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '6':digitalWrite(Loads[3], HIGH);//ไห้ loads เป็น 3 HIGH
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '7':digitalWrite(Loads[3], LOW);//ไห้ loads เป็น 3 LOW
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
case '8':digitalWrite(Loads[0], LOW);//เงื่อนไข 8 digitalWrite ไห้ loads 0 LOW
 ดdigitalWrite(Loads[1], LOW);//digitalWrite ไห้ loads 1 LOW
digitalWrite(Loads[2], LOW);//digitalWrite ไห้ loads 2 LOW
digitalWrite(Loads[3], LOW);//digitalWrite ไห้ loads 3 LOW
flag=1;//flag เท่ากับ 1
break;//คำสั่งไห้ออกจาก loop
}
} flowchart


Arduino Home Automation

ผิดพลาดประการใด ขออภัยมา ณ ที่นี้

วันพุธที่ 26 กันยายน พ.ศ. 2561

งานที่ 18

                         ใบรายงานผลการปฏิบัติงาน
Code

#include <SoftwareSerial.h>   // การอ่านไฟล์จากไดเร็กทอรี หรือโฟลเดอร์ที่กำหนดไว้
#include <DHT11.h> 
//=============================================
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>    
LiquidCrystal_I2C lcd(0x3F, 16, 2); //ฟังก์ชั่นของ lcd กำหนดให้ ตัวอักษรที่16 แถวที่2
SoftwareSerial ArduinoSerial(3, 2); // RX, TX    // ฟังก์ชั่นพิเศษ ของSoftwareSerial กำหนดให้ 3คือ rx 2คือ tx
//=============================================
int SW_ON = 4,SW_OFF = 5,pin=6; //กำหนดขา INPUT 
int Sun = 9,CSun = 0,Relay1 = 12, Relay2 = 11; //กำหนดขา OUTPUT   
int ATL = A0,ATH = A1;//กำหนดขา Analog
int VTL1 = 0,VTH1 = 0,TL = 0,TH =0,VRHL = 50,VRHH = 80; 
DHT11 dht11(pin);
//============================================= 
void setup()    // ฟังก์ชั่นใช้ในการประกาศค่าเริ่มต้น  
{
  lcd.begin();   // การทำงานเริ่มต้นของ lcd 
  Serial.begin(115200);  //ประกาศการใช้งานการสื่อสารรับส่งข้อมูลผ่าน พอร์ตRS232
  ArduinoSerial.begin(4800); 
  while (!Serial){ // คำสั่ง While คือเงื่อนไขที่จะทำการตรวจสอบว่าเป็นจริงหรือเท็จ
    ;
    }
  //===================================================== 
  lcd.setCursor(0, 0);  //ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ ตัวอักษรที่0เเถว0
  lcd.print("Elec ");    // เเสดงข้อความคำว่า Elec
  lcd.setCursor(0, 1); //ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ ตัวอักษรที่0เเถว1
  lcd.print("Smart Farm 2018 "); // เเสดงข้อความคำว่า Smart Farm 2018
  delay(5000);  // หน่วงเวลา
  //====================================================
  pinMode(Relay1, OUTPUT);     //กำหนด Relay 1 ให้เป็น OUTPUT
  pinMode(Relay2, OUTPUT);     //กำหนด Relay 2 ให้เป็น OUTPUT
  pinMode(SW_ON, INPUT);      //กำหนด SW_ON ให้เป็น INPUT
  pinMode(SW_OFF, INPUT);     //กำหนด SW_OFFให้เป็น INPUT
  pinMode(Sun, INPUT);            //กำหนด SUN ให้เป็น INPUT
  digitalWrite(Relay1, HIGH);    //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล   
  digitalWrite(Relay2, HIGH);   //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล   
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");  
}
//=============================================================
void loop()   
{
  while (ArduinoSerial.available() > 0) {   // คำสั่ง While คือเงื่อนไขที่จะทำการตรวจสอบว่าเป็นจริงหรือเท็จ
  float val = ArduinoSerial.parseFloat(); 
  if (ArduinoSerial.read() == '\n') {
  if (val == 10) {
  digitalWrite(13, 1); // ทำหน้าที่เขียนค่า 1  ไปยังขาดิจิตอล
  } else if (val == 11) {
  digitalWrite(13, 0); //ทำหน้าที่เขียนค่า 0 ไปยังขาดิจิตอล
  }
  Serial.println(val);
  }
  }
  delay(100);
  //========ปรับค่าอุณหภูมิอ้างอิง====================================
  CSun = digitalRead(Sun);   
  int err;    
  float temp, humi;   // ตัวแปรชนิด floating-point หรือตัวแปรที่มีจุดทศนิยม
  if((err=dht11.read(humi, temp))==0)  // คำสั่งในการตัดสินใจ แบบตัวเลือกเดียว โดยใช้งานร่วมกับ ==,                                                                                   !=, <, >เพื่อใช้ในการ  ตัดสินใจในการหาคำ
  {
  VTL1 = analogRead(ATL);
  VTH1 = analogRead(ATH);
  TL = map(VTL1,0,1023,10,30);
  TH = map(VTH1,0,1023,25,45);
  Serial.print("TL :");Serial.print(TL);Serial.println("*C");
  Serial.print("TH :");Serial.print(TH);Serial.println("*C");
  //===========================================================
    int Stemp =(int)(temp);int Shumi=(int)(humi);//ตัดทศนิยม
    Serial.print("temp :");Serial.print(Stemp);Serial.println("*C");
    Serial.print("humidity :");Serial.print(Shumi);Serial.println("%");
    Serial.print("SUN :");Serial.println(CSun);//Serial.println();
    //===================================================
    lcd.setCursor(0, 0);lcd.print("TL:");lcd.print(TL);
    lcd.setCursor(6, 0);lcd.print("TH:");lcd.print(TH);
    lcd.setCursor(12, 0);lcd.print("S1:");lcd.print(!CSun);
    lcd.setCursor(0, 1);lcd.print("TN:");lcd.print(Stemp);
    lcd.setCursor(6, 1);lcd.print("RH:");lcd.print(Shumi);
    lcd.setCursor(12, 1);lcd.print("P1:0");lcd.print(Shumi);
    delay(1000);
    //===================================================
   //=======ควบคุมอุณหภูมิ===========================
   if(temp < TL && temp < TH ){
        digitalWrite(Relay1, HIGH);// ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0");
        delay(100);   // หน่วงเวลา
        digitalWrite(Relay2, LOW);//ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล หลอดไฟทำงาน 
        lcd.setCursor(12, 0);lcd.print("L1:1");
        delay(60000);                         //หน่วงเวลา 1 นาที 
      }else if(temp > TL && temp > TH){
        digitalWrite(Relay2, HIGH); //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล หลอดไฟไม่ทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:0"); 
        delay(100);
        digitalWrite(Relay1, LOW); //ทำหน้าที่เขียนค่า LOW ไปยังขาดิจิตอล ปั๊มน้ำทำงาน 
        lcd.setCursor(12, 1);lcd.print("P1:1");
        delay(60000);                        //หน่วงเวลา 1 นาที 
      }else if(temp > TL && temp < TH){
       //=======ควบคุมความชื้น===========================
      if(humi < VRHL && humi < VRHH){
        digitalWrite(Relay2, HIGH); //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล หลอดไฟไม่ทำงาน
        lcd.setCursor(12, 0);lcd.print("L1:0"); 
        delay(100);
        digitalWrite(Relay1, LOW); //ทำหน้าที่เขียนค่า LOW ไปยังขาดิจิตอล ปั๊มน้ำทำงาน 
        lcd.setCursor(12, 1);lcd.print("P1:1");
        delay(60000);                       //หน่วงเวลา 1 นาที 
      }else if(humi > VRHL && humi > VRHH){
        digitalWrite(Relay1, HIGH); //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0");
        delay(100);
        digitalWrite(Relay2, LOW); //ทำหน้าที่เขียนค่า LOW ไปยังขาดิจิตอล หลอดไฟทำงาน 
        lcd.setCursor(12, 0);lcd.print("L1:1");
        delay(60000);//หน่วงเวลา 1 นาที 
      }else if(humi > VRHL && humi < VRHH){
        //delay(1000);
        digitalWrite(Relay1, HIGH); //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล ปั๊มน้ำหยุดทำงาน
        lcd.setCursor(12, 1);lcd.print("P1:0"); 
        digitalWrite(Relay2, HIGH); //ทำหน้าที่เขียนค่า HIGH ไปยังขาดิจิตอล หลอดไฟไม่ทำงาน  
        lcd.setCursor(12, 0);lcd.print("L1:0");
        //หน่วงเวลา 1 นาที        
        }
     //=======ENDควบคุมความชื้น===========================       
        }
     //=======ENDควบคุมอุณหภูมิ===========================
  }
  else
  {
    Serial.println();Serial.print("Error No :");
    Serial.print(err);Serial.println();    
  }
 delay(DHT11_RETRY_DELAY); 

}




ภาพจำลองการทำงานด้วยโปรแกรม Proteus






อธิบายการทำงานของโปรแกรม

เมื่อกดSW_ON  ขึ้นคำว่า  Elec Smart Farm 2018   ใช้ LDR รับค่าเเทนเเสงอาทิตย์

เมื่อค่า ถึงค่าที่กำหนด  Relay ก็จะทำงาน เเละเเสดงผลบน LCD Relay เเต่ละอันทำงานตอนที่

อุณหภูมิเเละความชิ้นที่ เเตกต่างกัน เมื่อ กด SW_OFF หยุดการทำงานทุกอย่าง