📑 เนื้อหาในบทความ
🌟 แนะนำเซ็นเซอร์แสง (Light Sensors)
เซ็นเซอร์แสงเป็นหนึ่งในเซ็นเซอร์พื้นฐานที่สุดและมีประโยชน์มากที่สุดในโลกของ IoT และอิเล็กทรอนิกส์ ไม่ว่าคุณจะต้องการสร้างโคมไฟอัจฉริยะที่เปิด-ปิดอัตโนมัติ, ระบบเตือนดวงอาทิตย์, หรือเครื่องวัดความสว่าง เซ็นเซอร์แสงคือคำตอบ!
ในบทความนี้ เราจะมาเรียนรู้กันถึง 2 เซ็นเซอร์แสงที่ได้รับความนิยมมากที่สุดสำหรับ Arduino:
- LDR (Light Dependent Resistor) - เซ็นเซอร์แสงแบบอะนาล็อกที่ราคาถูกและใช้งานง่าย
- BH1750 - เซ็นเซอร์แสงดิจิทัลที่ให้ค่าแม่นยำสูงและวัดหน่วย Lux
🔆 LDR (Light Dependent Resistor)
Light Dependent Resistor (LDR) หรือที่เรียกว่า Photoresistor เป็นตัวต้านทานที่เปลี่ยนค่าตามความสว่างของแสง ยิ่งแสงสว่างมาก ค่าตัวต้านทานยิ่งต่ำลง และในทางกลับกัน
📦 อุปกรณ์ที่ต้องใช้
- ✅ Arduino Uno (หรือ Arduino รุ่นอื่นๆ)
- ✅ LDR (5mm หรือ 10mm)
- ✅ ตัวต้านทาน 10kΩ (1 ตัว)
- ✅ Breadboard และสาย jumper
🔌 การต่อวงจร (Voltage Divider Circuit)
เราต่อวงจรแบบ Voltage Divider เพื่อแปลงค่าตัวต้านทานของ LDR เป็นแรงดันที่ Arduino สามารถอ่านได้:
- 📍 LDR ขา 1 → 5V
- 📍 LDR ขา 2 → ตัวต้านทาน 10kΩ → GND
- 📍 จุดระหว่าง LDR กับตัวต้านทาน → Pin A0 (Analog Input)
💻 โค้ด Arduino - อ่านค่าแสงจาก LDR
// กำหนดขา Analog Input สำหรับ LDR
const int ldrPin = A0;
// ตัวแปรสำหรับเก็บค่า
int ldrValue = 0;
void setup() {
Serial.begin(9600); // เริ่มต้น Serial Monitor
pinMode(ldrPin, INPUT); // ตั้งค่า LDR pin เป็น input
}
void loop() {
// อ่านค่าจาก LDR (0 - 1023)
ldrValue = analogRead(ldrPin);
// แสดงค่าบน Serial Monitor
Serial.print("ความสว่างแสง: ");
Serial.print(ldrValue);
Serial.print(" | ");
// แปลงค่าเป็นเปอร์เซ็นต์
int brightnessPercent = map(ldrValue, 0, 1023, 0, 100);
Serial.print(brightnessPercent);
Serial.println("%");
// ตรวจสอบระดับแสงและแสดงผล
if (ldrValue < 200) {
Serial.println("สถานะ: มืดมาก 🔦");
} else if (ldrValue < 500) {
Serial.println("สถานะ: แสงน้อย 🌤️");
} else if (ldrValue < 800) {
Serial.println("สถานะ: แสงปานกลาง ⛅");
} else {
Serial.println("สถานะ: แสงจ้ามาก ☀️");
}
delay(1000); // รอ 1 วินาที
}💡 โปรเจกต์: โคมไฟอัจฉริยะอัตโนมัติ
ต่อยอดจากโค้ดด้านบน โดยเพิ่ม LED เข้าไป เพื่อให้ไฟเปิดอัตโนมัติเมื่อมืด:
const int ldrPin = A0;
const int ledPin = 13; // LED บนบอร์ด Arduino
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
ldrValue = analogRead(ldrPin);
// ถ้าแสงมืด (ค่าน้อยกว่า 300) เปิดไฟ
if (ldrValue < 300) {
digitalWrite(ledPin, HIGH);
Serial.println("แสงมืด - เปิดไฟ 💡");
} else {
digitalWrite(ledPin, LOW);
Serial.println("แสงสว่าง - ปิดไห 🌙");
}
delay(100);
}💡 เซ็นเซอร์แสงดิจิทัล BH1750
BH1750 เป็นเซ็นเซอร์แสงดิจิทัลที่ให้ค่าความสว่างในหน่วย Lux แม่นยำกว่า LDR มาก ใช้งานร่วมกับ Arduino ผ่านบัส I2C ทำให้ต่อสายง่ายและประหยัดขา GPIO
📦 อุปกรณ์ที่ต้องใช้
- ✅ Arduino Uno (หรือ Arduino รุ่นอื่นๆ)
- ✅ เซ็นเซอร์ BH1750
- ✅ Breadboard และสาย jumper
🔌 การต่อวงจร (I2C)
ต่อสายตามนี้ (ใช้ I2C bus):
- 📍 VCC → 3.3V หรือ 5V
- 📍 GND → GND
- 📍 SCL → Pin A5 (หรือ SCL)
- 📍 SDA → Pin A4 (หรือ SDA)
📚 การติดตั้ง Library
1. เปิด Arduino IDE
2. ไปที่ Sketch → Include Library → Manage Libraries
3. ค้นหา "BH1750" และติดตั้ง library จาก Christopher Laws
💻 โค้ด Arduino - อ่านค่าแสงจาก BH1750
#include <Wire.h>
#include <BH1750.h>
// สร้าง object สำหรับเซ็นเซอร์
BH1750 lightMeter;
void setup() {
Serial.begin(9600);
// เริ่มต้น I2C bus
Wire.begin();
// เริ่มต้นเซ็นเซอร์
lightMeter.begin();
Serial.println("เริ่มต้นเซ็นเซอร์ BH1750...");
delay(1000);
}
void loop() {
// อ่านค่าแสง (Lux)
float lux = lightMeter.readLightLevel();
// แสดงค่าบน Serial Monitor
Serial.print("ความสว่าง: ");
Serial.print(lux);
Serial.println(" lx");
// ตรวจสอบระดับแสง
if (lux < 10) {
Serial.println("สถานะ: มืดมาก 🔦");
} else if (lux < 50) {
Serial.println("สถานะ: แสงน้อย 🌙");
} else if (lux < 200) {
Serial.println("สถานะ: แสงปานกลาง 🌤️");
} else if (lux < 500) {
Serial.println("สถานะ: แสงสว่าง ☀️");
} else {
Serial.println("สถานะ: แสงจ้ามาก ☀️☀️");
}
Serial.println("-------------------");
delay(2000); // รอ 2 วินาที
}🎨 ตัวอย่างโปรเจกต์ที่น่าสนใจ
1️⃣ ระบบเปิด-ปิดไฟอัตโนมัติ
ใช้ LDR หรือ BH1750 เปิด-ปิดไฟในบ้านอัตโนมัติเมื่อมืด ประหยัดไฟและสะดวกสบาย
2️⃣ เครื่องวัดความสว่าง (Lux Meter)
สร้างเครื่องวัดความสว่างแบบมืออาชีพด้วย BH1750 เพื่อใช้ในการถ่ายภาพหรือออกแบบแสง
3️⃣ ระบบรดน้ำอัตโนมัติ
ตรวจสอบแสงอาทิตย์เพื่อปรับเวลาการรดน้ำพืชให้เหมาะสมกับสภาพแสง
4️⃣ ม่านบ้านอัจฉริยะ
เปิด-ปิดม่านอัตโนมัติตามแสงแดด เพื่อประหยัดพลังงานและความเย็น
5️⃣ โคมไฟปรับความสว่าง
ปรับความสว่างไฟ LED อัตโนมัติตามแสงภายในห้อง (PWM)
6️⃣ เตือนดวงอาทิตย์
แจ้งเตือนเมื่อมีแสงแดดจ้า เพื่อให้คุณรู้ว่าเวลาออกกำลังกายกลางแจ้ง
⚖️ เปรียบเทียบ LDR vs BH1750
| คุณสมบัติ | LDR | BH1750 |
|---|---|---|
| ราคา | ถูก (5-10 บาท) | ปานกลาง (30-50 บาท) |
| ความแม่นยำ | ปานกลาง | สูง (Lux) |
| การใช้งาน | ง่ายมาก | ต้องใช้ I2C |
| Output | Analog (0-1023) | Digital (Lux) |
| ใช้ขา GPIO | 1 ขา | 2 ขา (I2C) |
| เหมาะกับ | โปรเจกต์ง่ายๆ | โปรเจกต์ที่ต้องการความแม่นยำ |
💡 คำแนะนำในการเลือกใช้
เลือก LDR ถ้าคุณเป็นมือใหม่และอยากเริ่มต้นด้วยโปรเจกต์ง่ายๆ เช่น ไฟเปิดอัตโนมัติ
เลือก BH1750 ถ้าคุณต้องการค่าที่แม่นยำ วัดหน่วย Lux หรือทำโปรเจกต์ที่ซับซ้อนกว่า เช่น เครื่องวัดความสว่าง
🔧 การแก้ปัญหาที่พบบ่อย
❗ ปัญหา: LDR อ่านค่าได้แค่ 0 หรือ 1023 เท่านั้น
สาเหตุ: อาจต่อวงจรผิด หรือตัวต้านทานเสีย
วิธีแก้: ตรวจสอบการต่อสาย Voltage Divider ให้ถูกต้อง ลองเปลี่ยนตัวต้านทาน 10kΩ
❗ ปัญหา: BH1750 อ่านค่าไม่ได้
สาเหตุ: อาจต่อ I2C ผิด หรือ Library ไม่ถูกต้อง
วิธีแก้: ตรวจสอบการต่อ SCL/SDA ให้ถูกต้อง (A5/A4) ติดตั้ง BH1750 library ที่ถูกต้อง
❗ ปัญหา: ค่าที่อ่านได้ไม่คงที่
สาเหตุ: แสงในห้องกระพริบ หรือเซ็นเซอร์มีความไวสูง
วิธีแก้: ใช้ค่าเฉลี่ย (averaging) จากหลายๆ ค่าอ่าน เพื่อให้ผลลัพธ์เสถียรขึ้น
💻 โค้ด: การใช้ค่าเฉลี่ย (Averaging)
// ฟังก์ชันอ่านค่าเฉลี่ยจาก LDR
int readLDRAverage(int pin, int samples) {
long sum = 0;
for (int i = 0; i < samples; i++) {
sum += analogRead(pin);
delay(10); // รอ 10ms ระหว่างแต่ละครั้ง
}
return sum / samples;
}
void loop() {
// อ่านค่าเฉลี่ย 10 ครั้ง
int ldrValue = readLDRAverage(A0, 10);
Serial.print("ค่าเฉลี่ย: ");
Serial.println(ldrValue);
delay(1000);
}✅ สรุป
ในบทความนี้ เราได้เรียนรู้เกี่ยวกับเซ็นเซอร์แสง 2 ประเภทที่ได้รับความนิยมสำหรับ Arduino:
- LDR - เหมาะสำหรับมือใหม่ ราคาถูก ใช้งานง่าย แต่ความแม่นยำปานกลาง
- BH1750 - ให้ค่าแม่นยำสูง วัดหน่วย Lux ใช้ I2C เหมาะกับโปรเจกต์ที่ต้องการความแม่นยำ
ทั้งสองเซ็นเซอร์มีข้อดีและข้อเสียที่แตกต่างกัน ขึ้นอยู่กับความต้องการของโปรเจกต์และงบประมาณที่คุณมี
🚀 โปรเจกต์ต่อไปที่ควรลอง
- ✨ ระบบควบคุมไฟอัจฉริยะด้วย ESP32 และ CynoIoT
- ✨ เครื่องวัดคุณภาพอากาศพร้อมเซ็นเซอร์แสง
- ✨ ระบบอัตโนมัติสำหรับบ้านอัจฉริยะ (Smart Home)