自制单片机智能台灯,光线随环境自动调节
晚上写稿时,总觉得台灯的光线不太舒服 —— 白天阳光足,台灯亮度太高晃眼睛;到了深夜,光线又不够亮,看久了眼睛酸涩。作为电子爱好者,我寻思着用单片机做个能自动调光的台灯,花了两天时间搞定,用着特别顺手,今天就把制作过程分享出来。
一、项目目标:让光线始终恰到好处
这个智能台灯的核心功能很明确:能检测周围环境的光照强度,自动调节自身亮度。白天环境亮时,台灯亮度降低;夜晚环境暗时,台灯亮度提高,始终保持桌面光照在舒适的范围内(我测了下,300-500lux 最适合阅读)。
要实现这些功能,需要几个关键部件。控制核心选 Arduino Nano(本质是 ATmega328P 单片机),45 元一块,编程简单,新手也能快速上手。光照检测用 BH1750 光照传感器,12 元一个,I2C 接口,精度高,能测 0-65535lux。调光用 5W LED 灯珠,配合 PWM 调光模块,20 元一套,亮度足够且可调范围大。显示光照值用 0.96 寸 OLED 屏幕,15 元一个,小巧不占地。供电用 12V 电源适配器,15 元一个,稳定可靠。
二、材料清单:低成本打造舒适光源
材料采购时特意控制了成本,毕竟只是个台灯改造。
Arduino Nano 开发板(45 元)、BH1750 光照传感器(12 元)、5W LED 灯珠 + 散热片(10 元)、PWM 调光模块(10 元)、0.96 寸 OLED 屏幕(15 元)、12V 2A 电源适配器(15 元),再加上杜邦线、电阻、导线,总成本不到 120 元,比网上买的智能台灯便宜一半多。
特别提醒:买 LED 灯珠时一定要配散热片,5W 灯珠工作时会发热,没散热片容易烧坏;PWM 调光模块选带旋钮的,既能自动调光,也能手动干预,更实用。
三、硬件连接:三步接好线路
硬件连接很简单,按步骤操作不容易出错。
1.核心电路连接
Arduino 供电:12V 电源通过 DC 接口给开发板供电,开发板会自动转为 5V 给其他模块供电。
BH1750 传感器:VCC 接 3.3V,GND 接 GND,SCL 接 A5,SDA 接 A4(Arduino 自带 I2C 接口)。
OLED 屏幕:VCC 接 3.3V,GND 接 GND,SCL 接 A5,SDA 接 A4(和传感器共用 I2C 总线,地址不冲突)。
2.调光电路连接
PWM 调光模块:VCC 接 Arduino 的 5V,GND 接 GND,控制信号端(IN)接 D5 引脚。
LED 灯珠:正极接调光模块输出端 +,负极接输出端 -;调光模块输入端接 12V 电源,注意正负极别接反。
3.手动控制部分
调光模块自带的旋钮不用额外接线,旋转时会优先覆盖自动调光信号,适合临时调整亮度。
四、程序编写:让台灯 “读懂” 光线
程序用 Arduino IDE 编写,逻辑清晰,总共不到 100 行代码。
核心思路:每 1 秒读取一次 BH1750 的光照值,根据光照强度计算目标 PWM 占空比(环境光越暗,PWM 占空比越高),再通过 D5 引脚输出 PWM 信号控制调光模块。同时在 OLED 上显示当前环境光照和台灯输出亮度。
部分核心代码如下:
#include <Wire.h>
#include <BH1750.h>
#include <SSD1306Wire.h>
BH1750 lightMeter;
SSD1306Wire display(0x3C, A4, A5); // OLED地址0x3C
const int pwmPin = 5;
int targetLux = 400; // 目标光照值
void setup() {
Serial.begin(9600);
lightMeter.begin();
display.init();
display.flipScreenVertically();
pinMode(pwmPin, OUTPUT);
}
void loop() {
// 读取环境光照
uint16_t lux = lightMeter.readLightLevel();
// 计算PWM占空比(0-255)
int pwmValue = map(constrain(targetLux - lux, 0, 255), 0, 255, 0, 255);
analogWrite(pwmPin, pwmValue);
// 显示数据
display.clear();
display.drawString(0, 0, "Env: " + String(lux) + " lux");
display.drawString(0, 20, "LED: " + String(pwmValue*100/255) + "%");
display.display();
delay(1000); // 1秒刷新一次
}
程序写完后,用 USB 线传到 Arduino 里就行,不用额外下载器,新手也能操作。
五、调试过程:解决三个小问题
调试时遇到几个小插曲,解决后效果很完美。
1.光照值跳变
刚开始传感器读数忽高忽低,原来是台灯光线直射传感器导致的。把传感器移到台灯照射不到的地方(比如台灯底座侧面),读数立刻稳定了。
2.调光有频闪
LED 亮度低时肉眼能看到频闪,这是 PWM 频率太低的问题。在 Arduino 里用 TCCR0B = TCCR0B & B11111000 | B00000001; 语句把 PWM 频率提到 62.5kHz,频闪完全消失。
3.手动调光冲突
旋转旋钮时,自动调光会频繁干预。在程序里加了个判断:如果旋钮位置和自动计算值偏差超过 20%,就暂时关闭自动调光,松手 5 秒后再恢复,操作更流畅。
六、使用效果:从早到晚都舒服
用了一周,这个智能台灯彻底解决了光线不适的问题:
•早上 9 点阳光照进书房(环境光 800lux),台灯自动降到 10% 亮度,桌面总光照 420lux,不刺眼
•下午 4 点阴天(环境光 200lux),台灯升到 50% 亮度,总光照 410lux,和晴天一样亮
•晚上 10 点开着小夜灯(环境光 50lux),台灯升到 80% 亮度,总光照 390lux,看书不费眼
最方便的是手动干预功能,偶尔想调亮看细节图,转一下旋钮就行,5 秒后自动恢复,兼顾了智能和灵活。
七、升级方向:让台灯更懂你
这个台灯还有不少改进空间:
1.加个光敏电阻和时钟模块,根据日出日落自动调整目标光照值(比如晚上目标值降为 300lux,更护眼)
2.加蓝牙模块,连手机 APP 记录使用习惯,自动推荐最佳亮度
3.换用 RGBW 灯珠,能调节色温(冷光 / 暖光),冬天开暖光更温馨
我打算先加个时钟模块,成本也就 10 元,编程时让目标光照值随时间自动变化,比如早上 8-12 点 450lux,晚上 8 点后 300lux,更符合人体生理节律。
总之,这个单片机智能台灯制作简单、成本低,却能实实在在提升阅读舒适度。把普通台灯改成智能款,成就感满满,朋友来家里看到都问在哪买的。如果你也觉得家里的台灯不够舒服,不妨试试这个方案,动手过程比想象中简单多了!
|