基于 Arduino 的自動晝夜 LED 燈帶控制器設(shè)計(jì)
1. 項(xiàng)目概述:讓燈自己知道“天黑了”
本項(xiàng)目實(shí)現(xiàn)了一個 自動燈光控制系統(tǒng):
當(dāng)環(huán)境變暗時,Arduino 自動打開 12V LED 燈帶;
當(dāng)環(huán)境光線變亮?xí)r,又自動關(guān)閉燈帶。
系統(tǒng)核心特性:
利用 LDR 光敏電阻 感知環(huán)境亮度;
通過 電壓分壓電路 將光強(qiáng)轉(zhuǎn)換為可測電壓;
使用 Arduino UNO Mini 讀取光強(qiáng)并做邏輯判斷;
通過 5V 繼電器模塊 控制 12V LED 燈帶通斷;
無需按鍵、無需人為干預(yù),實(shí)現(xiàn) 全自動“天黑亮燈,天亮熄燈”。
這是一個非常適合入門的 Arduino 項(xiàng)目,可以一次性學(xué)到:
模擬傳感器讀取(
analogRead)電阻分壓原理
繼電器驅(qū)動高壓/大功率負(fù)載
簡單的控制邏輯與閾值判斷
2. 硬件清單與功能說明
2.1 主要元件
Arduino UNO Mini × 1
基于 ATmega328P 微控制器;
5V 邏輯電平,板載 USB 接口;
負(fù)責(zé)采集 LDR 信號、執(zhí)行控制算法、驅(qū)動繼電器。
LDR 光敏電阻(約 5 MΩ)× 1
亮:電阻值降低;暗:電阻值升高;
通過與 10k 電阻組成分壓,將光照強(qiáng)度轉(zhuǎn)換為電壓。
10kΩ 電阻 × 1
與 LDR 組成 電壓分壓器;
10k 是典型室內(nèi)光照下比較常用的分壓值,能得到合適的 ADC 讀數(shù)范圍。
5V 繼電器模塊 × 1(如:DFRobot Gravity 5A Relay)
線圈側(cè)使用 Arduino 的 5V 邏輯控制;
觸點(diǎn)側(cè)串聯(lián)在 12V LED 燈帶的供電回路中;
提供 電氣隔離,保護(hù) Arduino 不直接接觸 12V 負(fù)載電路。
12V LED 燈帶 × 1
項(xiàng)目中的光源負(fù)載;
通常需要單獨(dú)的 12V DC 電源適配器 供電。
12V 電源適配器 × 1
專門為 LED 燈帶提供電源;
通過繼電器控制燈帶的“斷/通”;
注意電流能力應(yīng)匹配燈帶功耗。
面包板與若干杜邦線
用于快速搭建原型電路;
連接 Arduino ? LDR 分壓 ? 繼電器模塊 ? 12V 燈帶。
熱熔膠槍(可選)
用于固定 LDR 位置或整理線材,提升結(jié)構(gòu)可靠性。
3. 工作原理與電路設(shè)計(jì)
3.1 LDR 光敏電阻與電壓分壓
LDR 的電阻值會隨光強(qiáng)變化:
亮光 → 電阻變小(幾千歐甚至更低)
黑暗 → 電阻變大(可達(dá)兆歐級)
直接測電阻不方便,因此使用經(jīng)典的 電壓分壓電路:
LDR 一端接 5V
LDR 另一端接模擬輸入 A0
在 A0 與 GND 之間串接 10k 電阻
形成如下結(jié)構(gòu):
5V ── LDR ── A0 ── 10k ── GND
A0 點(diǎn)的電壓隨光照變化而變化,Arduino 通過 analogRead(A0) 讀到 0–1023 之間的數(shù)值,即可反映當(dāng)前亮度。
3.2 繼電器控制 12V LED 燈帶
為了安全與隔離,LED 燈帶不直接由 Arduino 供電,而是:
燈帶的 正極(+) 直接接 12V 電源正極;
燈帶的 負(fù)極(-) 經(jīng)繼電器常開觸點(diǎn) (NO, COM) 串聯(lián)后接到 12V 電源負(fù)極。
典型接法:
12V 電源 + ───── LED Strip + 12V 電源 - ── Relay NO Relay COM ───── LED Strip -
當(dāng)繼電器吸合時 NO 與 COM 接通,LED 燈帶形成完整回路 → 點(diǎn)亮;
當(dāng)繼電器斷開時,回路被切斷 → 熄滅。
繼電器控制腳連接:
Relay VCC → Arduino 5V
Relay GND → Arduino GND
Relay IN → Arduino 數(shù)字引腳 D2
4. 硬件連接步驟(匯總)
LDR 分壓接線
LDR 一腳 → 5V
LDR 另一腳 → A0
10k 電阻一端接 A0,另一端接 GND
繼電器模塊接線
VCC → 5V
GND → GND
IN → D2(即
RELAY_PIN)
LED 燈帶與 12V 電源
燈帶 “+” → 12V 適配器 “+”
燈帶 “–” → 繼電器 COM 接線端
繼電器 NO → 12V 適配器 “–”
?? 安全提示:
雖然這里使用的是 12V 低壓直流,但依然要注意極性與接線牢固,避免短路。若將來擴(kuò)展到市電負(fù)載(220V AC),必須使用符合安全規(guī)范的繼電器與布線方式,并做好絕緣防護(hù)。
5. 軟件實(shí)現(xiàn):自動晝夜判斷邏輯
你原文里附帶的代碼是一個 “按鍵控制繼電器” 示例(BUTTON_PIN + INPUT_PULLUP),非常適合練習(xí)繼電器控制和防抖。但要實(shí)現(xiàn)真正的 “自動白天關(guān)燈、夜晚開燈”,我們需要改成讀取 LDR 的模擬值,并根據(jù)閾值控制繼電器。
下面給出一個 基于 LDR 的自動控制完整示例,邏輯為:
讀取 A0 模擬值
lightValue;設(shè)置“變暗閾值”和“變亮閾值”,形成簡單 遲滯,避免光線波動時燈頻繁閃爍;
根據(jù)當(dāng)前狀態(tài)和光照水平,決定是否吸合/釋放繼電器。
5.1 自動晝夜控制示例代碼(推薦)
// Automatic Day-Night LED Strip Controller Using Arduino
// 硬件:Arduino UNO Mini + LDR + 10k 電阻 + 5V 繼電器 + 12V LED 燈帶
// 功能:環(huán)境變暗 → 自動打開 LED 燈帶;環(huán)境變亮 → 自動關(guān)閉 LED 燈帶
const int LDR_PIN = A0; // LDR 分壓中間點(diǎn)接 A0
const int RELAY_PIN = 2; // 繼電器控制引腳
// 注意:很多繼電器模塊是“低電平觸發(fā)”(active LOW)
// 如果是低電平觸發(fā),請?jiān)O(shè)為 true;如果是高電平觸發(fā),設(shè)為 false
const bool RELAY_ACTIVE_LOW = true;
// 根據(jù)實(shí)測光線情況調(diào)節(jié):值越大代表越暗
// 這里用兩個閾值實(shí)現(xiàn)簡單遲滯:
// - 當(dāng) lightValue > THRESHOLD_DARK 時認(rèn)為“夠暗,可以開燈”
// - 當(dāng) lightValue < THRESHOLD_LIGHT 時認(rèn)為“夠亮,可以關(guān)燈”
const int THRESHOLD_DARK = 700; // 暗環(huán)境閾值(示例值)
const int THRESHOLD_LIGHT = 600; // 亮環(huán)境閾值(示例值)
bool lightOn = false; // 當(dāng)前燈狀態(tài)
void setRelay(bool on) {
if (RELAY_ACTIVE_LOW) {
digitalWrite(RELAY_PIN, on ? LOW : HIGH);
} else {
digitalWrite(RELAY_PIN, on ? HIGH : LOW);
}
}
void setup() {
Serial.begin(9600);
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
// 啟動時默認(rèn)關(guān)閉燈帶
lightOn = false;
setRelay(lightOn);
Serial.println("Automatic Day-Night LED Strip Controller");
Serial.println("Cover the LDR to turn the LED strip ON.");
}
void loop() {
int lightValue = analogRead(LDR_PIN); // 讀取 0~1023
// 簡單遲滯控制
if (!lightOn && lightValue > THRESHOLD_DARK) {
// 環(huán)境足夠暗且當(dāng)前燈是關(guān)的 → 開燈
lightOn = true;
setRelay(lightOn);
Serial.print("LightValue: ");
Serial.print(lightValue);
Serial.println(" -> DARK, LED Strip ON");
} else if (lightOn && lightValue < THRESHOLD_LIGHT) {
// 環(huán)境足夠亮且當(dāng)前燈是開的 → 關(guān)燈
lightOn = false;
setRelay(lightOn);
Serial.print("LightValue: ");
Serial.print(lightValue);
Serial.println(" -> BRIGHT, LED Strip OFF");
}
// 調(diào)試輸出
Serial.print("Current LightValue: ");
Serial.println(lightValue);
delay(200); // 簡單節(jié)流,避免串口刷屏
}使用建議:
上傳代碼后,打開串口監(jiān)視器(9600 波特率),在不同光照下查看
lightValue大致范圍;根據(jù)實(shí)際環(huán)境,微調(diào)
THRESHOLD_DARK與THRESHOLD_LIGHT;確認(rèn)繼電器模塊是否為“低電平觸發(fā)”,如果不是,將
RELAY_ACTIVE_LOW改成false。
6. 原始“按鍵控制繼電器”代碼的定位
你提供的這段代碼本身是很好的 繼電器 + 按鍵防抖 教學(xué)示例:
使用
INPUT_PULLUP作為按鍵輸入模式;在
loop()中做簡單防抖;用
RELAY_ACTIVE_LOW適配不同繼電器模塊的觸發(fā)邏輯。
這段代碼可以作為 “手動開關(guān)模式” 或 調(diào)試用模式,例如:
先用按鍵確認(rèn)繼電器和燈帶接線無誤;
再切換到上面的 LDR 自動模式。
你可以把它單獨(dú)作為“附錄:按鍵控制繼電器示例”放在文章末尾。
7. 測試方法與調(diào)試步驟
單獨(dú)測試?yán)^電器 + 燈帶
先使用“按鍵控制繼電器”的簡化代碼;
手動按鍵,看燈帶是否跟隨 ON/OFF;
確認(rèn)繼電器接線、電源極性正確。
測試 LDR 讀數(shù)
使用一個只做
analogRead(A0)并Serial.println()的小程序;在明亮、半暗、全暗環(huán)境下記錄
lightValue;以實(shí)際讀數(shù)為依據(jù)設(shè)置
THRESHOLD_DARK / THRESHOLD_LIGHT。整體聯(lián)調(diào)
上傳自動控制代碼;
用手遮住 LDR,觀察串口顯示是否識別為“DARK”并點(diǎn)亮燈帶;
用手機(jī)手電筒/臺燈照向 LDR,觀察是否識別為“BRIGHT”并熄滅燈帶;
根據(jù)實(shí)際使用環(huán)境微調(diào)閾值和延時。
8. 小結(jié)與擴(kuò)展方向
這個 基于 Arduino 的自動晝夜 LED 燈帶控制器,在結(jié)構(gòu)上非常簡單,卻完整涵蓋了 IoT 與嵌入式入門所需的多個核心知識點(diǎn):
傳感器(LDR) → 模擬信號采集;
電阻分壓與 ADC 讀數(shù)之間的關(guān)系;
繼電器驅(qū)動高功率負(fù)載的安全做法;
狀態(tài)邏輯 + 閾值 + 遲滯,避免抖動。
在此基礎(chǔ)上,你還可以進(jìn)一步擴(kuò)展:
使用 電位器 調(diào)節(jié)“靈敏度”,實(shí)時改變閾值;
加入 手動模式/自動模式切換開關(guān);
用 OLED 或 LCD1602 實(shí)時顯示光照值與當(dāng)前燈狀態(tài);
使用 ESP8266 / ESP32 + Wi-Fi,把光照和燈狀態(tài)上傳到手機(jī) App 或云平臺。












評論