从吃灰到发光:我如何用吃灰的STM32小熊派,做了一个能自动开关的桌面小夜灯
从吃灰到发光:我如何用吃灰的STM32小熊派,做了一个能自动开关的桌面小夜灯
去年双十一冲动消费的小熊派开发板,在抽屉里躺了大半年后终于重见天日。作为一个物联网小白,我决定用它做个实用的小玩意——能根据环境光线自动开关的智能小夜灯。整个过程就像玩电子积木,从硬件组装到云端配置,每一步都充满惊喜和意外。下面就把这个有趣的项目分享给大家,手把手教你如何让吃灰的开发板焕发新生。
1. 硬件准备与连接
翻箱倒柜找出尘封的小熊派开发板套件,核心组件包括:
- STM32L431RC主控的开发板
- E53_SC1扩展板(含光敏传感器和高亮LED)
- Type-C数据线
- 杜邦线若干
注意:不同批次的扩展板引脚可能略有差异,建议先查看板子背面的版本号。
硬件连接其实比想象中简单得多,只需要三步:
- 将E53_SC1扩展板插入小熊派底部的GPIO接口
- 用USB线连接开发板和电脑
- 把开发板右上角的模式开关拨到"AT-MCU"位置
连接完成后,开发板的电源指示灯应该亮起。如果发现LED不亮,先别慌——我的板子刚开始也这样,后来发现是USB接口接触不良,换个接口就好了。
2. 开发环境搭建
工欲善其事,必先利其器。经过对比几种开发工具,我最终选择了VSCode + IoT Link插件的方案,原因很简单:
- 免费开源
- 跨平台支持
- 丰富的插件生态
具体安装步骤:
# 安装VSCode
sudo apt install code # Linux
brew install --cask visual-studio-code # Mac
# 安装IoT Link插件
code --install-extension huawei.iot-link
配置过程中遇到个小坑:插件需要Java环境支持。如果运行时报错,记得先安装JDK:
sudo apt install openjdk-11-jdk
开发环境搞定后,新建工程时选择"BearPi-HM_Nano"模板,这个预置了华为LiteOS操作系统和必要的驱动库,能省去大量底层配置工作。
3. 传感器数据采集与处理
要让小夜灯智能起来,首先得教会它"感知"环境光线。E53_SC1扩展板上的光敏传感器输出的是模拟信号,需要经过ADC转换。在LiteOS中读取传感器数据的核心代码如下:
// 初始化ADC
void light_sensor_init(void)
{
IoTAdcInit(ADC_CHANNEL, 1600);
}
// 读取光照强度
float get_light_intensity(void)
{
unsigned short data = 0;
IoTAdcRead(ADC_CHANNEL, &data, IOT_ADC_EQU_MODEL_4, IOT_ADC_CUR_BAIS_DEFAULT, 0xff);
return (float)data / 4096 * REFERENCE_VOLTAGE;
}
实际测试中发现原始数据波动较大,于是加了简单的滑动平均滤波:
#define SAMPLE_SIZE 5
float light_samples[SAMPLE_SIZE];
float get_filtered_light(void)
{
static int index = 0;
light_samples[index] = get_light_intensity();
index = (index + 1) % SAMPLE_SIZE;
float sum = 0;
for(int i=0; i<SAMPLE_SIZE; i++) {
sum += light_samples[i];
}
return sum / SAMPLE_SIZE;
}
经过实测,这套方案在室内光线变化时能稳定输出,不会出现频繁跳变。
4. 华为云物联网平台配置
为了让小夜灯具备云端控制能力,我选择了华为云物联网平台(免费版足够个人使用)。配置过程主要分四步:
-
创建产品:在IoTDA服务中新建一个产品,关键参数如下:
- 协议类型:LWM2M
- 数据格式:二进制
- 厂商名称:自定义
-
定义物模型:添加两个服务属性:
- light_intensity(float类型,表示光照强度)
- led_switch(bool类型,控制LED开关)
-
注册设备:获取设备ID和密钥,这些信息需要烧录到开发板中。
-
规则引擎配置:设置自动控制逻辑,当light_intensity低于阈值时自动开启LED。
提示:华为云控制台这两年改版较多,如果找不到对应菜单,建议直接搜索功能名称。
云端配置完成后,需要在代码中添加设备接入逻辑。华为提供了完善的LiteOS SDK,对接起来非常方便:
// 设备初始化
void iot_connect(void)
{
IoTDeviceParam device = {
.device_id = "your_device_id",
.secret = "your_secret",
.server_ip = "your_server_ip",
.server_port = 5683
};
IoTDeviceInit(&device);
}
// 上报传感器数据
void report_sensor_data(float light)
{
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "light_intensity", light);
char *payload = cJSON_PrintUnformatted(root);
IoTDeviceReport(payload);
cJSON_Delete(root);
free(payload);
}
5. 实际使用与优化
项目完成后,我把这个小夜灯放在书桌上,发现几个可以改进的地方:
-
灵敏度调节:原始阈值固定,白天拉窗帘时也会触发。于是增加了手动调节功能,通过开发板上的按键动态调整触发阈值。
-
灯光渐变:直接开关LED太刺眼,改用PWM实现淡入淡出效果:
void led_fade(uint8_t target, uint16_t duration)
{
uint8_t current = get_led_brightness();
int step = target > current ? 1 : -1;
while(current != target) {
current += step;
set_led_brightness(current);
LOS_Msleep(duration / abs(target - current));
}
}
- 离线模式:网络不稳定时自动切换本地控制,保证基本功能可用。
经过这些优化,这个小夜灯已经完美融入我的工作环境。最让我惊喜的是,整个项目从开始到完成只用了两个周末,成本几乎为零(开发板是现成的,华为云服务有免费额度),却解决了一个实际需求。
更多推荐


所有评论(0)