เหมือนหลายๆ คนแหละ พี่ก็นอนกับเสียงพัดลมสบายใจดี แต่บ่อยครั้งทีเดียวที่พี่นอนลงเตียงแล้วดันลืมเปิดพัดลมซะงั้น! เลยต้องมานั่งคิดวนไปวนมาว่า "จะลุกไปเปิดดีมั้ยวะ?" ฮึบ! เลยคิดว่าไหนๆ ก็มีเวลามีอะไหล่แล้ว ทำไมไม่ทำพัดลมควบคุมด้วย Arduino ซะเลยล่ะ โปรเจคนี้เล่นกับไฟแรงสูงนะน้อง! (ระวังตัวด้วย!!) หลักการคือใช้ตัวรับสัญญาณอินฟราเรด (IR Receiver) กับรีเลย์มาควบคุมความเร็วพัดลมนั่นเอง มาดูคลิปประกอบกันเลยดีกว่า!
สั่งงานด้วยอินฟราเรด: พัดลมรีโมทคอนโทรล
พัดลมรีโมทคอนโทรล เนี่ยแหละ ที่จะเปลี่ยนของบ้านๆ ให้กลายเป็นสมาร์ทดีไวซ์! โดยใช้เทคโนโลยีอินฟราเรด (IR) อันเดียวกับที่รีโมททีวีใช้มาตั้งแต่ยุค 80s นั่นแหละ เราจะสร้างตัวรับสัญญาณขึ้นมาเองเพื่อสั่งงานมอเตอร์จากอีกฝั่งห้องได้สบายๆ
ถอดรหัสโปรโตคอลอินฟราเรด
ในอากาศเนี่ยมีสัญญาณรบกวนจากแสงอาทิตย์กับหลอดไฟเต็มไปหมด รีโมททั่วไปเลยใช้การมอดูเลตที่ 38kHz เพื่อให้สัญญาณของมันโดดเด่นออกมา
- ฮาร์ดแวร์: ไดโอดรับสัญญาณอินฟราเรด (IR Receiver Diode - TSOP38238) จะทำหน้าที่กรองคลื่นพาห์ 38kHz ออก แล้วส่งข้อมูลไบนารีดิบๆ ไปให้ Arduino
- รหัส Hex: ลองชี้รีโมททีวี Sony เฒ่าๆ ของคุณไปที่ไดโอด แล้วกดปุ่ม "Volume Up" ดู ไลบรารี
IRremote.hจะถอดรหัสพัลส์ที่มองไม่เห็นนั้นออกมาเป็นสตริงเลขฐานสิบหกเฉพาะตัว เช่น0xFFA25D - ลอจิกในซอฟต์แวร์: เราใช้คำสั่ง
switch/case:case 0xFFA25D: ให้สั่งanalogWrite(fanPin, 128);(ความเร็วปานกลาง)case 0xFFE01F(ปุ่ม Mute): ให้สั่งdigitalWrite(fanPin, LOW);(ปิด)
จัดการกับกระแสสูง (เรื่องของรีเลย์/MOSFET)
มอเตอร์พัดลมกินกระแสประมาณ 1 ถึง 3 แอมป์ แต่พินของ Arduino จ่ายได้แค่ 0.04 แอมป์เอง ถ้าคุณขับพัดลม DC ขนาดเล็ก เช่น พัดลมคอม 12V คุณต้องใช้ ทรานซิสเตอร์กำลังสูงอย่าง TIP120 หรือ IRLZ44N ทำหน้าที่เป็นวาล์วเปิดปิดดิจิทัล แต่ถ้าคุณจะไปแฮกพัดลมตัวใหญ่ 110V/220V AC แบบส่ายหัวในห้องล่ะก็ คุณต้องใช้โมดูลรีเลย์ 5V เพื่อสวิตช์ไฟบ้านอย่างปลอดภัย! อย่าลืมว่าอันตรายนะตัวนี้
อะไหล่ที่ต้องใช้
- Arduino Uno/Nano: ตัวถอดรหัสหลัก
- ไดโอดรับสัญญาณอินฟราเรด (1838 หรือ TSOP38238)
- รีโมททีวี/DVD เก่าๆ สักอัน
- พัดลม DC + MOSFET (ปลอดภัย) หรือ พัดลม AC + Solid State Relay (อันตราย!).
ขั้นตอนที่ 1: กำหนดปุ่ม
หาว่ารีโมทของคุณส่งรหัสอะไรเวลากดปุ่มไหน รีโมทแต่ละยี่ห้อจะมีรหัสเฉพาะของมันสำหรับแต่ละปุ่ม ตัวอย่างเช่น เวลาคุณกดปุ่มลดเสียง รีโมทจะส่งรหัสหนึ่งไปที่ทีวี แล้วทีวีก็จะประมวลผลรหัสนั้นเพื่อลดเสียงลง
#include <IRremote.h>
int RECV_PIN = 12; // the pin where you connect the output pin of IR sensor (CHANGE Depending on your Arduino)
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
{
void loop()
{
if (irrecv.decode(&results))
{
int results.value = results;
Serial.println(" ");
Serial.print("Code: ");
Serial.println(results.value);
Serial.println(" ");
irrecv.resume();
}
เราใช้โค้ดด้านบนเพื่อหาว่าแต่ละปุ่มส่งรหัสอะไรออกมาในรูปแบบเลขฐานสิบ (Decimal) ผ่าน Serial Monitor เก็บค่าเหล่านี้ให้ดีนะ! พี่แนะนำให้วางแผนล่วงหน้าว่าจะให้ปุ่มไหนทำอะไร แล้วทำตารางจับคู่ปุ่มกับรหัส ID ของมันไว้เลย สู้งานนะน้อง!
STEP 2: วัสดุอุปกรณ์
จัดของให้ครบก่อนเริ่มงานเลยน้อง!
พอจัดของครบแล้ว อย่าลืมว่าเรากำลังจะเล่นกับไฟแรงสูงนะ ระวังตัวให้ดี ห้ามช็อตนะตัวนี้!
STEP 3: หารหัสสายไฟของพัดลม
ก่อนอื่นต้องเข้าใจการทำงานของพัดลมก่อน:
พัดลมไฟฟ้ามีมอเตอร์ที่ใช้ไฟฟ้าในการทำงาน และเชื่อมต่อกับใบพัดผ่านเพลา มอเตอร์จะขับเพลานี้ให้หมุน ทำให้ใบพัดหมุนด้วยความเร็วต่างๆ ตามที่เราตั้งไว้ จำนวนใบพัดและรอบการหมุนของมอเตอร์ (RPM) ก็แตกต่างกันไปตามรุ่นของพัดลม
พัดลมแต่ละรุ่นมีรหัสสีสายไฟไม่เหมือนกันนะ ตัวอย่างเช่น พัดลมของพี่มีสายไฟ 4 สี คือ สีน้ำเงิน, แดง, ส้ม และเทา แต่ละสีทำหน้าที่ต่างกัน สำหรับของพี่คือ:
- สายสีน้ำเงิน เป็นสายร่วม (Common / Neutral)
- สายสีแดง เป็นความเร็ว 3 (ต่อกับไฟเลี้ยง / Live)
- สายสีส้ม เป็นความเร็ว 2 (ต่อกับไฟเลี้ยง / Live)
- สายสีเทา เป็นความเร็ว 1 (ต่อกับไฟเลี้ยง / Live)
ดูภาพประกอบได้ที่นี่:

หมายเหตุ: พัดลมน้องอาจจะมีสายเพิ่มมาอีกเส้นสำหรับมอเตอร์ส่ายอัตโนมัติ (Automatic Oscillation Motor) ด้วยนะ
STEP 4: การเดินสายไฟ
พอรู้รหัสสีสายไฟของพัดลมแล้ว ก็เริ่มต่อวงจรไฟฟ้าของพัดลมได้เลย ให้นำสายความเร็วของพัดลมไปต่อเข้ากับขา NO ของรีเลย์ (Relay) ตามที่เห็นในวิดีโอ ส่วนขา COM ของรีเลย์ทุกตัวให้ต่อรวมกันแล้วไปต่อกับสายไฟเลี้ยง (Live Wire)
STEP 5: วงจรอิเล็กทรอนิกส์
ต่อสายความเร็วของพัดลมเข้ากับรีเลย์ครบแล้ว ต่อไปก็มาถึงส่วนของการต่อสายกับ Arduino กัน! ต่อสายตาม Schematic ที่ให้ไว้ด้านล่างนี้เลย:

STEP 6: เขียนโค้ด!!
ต่อวงจรครบทุกอย่างแล้วใช่ไหม? งั้นมาเขียนโค้ดกันต่อเลย!
โค้ดอยู่ตรงนี้:
#include <LiquidCrystal.h>
#include <IRremote.h>
int RECV_PIN = 12; // Pin no. on Arduino (Change depending on your Arduino)
int Speed1 = 8; // Pin no. on Arduino (Change depending on your Arduino)
int Speed2 = 9; // Pin no. on Arduino (Change depending on your Arduino)
int Speed3 = 10; // Pin no. on Arduino (Change depending on your Arduino)
int OSC = 11; // Pin no. on Arduino (Change depending on your Arduino)
int relay[] = {0,0,0,0,0}; // no. of relays present / the state of the relay
const int rs = 7, en = 6, d4 = 2, d5 = 3, d6 = 4, d7 = 5; // Pin no. on Arduino (Change depending on your Arduino)
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
โค้ดส่วนบนนี้เป็นการประกาศไลบรารี (Library) ที่จำเป็นต้องใช้ในโปรแกรมทั้งหมด ซึ่งไลบรารีเหล่านี้สามารถหาและติดตั้งได้ผ่าน Library Manager ใน Arduino IDE ตามที่แสดงในวิดีโอด้านล่าง:
ส่วนถัดมาของโค้ดเป็นการประกาศขา (Pin) ต่างๆ ที่ใช้บน Arduino
#define speed1 ________ // button code for speed no.1 (CHANGE Depending on your Button Code)
#define speed2 ________ // รหัสปุ่มสำหรับความเร็วที่ 2 (เปลี่ยนตามรหัสปุ่มของแก) #define speed3 ________ // รหัสปุ่มสำหรับความเร็วที่ 3 (เปลี่ยนตามรหัสปุ่มของแก) #define power ________ // รหัสปุ่มสำหรับเปิด/ปิด (เปลี่ยนตามรหัสปุ่มของแก) #define Osc ________ // รหัสปุ่มสำหรับการแกว่ง (เปลี่ยนตามรหัสปุ่มของแก) IRrecv irrecv(RECV_PIN); decode_results results;
ส่วนต่อไปนี้คือการกำหนดรหัสปุ่มทั้งหมดที่เราหามาก่อนหน้านี้ เปลี่ยนขีดๆนั่นด้วยรหัสของแกเลย!
เพื่อให้รีเลย์ทำงาน เราต้องใช้คำสั่ง `switch` และ `case`:
```cpp
if (irrecv.decode(&results)) {
unsigned int value = results.value;
switch(value) {
case speed1:
lcd.print(""); // ล้างหน้าจอ LCD
lcd.setCursor(1, 1); // ตั้งตำแหน่งเคอร์เซอร์
lcd.print("# 1"); // แสดงผลความเร็ว 1
if(relay[1] == 0) {
digitalWrite(Speed1, HIGH); // ตั้งค่าความเร็วเป็น 1
digitalWrite(Speed2, LOW); // ตรวจสอบให้แน่ใจว่าความเร็วอื่นๆ ปิดอยู่ เพื่อป้องกันไม่ให้มีแรงดันหลายตัวเข้าพัดลม
digitalWrite(Speed3, LOW); // ตรวจสอบให้แน่ใจว่าความเร็วอื่นๆ ปิดอยู่ เพื่อป้องกันไม่ให้มีแรงดันหลายตัวเข้าพัดลม
relay[1] == 1; // เป็นตัวบ่งชี้สำหรับโปรแกรมว่าตอนนี้ความเร็ว 1 กำลังเปิดอยู่
}
จัดไปวัยรุ่น! โชคดีกับโปรเจคนะน้อง และระวังเรื่องไฟบ้านให้ดี ห้ามช็อตนะตัวนี้!
ผลงานสุดท้าย: