สร้างระบบควบคุมเครื่องใช้ไฟฟ้าไร้สายระยะไกลด้วยมือถือผ่าน Arduino และ LoRa (ไม่ต้องง้อ Wi-Fi!)

เคยไหมครับ? อยากจะควบคุมการเปิด-ปิดหลอดไฟ หรือเครื่องใช้ไฟฟ้าที่อยู่ห่างออกไปหลายร้อยเมตร หรืออาจจะเป็นกิโลเมตร แต่บริเวณนั้น "ไม่มีสัญญาณ Wi-Fi" "ไม่มีเน็ต" หรือขี้เกียจเซ็ตอัประบบเน็ตเวิร์กให้วุ่นวาย

ปัญหานี้จบได้ด้วยเทคโนโลยี LoRa (Long Range) ครับ! ในโปรเจกต์นี้เราจะมาสร้างระบบควบคุมเครื่องใช้ไฟฟ้าระยะไกล โดยใช้สมาร์ทโฟนส่งคำสั่งผ่าน Bluetooth ไปยังบอร์ด Arduino Nano ตัวแรก จากนั้นมันจะส่งคำสั่งไร้สายผ่านคลื่น LoRa ไปยังบอร์ด Arduino ตัวที่สองที่อยู่ไกลออกไป เพื่อสับสวิตช์ Relay เปิด-ปิดอุปกรณ์ไฟฟ้า (เช่น หลอดไฟ 240V หรือพัดลม 12V) แถมยังกินไฟน้อยสุดๆ ไปเริ่มกันเลย!

LoRa Wireless Appliance Control

อุปกรณ์ที่ต้องใช้ (Hardware & Software)

  • บอร์ด Arduino Nano (2 ตัว)
  • โมดูล RYLR999 LoRa + BLE (2 ตัว)
  • โมดูลแปลงแรงดัน (3.3V-5V Bidirectional Logic Level Shifter)
  • หน้าจอ 16x2 I2C LCD Display
  • โมดูล Relay แบบ 2 ช่อง (2-channel relay module)
  • พัดลม 12V DC และ หลอดไฟ 240V AC
  • สาย Jumper และแหล่งจ่ายไฟ 12V DC
  • Software: Arduino IDE, ไลบรารี LiquidCrystal_I2C และแอปพลิเคชัน LightBlue BLE (บนมือถือ)

Step 1 & 2: หลักการทำงาน & ทำไมต้องใช้ Relay?

ระบบของเราจะถูกแบ่งออกเป็น 2 ฝั่งหลักๆ ครับ:

  • ฝั่งควบคุม (Controller Unit): รับคำสั่งจากแอปมือถือผ่าน Bluetooth (BLE) เข้ามาที่ Arduino จากนั้นแปลงคำสั่งส่งออกไปทางวิทยุ LoRa
  • ฝั่งปลายทาง (Target Unit): รอรับคลื่น LoRa เมื่อได้คำสั่งมา Arduino จะตีความแล้วสั่งเปิด-ปิดเครื่องใช้ไฟฟ้า พร้อมส่งข้อความยืนยันกลับไปโชว์บนจอ LCD ฝั่งควบคุม

แล้วทำไมเราไม่ต่อหลอดไฟเข้าบอร์ดตรงๆ ล่ะ?

บอร์ด Arduino ทำงานที่แรงดันต่ำมาก (5V) และจ่ายกระแสไฟได้นิดเดียว ถ้าเอาไปต่อตรงกับหลอดไฟบ้าน (220V/240V) บอร์ดระเบิดแน่นอน! เราจึงต้องใช้ "Relay" มาทำหน้าที่เป็นสวิตช์ไฟฟ้าที่ใช้ไฟ 5V สั่งเปิด-ปิดไฟแรงดันสูงได้อย่างปลอดภัยครับ

Step 3: การต่อวงจรฝั่งควบคุม (Controller Wiring)

ฝั่งนี้ประกอบด้วย Arduino Nano, โมดูล RYLR999, Level Shifter และจอ LCD

ข้อควรระวัง: โมดูล LoRa ทำงานที่ 3.3V แต่ Arduino ปล่อยไฟสัญญาณที่ 5V ดังนั้นสายสัญญาณ (TX/RX) ระหว่าง 2 ตัวนี้ "ต้องต่อผ่าน Level Shifter" เสมอเพื่อป้องกันโมดูล LoRa พังครับ ส่วนจอ LCD ต่อเข้าพิน A4 (SDA) และ A5 (SCL) แบบปกติได้เลย

Controller Circuit Diagram
คลิกเพื่อดูรูปภาพการต่อสายจริง (View More)
Controller Wiring Photo

Step 4: การต่อวงจรฝั่งปลายทาง (Target Wiring)

การต่อบอร์ดฝั่งปลายทางจะคล้ายๆ กัน แต่เราไม่ได้ใช้ Bluetooth แล้ว หน้าที่ของมันคือรอฟังคลื่น LoRa อย่างเดียว เมื่อได้รับคำสั่ง มันจะทริกเกอร์ Relay ที่ต่อไว้:

  • Relay ช่อง 1 (พิน D11) -> คุมหลอดไฟ AC 240V
  • Relay ช่อง 2 (พิน D12) -> คุมพัดลม DC 12V

*ข้อควรระวัง: ถอดปลั๊กไฟบ้านออกทุกครั้งก่อนต่อสายเข้ากับโมดูล Relay เพื่อความปลอดภัย!

Target Circuit Diagram

Step 5 & 6: รูปแบบคำสั่งและการทดสอบระบบ (Testing)

เราจะใช้แอปพลิเคชัน LightBlue บนมือถือเพื่อเชื่อมต่อ Bluetooth เข้ากับโมดูลฝั่ง Controller และพิมพ์คำสั่งส่งไปง่ายๆ ดังนี้:

  • *L1# = เปิดหลอดไฟ (Lamp ON)
  • *L0# = ปิดหลอดไฟ (Lamp OFF)
  • *F1# = เปิดพัดลม (Fan ON)
  • *F0# = ปิดพัดลม (Fan OFF)

เมื่อพิมพ์ส่งไป ฝั่ง Controller จะโชว์บนจอ LCD ว่า "Cmd Rcvd & Sent" (รับคำสั่งและส่งแล้ว) และเมื่อฝั่ง Target ปิด-เปิดไฟสำเร็จ มันจะส่งคำว่า "DONE" ตอบกลับมาโชว์ที่จอ LCD ให้เรารู้ว่างานสำเร็จแล้ว!

Mobile App Commands

Step 7 & 8: ซอร์สโค้ด (Arduino Code)

ด้านล่างนี้คือโค้ดการทำงานหลักของโปรเจกต์ (มีการยุบรวมฟังก์ชันลอจิกเบื้องต้นเพื่อให้คัดลอกได้ง่าย) คุณสามารถก๊อปปี้ไปใช้งานบน Arduino IDE ได้เลยครับ

คลิกเพื่อดูและคัดลอกโค้ด ฝั่งควบคุม (Controller Unit)
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>

#define REPLY_TIMEOUT_IN_MS 300
#define REPLY_END_CHAR '\n'
#define SELF_ADDRESS 0
#define TARGET_ADDRESS 1
#define MIN_CHAR_TO_RCV 1
#define WAIT_FOR_TARGET_REPLY 3000

#define START_CHAR_BT_COMM '*'
#define END_CHAR_BT_COMM '#'
#define START_CHAR_TIME_OUT_BT_COMM (3000U)
#define END_CHAR_TIME_OUT_BT_COMM (300U)

String sCMDLampON = "L1";
String sCMDLampOFF = "L0";
String sCMDFanON = "F1";
String sCMDFanOFF = "F0";
String receivedCommand;

SoftwareSerial btSerial(3, 2);
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  Serial.begin(115200);
  btSerial.begin(115200);
  btSerial.setTimeout(END_CHAR_TIME_OUT_BT_COMM);
  
  lcd.init();
  lcd.backlight();
  lcd.clear();
  
  receivedCommand.reserve(50);
  flushBuffer();
  
  // Initialize LoRa defaults
  bool boRetVal = boRestoreFactoryDefaults();
  if (boRetVal == true) {
    flushBuffer();
    boRetVal = boSetAddress();
  }
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(boRetVal ? "Module Init" : "Module Init");
  lcd.setCursor(0, 1);
  lcd.print(boRetVal ? "Successful" : "Failed");
  if (!boRetVal) while(1);
  delay(1000);
}

void loop() {
  String expected_reply = "DONE";
  bool boRetVal = false;
  flushBuffer();
  
  boRetVal = rcvCommand(START_CHAR_TIME_OUT_BT_COMM);
  if (boRetVal == false) {
    lcd.clear(); lcd.setCursor(0, 0); lcd.print("No BT Command");
  } else {
    if (receivedCommand == sCMDLampON || receivedCommand == sCMDLampOFF || 
        receivedCommand == sCMDFanON || receivedCommand == sCMDFanOFF) {
        
      boRetVal = boSendData(receivedCommand);
      if (boRetVal == true) {
        lcd.clear(); lcd.setCursor(0, 0); lcd.print("Cmd Rcvd & Sent");
        delay(1000);
        boRetVal = chkReply(expected_reply, REPLY_END_CHAR, WAIT_FOR_TARGET_REPLY);
        
        lcd.clear(); lcd.setCursor(0, 0);
        lcd.print(boRetVal ? "Reply Received:" : "No Reply");
        lcd.setCursor(0, 1);
        lcd.print(boRetVal ? expected_reply : "Received");
      }
    }
  }
}
// (ฟังก์ชันการทำงานส่วนเชื่อมต่อ LoRa และรับส่ง Serial เพิ่มเติมอิงจากไฟล์ต้นฉบับ)
คลิกเพื่อดูและคัดลอกโค้ด ฝั่งปลายทาง (Target Unit)
#include <LiquidCrystal_I2C.h>

#define REPLY_TIMEOUT_IN_MS 300
#define REPLY_END_CHAR '\n'
#define CMD_END_CHAR '\n'
#define MODULE_ADDRESS 1
#define CONTROLLER_ADDRESS 0
#define MIN_CHAR_TO_RCV 1
#define WAIT_FOR_REQUEST 3000

String sCMDLampON = "L1";
String sCMDLampOFF = "L0";
String sCMDFanON = "F1";
String sCMDFanOFF = "F0";
String receivedCommand;

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define LAMP_CTRL_PIN 11
#define FAN_CTRL_PIN 12
#define LAMP_ON() digitalWrite(LAMP_CTRL_PIN, 0)
#define LAMP_OFF() digitalWrite(LAMP_CTRL_PIN, 1)
#define FAN_ON() digitalWrite(FAN_CTRL_PIN, 0)
#define FAN_OFF() digitalWrite(FAN_CTRL_PIN, 1)

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  
  pinMode(LAMP_CTRL_PIN, OUTPUT);
  pinMode(FAN_CTRL_PIN, OUTPUT);
  LAMP_OFF();
  FAN_OFF();
  
  receivedCommand.reserve(50);
  delay(1000);
  flushBuffer();
  
  bool boRetVal = boRestoreFactoryDefaults();
  if (boRetVal == true) {
    flushBuffer();
    boRetVal = boSetAddress();
  }
}

void loop() {
  String expected_reply = "DONE";
  bool boRetVal = false;
  
  boRetVal = rcvCommand(CMD_END_CHAR, WAIT_FOR_REQUEST);
  if (boRetVal == false) {
    lcd.clear(); lcd.setCursor(0, 0); lcd.print("No Command");
  } else {
    if (receivedCommand == sCMDLampON || receivedCommand == sCMDLampOFF || 
        receivedCommand == sCMDFanON || receivedCommand == sCMDFanOFF) {
        
      vImplementTask(receivedCommand); // ควบคุม Relay
      
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Task Done");
      delay(1000);
      
      boRetVal = boSendData(expected_reply); // ส่ง DONE กลับ
    }
  }
}

void vImplementTask(String data) {
  if (data == sCMDLampON) { LAMP_ON(); } 
  else if (data == sCMDLampOFF) { LAMP_OFF(); } 
  else if (data == sCMDFanON) { FAN_ON(); } 
  else if (data == sCMDFanOFF) { FAN_OFF(); }
}
// (ฟังก์ชันการทำงานส่วนเชื่อมต่อ LoRa เพิ่มเติมอิงจากไฟล์ต้นฉบับ)

สรุป: โปรเจกต์นี้แสดงให้เห็นถึงศักยภาพของเทคโนโลยี LoRa ได้อย่างชัดเจน แค่มีบอร์ดและโมดูลส่งสัญญาณ คุณก็สามารถควบคุมอุปกรณ์ไฟฟ้าระยะไกลตามสวน ตามไร่นา หรือพื้นที่อับสัญญาณอินเทอร์เน็ตได้อย่างง่ายดายและประหยัดพลังงานสุดๆ ครับ


คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา

อ้างอิงและเรียบเรียงโดย: Globalbyteshop Blog

แหล่งที่มาหลัก:
- โปรเจกต์โดย Rachana Jain: Wireless Appliance Control From Mobile Using Arduino and LoRa (Instructables)
- อ่านบทความสอนเขียนโค้ดตัวเต็ม (Playwithcircuit)
- เอกสารประกอบต้นฉบับ (PDF)

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี