Arduino ระบบควบคุมหลอดไฟในบ้านอัจฉริยะ

ระบบควบคุมหลอดไฟในบ้านอัจฉริยะ ใช้งานบอร์ด Arduino เป็นต้นแบบ ออกแบบมาให้ใช้งานร่วมกับจอ LCD และออกแบบมาให้ใช้งานได้จริงมากกว่าโครงการที่ผ่านๆมา เนื่องจากข้อเสียของโครงการที่ผ่านมามีความทันสมัยก็จริง แต่การนำไปใช้งานในชีวิตจริงจัดได้ว่ายังยุ่งยากกว่าอยู่ดี ระบบนี้จึงใช้การคุบคุมแบบระยะใกล้ เพื่อให้เหมาะกับการใช้งานกับผู้ใช้ทั่วไปมากยิ่งขึ้น

ฮาร์แวร์

 

รายการอุปกรณ์

  • บอร์ด Arduino
  • จอ LCD เชื่อมต่อ I2C
  • สวิซต์กดติดปล่อยดับ 2 ตัว
  • LDR
  • LED (ใช้ทดสอบวงจร)
  • R 220Ω (ใช้ทดสอบวงจร)
  • R 10KΩ 2 ตัว
  • R 100KΩ 2 ตัว

ในวงจรไม่ได้ใส่จอ LCD ไว้ เนื่องจากในโปรแกรมไม่มีหน้าจอ LCD I2C ครับ ส่วน LDR ไว้ใช้สำหรับตรวขสอบแสงภาบนอก มีคุณสมบัติคือ เมื่อมีแสงมาก ความต้านทานจะลดต่ำลง เมื่อไม่มีแสง ความต้านทานจะสูงขึ้น ในวงจรได้ต่อเป็นวงจรแบ่งแรงดัน เมื่อมีแสงน้อยลงจะทำให้แรงดันระหว่างจุด LDR และ R100KΩ สูงมากยิ่งขึ้น

ซอฟแวร์

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

String NowPage = "None";
int HomeMenu_OnSelect = 1;
int SubMenu_OnSelect = 1;
int Mode[] = {0, 0, 0, 0, 0, 0}; // 1 = Auto, 2 = Time, 3 = Set ON, 4 = Set OFF
int SleepLCD = 0;
int LEDPin[] = {12, 11, 10, 9, 8};
int SubMenuLampNum = 0;

void setup(){
 pinMode(2, INPUT);
 pinMode(3, INPUT);
 for (int i = 0; i < sizeof(LEDPin); i++)
 pinMode(LEDPin[i], OUTPUT);
 lcd.begin();
 delay(200);
 NowPage = "Welcome";
 lcd.setCursor(4,0);
 lcd.print("Welcome!");
 delay(2000);
 lcd.clear();
 lcd.print("Btn 1 => Next");
 lcd.setCursor(0,1);
 lcd.print("Btn 2 => Select");
 delay(2000);
 lcd.clear();
 lcd.setCursor(4, 0);
 lcd.print("Set Mode");
 delay(2000);
 lcd.clear();
 NowPage = "None";
}

void loop(){
 if (NowPage == "None"){
 ShowPage(1, 1);
 lcd.setCursor(15,0);
 lcd.print("<");
 NowPage = "HomeManu-1";
 }else if (NowPage == "NextTwoPage"){
 ShowPage(1, 2);
 NowPage = "HomeManu-2";
 }else if (NowPage == "NextTreePage"){
 ShowPage(1, 3);
 NowPage = "HomeManu-3";
 }
 if (SleepLCD == 0){
 if (digitalRead(3) == HIGH)
 NextClick();
 if (digitalRead(2) == HIGH)
 SelectClick();
 }
 for (int i = 0; i <= 4; i++) {
 if (Mode[i] == 1)
 digitalWrite(LEDPin[i], (analogRead(A1) < 600 ? HIGH : LOW));
 }
 if (SleepLCD == 1 && digitalRead(3) == HIGH){
 SleepLCD = 0;
 lcd.display();
 lcd.backlight();
 delay(300);
 }
 delay(100);
}

void NextClick(){
 lcd.setCursor(15,0);
 lcd.print(" ");
 lcd.setCursor(15,1);
 lcd.print(" ");
 if (NowPage == "HomeManu-1" || NowPage == "HomeManu-2" || NowPage == "HomeManu-3"){
 HomeMenu_OnSelect++;
 if (HomeMenu_OnSelect > 6)
 HomeMenu_OnSelect = 1;
 if (HomeMenu_OnSelect == 1){
 if (NowPage != "HomeManu-1"){
 ShowPage(1, 1);
 NowPage = "HomeManu-1";
 }
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 2){
 if (NowPage != "HomeManu-1"){
 ShowPage(1, 1);
 NowPage = "HomeManu-1";
 }
 lcd.setCursor(15,1);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 3){
 if (NowPage != "HomeManu-2"){
 ShowPage(1, 2);
 NowPage = "HomeManu-2";
 }
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 4){
 if (NowPage != "HomeManu-2"){
 ShowPage(1, 2);
 NowPage = "HomeManu-2";
 }
 lcd.setCursor(15,1);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 5){
 if (NowPage != "HomeManu-3"){
 ShowPage(1, 3);
 NowPage = "HomeManu-3";
 }
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 6){
 if (NowPage != "HomeManu-3"){
 ShowPage(1, 3);
 NowPage = "HomeManu-3";
 }
 lcd.setCursor(15,1);
 lcd.print("<");
 }
 }else if (NowPage == "SubManu-1" || NowPage == "SubManu-2"){
 SubMenu_OnSelect++;
 if (SubMenu_OnSelect > 4)
 SubMenu_OnSelect = 1;
 if (SubMenu_OnSelect == 1){
 if (NowPage != "SubManu-1"){
 ShowPage(2, 1);
 NowPage = "SubManu-1";
 }
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (SubMenu_OnSelect == 2){
 if (NowPage != "SubManu-1"){
 ShowPage(2, 1);
 NowPage = "SubManu-1";
 }
 lcd.setCursor(15,1);
 lcd.print("<");
 }else if (SubMenu_OnSelect == 3){
 if (NowPage != "SubManu-2"){
 ShowPage(2, 2);
 NowPage = "SubManu-2";
 }
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (SubMenu_OnSelect == 4){
 if (NowPage != "SubManu-2"){
 ShowPage(2, 2);
 NowPage = "SubManu-2";
 }
 lcd.setCursor(15,1);
 lcd.print("<");
 }
 }
 delay(300);
}

void SelectClick(){
 if (NowPage == "HomeManu-1" || NowPage == "HomeManu-2" || NowPage == "HomeManu-3"){
 if (HomeMenu_OnSelect >= 1 && HomeMenu_OnSelect <= 5){
 SubMenuLampNum = HomeMenu_OnSelect;
 NowPage = "SubManu-1";
 ShowPage(2, 1);
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (HomeMenu_OnSelect == 6){
 SleepLCD = 1;
 lcd.noDisplay();
 lcd.noBacklight();
 }
 }else if (NowPage == "SubManu-1" || NowPage == "SubManu-2"){
 if (SubMenu_OnSelect == 1){
 Mode[SubMenuLampNum-1] = 1;
 digitalWrite(LEDPin[SubMenuLampNum-1], (analogRead(A1) < 600 ? HIGH : LOW));
 lcd.clear();
 lcd.setCursor(3 ,0);
 lcd.print("Mode Auto!");
 delay(2000);
 ShowPage(2, 1);
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (SubMenu_OnSelect == 2){
 Mode[SubMenuLampNum-1] = 2;
 }else if (SubMenu_OnSelect == 3){
 digitalWrite(LEDPin[SubMenuLampNum-1], !digitalRead(LEDPin[SubMenuLampNum-1]));
 Mode[SubMenuLampNum-1] = (digitalRead(LEDPin[SubMenuLampNum-1]) ? 3 : 4);
 lcd.clear();
 lcd.setCursor(4 ,0);
 lcd.print("Lamp ");
 lcd.print((digitalRead(LEDPin[SubMenuLampNum-1]) ? "ON" : "OFF"));
 lcd.print("!");
 delay(2000);
 ShowPage(2, 2);
 lcd.setCursor(15,0);
 lcd.print("<");
 }else if (SubMenu_OnSelect == 4){
 SubMenu_OnSelect = 1;
 if (SubMenuLampNum >= 1 && SubMenuLampNum <= 2){
 ShowPage(1, 1);
 lcd.setCursor(15, SubMenuLampNum-1);
 lcd.print("<");
 NowPage = "HomeManu-1";
 }else if (SubMenuLampNum >= 3 && SubMenuLampNum <= 4){
 ShowPage(1, 2);
 lcd.setCursor(15, SubMenuLampNum-3);
 lcd.print("<");
 NowPage = "HomeManu-2";
 }else if (SubMenuLampNum >= 5){
 ShowPage(1, 3);
 lcd.setCursor(15, 0);
 lcd.print("<");
 NowPage = "HomeManu-3";
 }
 }
 }
 delay(300);
}

void ShowPage(int type, int page){
 lcd.clear();
 if (type == 1 && page == 1){
 lcd.print("1) Lamp 1");
 lcd.setCursor(0,1);
 lcd.print("2) Lamp 2");
 }else if (type == 1 && page == 2){
 lcd.print("3) Lamp 3");
 lcd.setCursor(0,1);
 lcd.print("4) Lamp 4");
 }else if (type == 1 && page == 3){
 lcd.print("5) Lamp 5");
 lcd.setCursor(0,1);
 lcd.print("6) Sleep");
 }else if (type == 2 && page == 1){
 lcd.print("1) Auto");
 lcd.setCursor(0,1);
 lcd.print("2) Time");
 }else if (type == 2 && page == 2){
 lcd.print("3) Trigger");
 lcd.setCursor(0,1);
 lcd.print("4) Back");
 }
}

รายละเอียดต่างๆของโค้ด ได้อธิบายโดยละเอียดไว้ในโปรแกรมแล้วครับ

เนื่องจากผมยังไม่มีโมดูล RTC ครับ จึงไม่ได้ทำส่วนของการตั้งเวลา หากได้โมดูล RTC มาแล้ว จะทำส่วนตั้งเวลาและมาอัพเดทให้นะครับ

### จบ ขอบคุณทุกท่านที่ติดตามอ่านครับ ###

1 comment

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *