Lux — วัดความสว่างด้วย LDR และ BH1750 สำหรับ Arduino

Lux คืออะไร?

Lux (lx) คือหน่วยวัด ความเข้มของแสงสว่าง — 1 lux = 1 lumen ต่อ 1 ตารางเมตร

ยิ่งค่า lux สูง = แสงยิ่งสว่าง ยิ่งค่า lux ต่ำ = แสงยิ่งมืด

สภาพแวดล้อมความสว่าง (Lux)
กลางคืนไร้แสงจันทร์0.001 - 0.01 lux
พระจันทร์เต็มดวง~0.3 lux
แสงเทียน (1 เมตร)~1 lux
ถนนตอนกลางคืน (เสาไฟ)10 - 30 lux
ห้องนั่งเล่น (ไฟบ้าน)100 - 300 lux
สำนักงาน / ห้องทำงาน300 - 500 lux
ร้านสะดวกซื้อ500 - 1,000 lux
วันที่มีเมฆมาก1,000 - 5,000 lux
วันแดดจัด (ไม่โดนตรง)10,000 - 25,000 lux
แดดจัดตอนเที่ยง~100,000 lux

ทำไมต้องวัด Lux?

ในงาน Smart Home และ IoT — การวัด lux มีประโยชน์หลายอย่าง:

  • 💡 เปิดไฟอัตโนมัติ — ถ้า lux ต่ำกว่า 50 → เปิดไฟ, ถ้า lux > 300 → ปิดไฟ
  • 🌱 ระบบรดน้ำต้นไม้ — ค่า lux บอกความเข้มแดด → ปรับการรดน้ำ
  • 🪟 Solar Panel — คำนวณพลังงานที่ผลิตได้จากค่า lux
  • 🏠 Smart Blind — ปิดม่านอัตโนมัติเมื่อ lux สูงเกินไป

เซ็นเซอร์วัด Lux สำหรับ Arduino

เซ็นเซอร์ช่วงวัดInterfaceราคาข้อดี
LDR (Light Dependent Resistor)~1 - 10,000 luxAnalog~5 บาทถูกสุด, ใช้ Analog Read
BH17501 - 65,535 luxI2C~30-50 บาทแม่นยำ, อ่านค่า lux โดยตรง
TSL25610.1 - 40,000 luxI2C~50-80 บาทแยกอินฟราเรด, ช่วงกว้าง
MAX440090.045 - 188,000 luxI2C~60-100 บาทกินไฟต่ำมาก, ช่วงกว้างมาก

LDR — วัด lux แบบประหยัด (Analog)

LDR ($0.15) คือตัวต้านทานที่เปลี่ยนแปลงค่าตามแสง — ใช้กับ Analog Read ของ Arduino ได้เลย

// LDR → Arduino — วงจร
// [VCC 5V] ──[LDR]──[A0]──[R 10kΩ]──[GND]
// ยิ่งแสงมาก → ค่า analog ยิ่งสูง

const int LDR_PIN = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int raw = analogRead(LDR_PIN);            // 0-1023
  
  // แปลงเป็น Lux (ประมาณการ)
  float voltage = raw * (5.0 / 1023.0);
  float lux = 500.0 * pow(voltage, -1.5);    // สูตรประมาณ
  
  Serial.print("Raw: "); Serial.print(raw);
  Serial.print(" | Lux: "); Serial.println(lux);
  
  // เปิดไฟเมื่อมืด
  if (lux < 30) {
    digitalWrite(RELAY_LIGHT, HIGH);  // เปิดไฟ
  } else {
    digitalWrite(RELAY_LIGHT, LOW);   // ปิดไฟ
  }
  
  delay(1000);
}

⚠️ LDR ไม่แม่นยำเท่า BH1750! LDR ใช้สูตรประมาณการเท่านั้น ถ้าต้องการค่า lux แม่นยำ (เช่น วัดพลังงาน solar หรือ research) ควรใช้ BH1750 ซึ่งอ่านค่าเป็น lux โดยตรง

BH1750 — เซ็นเซอร์ lux แม่นยำ (I2C)

// BH1750 — I2C, ส่งค่า lux กลับมาโดยตรง
// VCC → 5V, GND → GND, SDA → A4, SCL → A5 (Arduino Uno)

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  lightMeter.begin();
}

void loop() {
  float lux = lightMeter.readLightLevel();
  Serial.print("Lux: "); Serial.println(lux);
  
  // Logic เปิด/ปิดไฟ
  if (lux < 50) {
    Serial.println("🌙 มืดแล้ว → เปิดไฟ");
    // digitalWrite(RELAY, HIGH);
  } else if (lux > 200) {
    Serial.println("☀️ สว่างแล้ว → ปิดไฟ");
    // digitalWrite(RELAY, LOW);
  }
  
  delay(500);
}

Lux กับ Solar Panel — คำนวณพลังงาน

ค่า lux ช่วยประมาณกำลังที่ Solar Panel จะผลิตได้:

สมมติ Solar Panel 20W ที่ STC (Standard Test Condition = 100,000 lux):
  • กลางแจ้งแดดจัด (100,000 lux) → 20W (100%)
  • เมฆบางส่วน (50,000 lux) → ~10W (50%)
  • เมฆมาก (10,000 lux) → ~2W (10%)
  • ในร่มใกล้หน้าต่าง (1,000 lux) → ~0.2W (1%)
  • กลางคืน (0 lux) → 0W

ข้อควรจำ: lux ที่วัดได้ = แค่ความสว่าง ณ จุดนั้น
Solar Panel ต้องการทั้งความเข้ม + มุมที่เหมาะสม

ค่ามาตรฐาน Lux สำหรับงานต่าง ๆ

การใช้งานLux ที่แนะนำเซ็นเซอร์ที่ใช้เปิด-ปิด
📖 อ่านหนังสือ300 - 500 lux
💻 ทำงานคอม200 - 400 lux
🚶 ทางเดินกลางคืน50 - 100 luxPIR + LDR
🌙 ไฟกลางคืน (night light)10 - 30 luxLDR
🌱 ต้นไม้ในร่ม1,000 - 5,000 luxBH1750
☀️ Solar Panel ทำงาน>30,000 luxBH1750

โปรเจกต์แนะนำ: เปิดไฟอัตโนมัติตาม Lux + PIR

// Smart Light — LDR + PIR + Relay
// LDR วัด lux → ถ้ามืด + PIR เจอคน → เปิดไฟ

const int LDR_PIN = A0;
const int PIR_PIN = 7;
const int RELAY = 8;
int lightThreshold = 100;  // lux

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, LOW);
}

void loop() {
  float lux = readLux();
  bool motion = digitalRead(PIR_PIN) == HIGH;
  
  if (lux < lightThreshold && motion) {
    digitalWrite(RELAY, HIGH);   // เปิดไฟ
    delay(120000);                // เปิดค้าง 2 นาที
    digitalWrite(RELAY, LOW);    // ปิดไฟ
  }
  delay(500);
}

float readLux() {
  int raw = analogRead(LDR_PIN);
  return 500.0 * pow(5.0 * raw / 1023.0, -1.5);
}

⚠️ หมายเหตุ: เนื้อหาค้นคว้าและเรียบเรียงโดย Hermes AI — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง

⚠️ เนื้อหาถูกสร้างโดย AI (Hermes AI) — ข้อมูลทางเทคนิคอาจต้องตรวจสอบก่อนนำไปใช้งานจริง