Last updated on
วิธีใช้ ESP8266 รับสัญญาณอินฟาเรด ควบคุมเปิดปิด LED
วิธีใช้ ESP8266 รับสัญญาณอินฟาเรด ควบคุมเปิดปิด LED
บทความนี้เล่าวิธีต่อ IR Receiver Module KY-022 กับ ESP8266 แล้วใช้รีโมทควบคุมเปิดปิด LED 4 ดวง ดูว่าแต่ละปุ่มทำงานยังไง และปรับโค้ดให้เข้ากับรีโมทที่มี
อุปกรณ์ที่ต้องเตรียม
| อุปกรณ์ | จำนวน |
|---|---|
| NodeMCU ESP8266 V2 (CP2102) | 1 บอร์ด |
| Micro USB Cable | 1 เส้น |
| Power Adapter 5V 2A | 1 ตัว |
| Breadboard MB-102 830 จุด | 1 ชิ้น |
| IR Receiver Module KY-022 | 1 ตัว |
| รีโมทอินฟาเรด + ถ่าน | 1 ชุด |
| LED 5mm สีแดง | 5 ดวง |
| ตัวต้านทาน 220 Ohm 1/4W | 10 ตัว |
| สาย Jumper ผู้-ผู้ 20cm | 40 เส้น |
| สาย Jumper ผู้-เมีย 20cm | 40 เส้น |
| สาย Jumper เมีย-เมีย 20cm | 40 เส้น |
วิธีต่อวงจร ESP8266 กับ KY-022 และ LED
1. ต่อ KY-022 เข้ากับ ESP8266
| KY-022 | ESP8266 |
|---|---|
| ขา + (VCC) | 5V |
| ขา - (GND) | GND |
| ขา S (Signal) | D0 |
2. ต่อ LED แต่ละดวง
สำหรับ LED แต่ละตัว ต่อแบบนี้ (ขายาว = anode, ขาสั้น = cathode)
| หน้าที่ | ESP8266 |
|---|---|
| Signal ของ LED 1 | D1 |
| Signal ของ LED 2 | D2 |
| Signal ของ LED 3 | D5 |
| Signal ของ LED 4 | D6 |
| GND ร่วม | ผ่าน R 220 Ohm ไป GND |
3. ต่อสายจาก ESP8266 ไปยัง Breadboard
- เสียบ ESP8266 ลง Breadboard แล้วจ่ายไฟ 5V กับ GND ไปที่ rail ของบอร์ดทดลอง
- ต่อ KY-022 ให้ถูกขา (+, -, S) แล้วเสียบลงบอร์ด
- ต่อ LED 4 ดวง พร้อม R 220 Ohm ที่แต่ละขา GND
ติดตั้ง Library สำหรับรับสัญญาณ IR
- ดาวน์โหลด library IRRemote_DIYables_IRcontroller จาก MediaFire
- แตกไฟล์ RAR ด้วย WinRAR หรือ WinZip
- Copy โฟลเดอร์ที่แตกออกมาไปไว้ที่
This PC > Documents > Arduino > libraries - เปิด Arduino IDE ใหม่
โค้ด ESP8266 รับ IR และควบคุม LED
โค้ดด้านล่างนี้เป็น skeleton ที่พร้อมใช้งานได้ แต่ต้องเปลี่ยนรหัสรีโมทให้ตรงกับตัวที่ใช้อยู่
#include "DIYables_IRcontroller.h"
// === กำหนดขา ===
#define IR_PIN D0 // ขา Signal ของ KY-022
#define LED1_PIN D1
#define LED2_PIN D2
#define LED3_PIN D5
#define LED4_PIN D6
// === กำหนดสถานะเริ่มต้น LED ===
bool led1State = LOW;
bool led2State = LOW;
bool led3State = LOW;
bool led4State = LOW;
// === เปลี่ยนรหัสเหล่านี้ให้ตรงกับรีโมทของคุณ ===
// วิธีหา: เปิด Serial Monitor แล้วกดปุ่มบนรีโมท ดูค่าที่แสดง
const uint64_t KEY_1 = 0xFF6897; // ปุ่ม 1 เปิด LED1
const uint64_t KEY_2 = 0xFF9867; // ปุ่ม 2 ปิด LED1
const uint64_t KEY_3 = 0xFF30CF; // ปุ่ม 3 เปิด LED2
const uint64_t KEY_4 = 0xFF18E7; // ปุ่ม 4 ปิด LED2
const uint64_t KEY_5 = 0xFF7A85; // ปุ่ม 5 เปิด LED3
const uint64_t KEY_6 = 0xFF10EF; // ปุ่ม 6 ปิด LED3
const uint64_t KEY_7 = 0xFF42BD; // ปุ่ม 7 เปิด LED4
const uint64_t KEY_8 = 0xFF4AB5; // ปุ่ม 8 ปิด LED4
const uint64_t KEY_9 = 0xFF52AD; // ปุ่ม 9 เปิด LED ทั้งหมด
const uint64_t KEY_0 = 0xFF6897; // ปุ่ม 0 ปิด LED ทั้งหมด
IRrecv irrecv(IR_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
// ตั้งค่าขา LED เป็น output
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
// ปิด LED ทั้งหมดตอนเริ่ม
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
irrecv.enableIRIn();
Serial.println("พร้อมรับสัญญาณ IR");
}
void loop() {
if (irrecv.decode(&results)) {
Serial.print("รหัสที่ได้รับ: 0x");
Serial.println(results.value, HEX);
switch (results.value) {
case KEY_1:
led1State = HIGH;
digitalWrite(LED1_PIN, led1State);
Serial.println("LED 1 ON");
break;
case KEY_2:
led1State = LOW;
digitalWrite(LED1_PIN, led1State);
Serial.println("LED 1 OFF");
break;
case KEY_3:
led2State = HIGH;
digitalWrite(LED2_PIN, led2State);
Serial.println("LED 2 ON");
break;
case KEY_4:
led2State = LOW;
digitalWrite(LED2_PIN, led2State);
Serial.println("LED 2 OFF");
break;
case KEY_5:
led3State = HIGH;
digitalWrite(LED3_PIN, led3State);
Serial.println("LED 3 ON");
break;
case KEY_6:
led3State = LOW;
digitalWrite(LED3_PIN, led3State);
Serial.println("LED 3 OFF");
break;
case KEY_7:
led4State = HIGH;
digitalWrite(LED4_PIN, led4State);
Serial.println("LED 4 ON");
break;
case KEY_8:
led4State = LOW;
digitalWrite(LED4_PIN, led4State);
Serial.println("LED 4 OFF");
break;
case KEY_9:
led1State = led2State = led3State = led4State = HIGH;
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, HIGH);
digitalWrite(LED3_PIN, HIGH);
digitalWrite(LED4_PIN, HIGH);
Serial.println("LED ALL ON");
break;
case KEY_0:
led1State = led2State = led3State = led4State = LOW;
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, LOW);
digitalWrite(LED3_PIN, LOW);
digitalWrite(LED4_PIN, LOW);
Serial.println("LED ALL OFF");
break;
}
irrecv.resume();
}
}
จุดที่ต้องแก้ในโค้ด:
- เปลี่ยนค่า
KEY_1ถึงKEY_0ให้ตรงกับรหัสจริงของรีโมทที่ใช้ - ถ้าจอดวงจอย่าเปลี่ยนขา LED ให้ไปแก้
LED1_PINถึงLED4_PIN - ถ้าใช้ R ค่าอื่น (เช่น 330 Ohm) ก็เปลี่ยนได้ LED ยังติดได้แต่จะสว่างน้อยกว่า
ขั้นตอนอัพโหลดและทดสอบ
- เลือก Port ที่ตรงกับบอร์ด (ดูใน Device Manager)
- เลือก Board เป็น NodeMCU 1.0 (ESP-12E Module)
- อัพโหลดโค้ดไปยังบอร์ด (Sketch > Upload)
- เปิด Serial Monitor ตั้งค่า 9600 baud
- กดปุ่มรีโมทแต่ละปุ่ม ดูว่า Serial Monitor แสดงรหัสอะไร
- เอารหัสที่ได้ไปใส่ในโค้ดแทนที่ค่าตัวอย่าง
- อัพโหลดใหม่อีกครั้ง
ผลลัพธ์ที่คาดหวัง
| ปุ่ม | ผลลัพธ์ |
|---|---|
| 1 | LED 1 ติด |
| 2 | LED 1 ดับ |
| 3 | LED 2 ติด |
| 4 | LED 2 ดับ |
| 5 | LED 3 ติด |
| 6 | LED 3 ดับ |
| 7 | LED 4 ติด |
| 8 | LED 4 ดับ |
| 9 | LED ทั้ง 4 ดวงติด |
| 0 | LED ทั้ง 4 ดวงดับ |
สรุป
เมื่อต่อ KY-022 เข้ากับ ESP8266 แล้วใช้ library ที่ถูกต้อง ก็รับสัญญาณ IR จากรีโมทได้ไม่ยาก ข้อสำคัญคือต้องหารหัสของรีโมทที่ใช้อยู่จริงมาใส่ในโค้ด การใช้ตัวต้านทาน 220 Ohm กับ LED เป็นสิ่งจำเป็นเพื่อป้องกัน LED เสียหาย
อยากทำโปรเจคแบบนี้?
รับทำโปรเจค Arduino / IoT จบงานไว ส่งงานครบ พร้อมสอน
หากต้องการ รับทำโปรเจคอาดูโน่ หรือระบบ IoT แบบเร่งด่วน สามารถดูรายละเอียดบริการได้ที่หน้าแรก
จ้างทำโปรเจคเลย