วันพุธที่ 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 หยุดการทำงานทุกอย่าง

งานที่ 17

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

#include <LiquidCrystal_I2C.h>    // การอ่านไฟล์จากไดเร็กทอรี หรือโฟลเดอร์ที่กำหนดไว้
LiquidCrystal_I2C lcd(0x27,16,2);  //ฟังก์ชั่นของ lcd กำหนดให้ ตัวอักษรที่16 แถวที่2
int aVal=0,tempaVal=0;   /ตัวแปรพื้นฐานที่เก็บตัวเลขโดยไม่มีจุดทศนิยม
const int SW_ON = 2;       //เป็นตัวกำหนดตัวแปรที่ทำให้ตัวแปรสามารถ "อ่านได้อย่างเดียว  
const int led_ON =  13; int CSW_ON = 0; int C_CSW_ON =0;
int Relay1=12,Relay2=11,Relay3=10,Relay4=9;
int sensorPin = A0;
int sensorValue = 0;
void setup() {   // ฟังก์ชั่นใช้ในการประกาศค่าเริ่มต้น  
  lcd.backlight();   // ไฟเเบคไลท์  
  lcd.begin();   // การทำงานเริ่มต้นของ lcd 
  Serial.begin(9600);  //ประกาศการใช้งานการสื่อสารรับส่งข้อมูลผ่าน พอร์ตRS232
  pinMode(led_ON, OUTPUT);
  pinMode(SW_ON, INPUT);
  pinMode(Relay1,OUTPUT);  
  pinMode(Relay2,OUTPUT);   //การกำหนดหน้าที่ของขาว่าเป็นอินพุตหรือเอาต์พุต
  pinMode(Relay3,OUTPUT);
  pinMode(Relay4,OUTPUT);

  digitalWrite(Relay1,HIGH);
  digitalWrite(Relay2,HIGH);
  digitalWrite(Relay3,HIGH);  //การกำหนดหน้าที่ของขาว่าเป็นอินพุตหรือเอาต์พุต
  digitalWrite(Relay4,HIGH);
  lcd.setCursor(0,0);   //ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ ตัวอักษรที่0เเถว0
  lcd.print("Project2017");  // เเสดงตัวอักษร
  lcd.setCursor(0,1);   //ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ ตัวอักษรที่0เเถว1
  lcd.print("standby");  
}
//END Setup
void loop() {   // ฟังก์ชั่นใช้ในการเขียนโค้ดโปรแกรมการทำงานของArduinoเป็นฟังก์ชั่นการวนลูปไปเรื่อยๆ
  CSW_ON = digitalRead(SW_ON);    //เป็นฟังก์ชันที่ใช้ในการอ่านค่าจากขาแบบเฉพาะเจาะจง มีค่าเป็น HIGH หรือ LOW
  sensorValue = analogRead(sensorPin);//Serial.println(sensorValue);
  //=======================================================================
  int c_sensorValue1 = map(sensorValue,0,1023,0,255); //เป็นฟังก์ชันที่ใช้ในการจับคู่หมายเลขจากช่วงหนึ่งไปเป็นช่วงอื่นๆ 
  //Serial.print("c_sensorValue1 = ");Serial.println(c_sensorValue1);
  int c_sensorValue2 = map(sensorValue,0,1023,255,0);
  //Serial.print("c_sensorValue2 = ");Serial.println(c_sensorValue2);
  //=======================================================================
  //check SW_ON
  if (CSW_ON == LOW) { delay(1000); 
    lcd.clear();  //ล้างหน้าจอ
    C_CSW_ON++;
      Serial.print("C_CSW_ON = ");Serial.println(C_CSW_ON);
    //OPEN Project
    digitalWrite(led_ON, HIGH);
  //END check SW_ON
    if(C_CSW_ON == 1){
    lcd.setCursor(0,0);
    lcd.print("Power On ");
    delay(1000);
    lcd.clear();
    lcd.print("Power On ");
    delay(1000);
    lcd.clear();
    }
  }
  if(C_CSW_ON == 1){//OPEN PROJECT // คำสั่งในการตัดสินใจ แบบตัวเลือกเดียว โดยใช้งานร่วมกับ                                                                                             ==, !=, <, >เพื่อใช้ในการ  ตัดสินใจในการหาคำ
    digitalWrite(led_ON, HIGH);    //ทำหน้าที่เขียนค่า HIGH หรือ LOW ไปยังขาดิจิตอล
    //delay(1000);
    digitalWrite(Relay1, HIGH);
    //ตรวจสอบค่า VR================
      //lcd.clear();
      lcd.setCursor(0,0);     //ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ ตัวอักษรที่0เเถว0
      lcd.print(c_sensorValue1);  
      lcd.print(" ");
      //==============================
      if(c_sensorValue1 >= 150){
      digitalWrite(Relay2, LOW);
      }else{
        digitalWrite(Relay2, HIGH);
        }
      //=============================
   RelaySTART();     // ใช้ฟังก์ชั่น RelaySTART
    }else{//OFF PROJECT
    lcd.setCursor(0,0);
    //lcd.print("Power Off");
    lcd.setCursor(0,1);
    lcd.print("standby");
    digitalWrite(led_ON, LOW); C_CSW_ON = 0;
    RelaySTOP();
    }
  }//END Loop
//======โปรแกรมย่อย==========
void RelaySTOP(){                 // เขียนฟังก์ชั่นขึ้นมาโดยใช้ชื่อ RelaySTOP
digitalWrite(Relay1,HIGH); 
digitalWrite(Relay2,HIGH);  //ทำหน้าที่เขียนค่า HIGH หรือ LOW ไปยังขาดิจิตอล
digitalWrite(Relay3,HIGH);
digitalWrite(Relay4,HIGH);  
  }
void RelaySTART(){       // เขียนฟังก์ชั่นขึ้นมาโดยใช้ชื่อ RelaySTART
digitalWrite(Relay1,LOW);
digitalWrite(Relay2,LOW); //ทำหน้าที่เขียนค่า HIGH หรือ LOW ไปยังขาดิจิตอล
digitalWrite(Relay3,LOW);
digitalWrite(Relay4,LOW); 
}  




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









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

เมื่อกดสวิตซ์ ขึ้นข้อความบน LCD ว่า Power on LED เเละหลอดไฟติด 1วิ พอดับ 

ขึ้นคำว่า Power off

งานที่ 16

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

#include <Stepper.h>    // การอ่านไฟล์จากไดเร็กทอรี หรือโฟลเดอร์ที่กำหนดไว้
#include "Keypad.h" 
#define STEP_ANGLE_4STEP 32 //360/11.25 degree   //  ใช้เพื่อตั้งชื่อค่าคงที่
#define STEP_OUT_WITH_GEAR 2048 //32*64
Stepper stepper(STEP_ANGLE_4STEP,8,10,9,11);
char keys[4][4]={   // เก็บข้อมูลที่ หน่วยความจำ ไบต์
  {'7','8','9','A'},
  {'4','5','6','B'},
  {'1','2','3','C'},
  {'*','0','#','D'}};
byte rowPins[] = {7,6,5,4};
byte colPins[] = {3,2,1,0};
int speedmotor = 400;   /ตัวแปรพื้นฐานที่เก็บตัวเลขโดยไม่มีจุดทศนิยม
int dirmotor = 1;
Keypad keypad = Keypad(makeKeymap(keys),rowPins,colPins,4,4); //ฟังก์ของkeypad
void setup()    // ฟังก์ชั่นใช้ในการประกาศค่าเริ่มต้น  
{
}
void loop()  // ฟังก์ชั่นใช้ในการเขียนโค้ดโปรแกรมการทำงานของArduinoเป็นฟังก์ชั่นการวนลูปไปเรื่อยๆ 
{
  char key = keypad.getKey();  
  if (key != NO_KEY)  // คำสั่งในการตัดสินใจ แบบตัวเลือกเดียว โดยใช้งานร่วมกับ ==, !=, <, >เพื่อใช้ใน                                                       การ  ตัดสินใจในการหาคำ
  {
        if (key == '1')
            speedmotor = 400;
        if (key == '2')
            speedmotor = 700;
        if (key == '3')
            speedmotor = 1000;  
        if (key == 'A')
            dirmotor = 1;
        if (key == 'B')
            dirmotor = -1;     
        if (key == 'C')
            dirmotor = 0; 
  }
  stepper.setSpeed(speedmotor);
  stepper.step(dirmotor);

}

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








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


     ความคุม Stepper Motor ด้วย keypad