打印

自制单片机智能台灯,光线随环境自动调节

[复制链接]
934|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jerry_jn|  楼主 | 2025-7-18 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

自制单片机智能台灯,光线随环境自动调节

晚上写稿时,总觉得台灯的光线不太舒服 —— 白天阳光足,台灯亮度太高晃眼睛;到了深夜,光线又不够亮,看久了眼睛酸涩。作为电子爱好者,我寻思着用单片机做个能自动调光的台灯,花了两天时间搞定,用着特别顺手,今天就把制作过程分享出来。

一、项目目标:让光线始终恰到好处

这个智能台灯的核心功能很明确:能检测周围环境的光照强度,自动调节自身亮度。白天环境亮时,台灯亮度降低;夜晚环境暗时,台灯亮度提高,始终保持桌面光照在舒适的范围内(我测了下,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,更符合人体生理节律。

总之,这个单片机智能台灯制作简单、成本低,却能实实在在提升阅读舒适度。把普通台灯改成智能款,成就感满满,朋友来家里看到都问在哪买的。如果你也觉得家里的台灯不够舒服,不妨试试这个方案,动手过程比想象中简单多了!

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

11

帖子

0

粉丝