29/9/62

ตั้งเวลาเปิดปิดไฟ 220VAC ด้วย DS3231

มินิโปรเจค Arduino ตั้งเวลาเปิดปิดไฟ 220VAC ด้วย DS3231





ประโยชน์และการนำโปรเจคไปพัฒนาต่อ

ควบคุมการตั้งเวลาเปิด-ปิดไฟอเนกประสงค์ 220VAC เหมาะสำหรับนำไปใช้ควบคุมไฟแสงสว่างหน้าบ้าน, บ่อปลา, ไฟรั้ว เป็นต้น


เป้าหมายและหลักการทำงานของโปรเจค





Module นาฬิกา DS3231 หรือมีอีกชื่อหนึ่งว่า Real time clock (RTC) ถ้านึกถึง Arduino เมื่อไม่มีการจ่ายไฟโปรแกรมของ Arduino ก็จะหยุดทำงาน เราจึงมี RTC เพื่อทำการเก็บเวลาไว้เมื่อจ่ายไฟให้กับวงจร Arduino ก็จะดึงเวลามาใช้งานได้ทันที หรือการตั้งค่าคำนวนเวลาของ Arduino อาจจะมีปัญหา ความแม่นยำไม่ตรงบ้าง Library มีการ delay ทำให้เวลาไม่ตรงบ้าง เราก็สามารถใช้ Module อ้างอิงเวลาได้อย่างชัดเจนแน่นอน หรือจะนำไปใช้ในการบอกเวลา เพื่อลดน้ำต้นไม้ เปิดปิดไฟตามเวลาก็ได้เช่นกัน


(เพื่อความปลอดภัย : ผู้ทำโปรเจค ควรมี ความรู้ด้านไฟฟ้าเป็นอย่างดี)




อุปกรณ์ที่ใช้ในโปรเจค



6. Relay 2 Channel 5V DC Solid State High Level


7. Mini Breadboard 170 holes


อุปกรณ์ไฟฟ้าอื่นๆ เช่น หลอดไฟ , ปลั๊กไฟ , ขั้วหลอดไฟ , สายไฟ หาซื้อได้ตามร้านขายอุปกรณ์ไฟฟ้าทั่วๆไป

*** การใช้งานแบบไม่ต้องการเชื่อมต่อสาย USB กับ คอมพิวเตอร์ ให้ใช้ Adapter DC 9V 1A Power Supply เป็นแหล่งจ่ายไฟ เสียบเข้ากับ DC Power Jack ของ  บอร์ด Arduino ***


ขั้นตอนการทำโปรเจค



1. ตั้งค่า วันที่ และ เวลา ให้กับ DS3231


1.1 ยึดบอร์ด Arduino UNO



1.2 ประกอบ Sensor Shield V 5.0



1.3 เชื่อมต่อสาย ระหว่าง Arduino กับ DS3231









2. ติดตั้ง ไลบรารี สำหรับ DS3231


2.1 ดาวน์โหลด ไลบรารี


https://drive.google.com/open?id=1BiuHm_cqQEDe0Ztiy9GJ1KFt9KprTT2A


2.2 เปิดโปรแกรม Arduino IDE ไปที่ Skecth -> Include Library -> Add .ZIP Library...




2.3 ไปที่ ไลบรารี RTClib.zip ที่เรา ดาวน์โหลด มา -> Open



2.4  ตรวจสอบที่ Skecth -> Include Library  จะพบ ไลบรารี RTClib เพิ่มเข้ามาใน Arduino IDE ของเรา






2.5 เขียนโค้ดดังนี้




#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>

RTC_DS3231 RTC;

void setup () {

  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

  RTC.adjust(DateTime(__DATE__, __TIME__));
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }


}

void loop () {

  DateTime now = RTC.now();

  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(' ');

  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  delay(3000);

}



2.6 เชื่อมต่อสาย USB ระหว่าง คอมพิวเตอร์ กับ บอร์ด Arduino แล้วไปที่ Tools > Board เลือกเป็น Arduino/Genuino UNO





2.7 ไปที่ Tools > Port: แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port มากกว่าหนึ่ง  ให้เลือกตัวอื่นที่ไม่ใช่ COM1)

ในตัวอย่างเลือกเป็น "COM8"

(ถ้ายังว่าง หรือ เป็น COM1 ให้ตรวจสอบการติดตั้งไดร์เวอร์ การต่อสาย USB ของ Arduino UNO)





2.8 กดปุ่ม  เพื่ออัพโหลด







2.9 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง




2.10 เปิดหน้าต่าง Serial Monitor  โดยไปที่ Tools > Serial Monitor





2.11 มุมขวาล่าง ของ Serial Monitor เลือกเป็น 57600 baud  คือ ตั้งค่าความเร็วในการรับ-ส่งข้อมูล  คือ 57600 ตามที่เราเขียนโค้ดไว้





2.12 Serial Monitor แสดงวันที่ และ เวลาปัจจุบัน ตามคอมพิวเตอร์ ที่คอมไพล์ แสดงว่า Module นาฬิกา DS3231 พร้อมทำงานแล้ว




*** แนะนำ ปล่อยให้ทำงานสักระยะ เพื่อชาร์จไฟให้แบต ของ  DS3231 มีไฟพอสมควร ***



3. เชื่อมต่อ Arduino กับ จอ LCD






3.1 เชื่อมต่อสาย LCD เข้ากับ เบรดบอร์ด ซึ่งการเชื่อมต่อสายจะใช้ ขาเดียวกันกับ DS3231 คือขา A4 และ A5 โดยใช้การสื่อสารอนุกรมแบบ  I2C  ซึ่งแต่ละอุปกรณ์จะมี Address ที่แตกต่างกัน จึงทำให้สามารถต่ออุปกรณ์ 2 ตัวร่วมกันได้







3.2 ดาวน์โหลด Arduino I2C Library สำหรับ LCD


https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library



3.3  ไปที่ Skecth -> Include Library -> Add .ZIP Library...




3.4 ไปที่ ไลบรารี Arduino-LiquidCrystal-I2C-library-master.zip ที่เรา ดาวน์โหลด มา -> Open



3.5  ตรวจสอบที่ Skecth -> Include Library  จะพบ ไลบรารี Arduino-LiquidCrystal-I2C-library-master เพิ่มเข้ามาใน Arduino IDE ของเรา





3.6 เขียนโค้ดดังนี้


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
void setup()
{
  
  lcd.begin();
 
  lcd.backlight();
  lcd.print("Hello, world!");
}
 
void loop()
{
  
}

3.7 ไปที่ Tools > Board เลือกเป็น Arduino/Genuino UNO




3.8 ไปที่ Tools > Port แล้วเลือกพอร์ตที่ปรากฏ (กรณีใช้เครื่องคอมพิวเตอร์ที่มี COM Port มากกว่าหนึ่ง  ให้เลือกตัวอื่นที่ไม่ใช่ COM1)

ในตัวอย่างเลือกเป็น "COM6"

(ถ้ายังว่าง หรือ เป็น COM1 ให้ตรวจสอบการติดตั้งไดร์เวอร์ การต่อสาย USB ของ Arduino UNO)



3.9 กดปุ่ม  เพื่ออัพโหลด




3.10 หากสามารถอัพโหลดโปรแกรมลงบอร์ดได้สำเร็จ จะแสดงคำว่า Done uploading. ที่แถบด้านล่าง




3.11 ปรับความสว่างหน้าจอ LCD







4. เชื่อมต่อ Arduino กับ Relay 2 Channel 



5. ทดสอบการทำงาน


5.1 เขียนโค้ดและ อัพโหลดโค้ด ดังนี้




#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int CH1 = 7;
int CH2 = 6;
RTC_DS3231 RTC;
String now_time ;

void setup () {
  lcd.begin();
  lcd.backlight();
  pinMode(CH1, OUTPUT);
  pinMode(CH2, OUTPUT);
  Serial.begin(57600);
  Wire.begin();
  RTC.begin();

}

void loop () {
  DateTime now = RTC.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  now_time =  "TIME = " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());

  lcd.setCursor(1, 0);
  lcd.print(now_time);

  if (RTC.checkIfAlarm(1)) {
    Serial.println("Alarm Triggered");
  }
  if (now.hour() == 10 && now.minute() == 23 ) {  //ถ้าเวลาเท่ากับ 10 นาฬิกา และนาทีเท่ากับ 23 จะสั่งให้ CH1 เปิดไฟ
    digitalWrite(CH1, HIGH);
    Serial.println("CH1 = ON");
    lcd.setCursor(2, 1);
    lcd.print("CH1 = ON ");

  }

  else if (now.hour() == 10 && now.minute() == 24 ) {  //ถ้าเวลาเท่ากับ 10 นาฬิกา และนาทีเท่ากับ 24 จะสั่งให้ CH1 ปิดไฟ
    digitalWrite(CH1, LOW);
    Serial.println("CH1 = OFF");
    lcd.setCursor(2, 1);
    lcd.print("CH1 = OFF");
  }

  else if (now.hour() == 10 && now.minute() == 25 ) {  //ถ้าเวลาเท่ากับ 10 นาฬิกา และนาทีเท่ากับ 25 จะสั่งให้ CH2 เปิดไฟ
    digitalWrite(CH2, HIGH);
    Serial.println("CH2 = ON");
    lcd.setCursor(2, 1);
    lcd.print("CH2 = ON ");
  }

  else if (now.hour() == 10 && now.minute() == 26 ) {  //ถ้าเวลาเท่ากับ 10 นาฬิกา และนาทีเท่ากับ 26 จะสั่งให้ CH2 ปิดไฟ
    digitalWrite(CH2, LOW);
    Serial.println("CH2 = OFF");
    lcd.setCursor(2, 1);
    lcd.print("CH2 = OFF");
  }

  Serial.println();
  delay(1000);
}




การต่อโปรเจคถึงขั้นตอนนี้





ถ้า Relay ช่องที่ 1 ทำงาน ไฟ LED สีเขียว ด้านซ้ายมือจะติด




ถ้า Relay ช่องที่ 2 ทำงาน ไฟ LED สีเขียว ด้านขวามือจะติด





แสดงว่าโปรเจคเราพร้อมทำงานแล้ว



6. เชื่อมต่อ Relay 2 Channel กับ  หลอดไฟ