从吃灰到发光:我如何用吃灰的STM32小熊派,做了一个能自动开关的桌面小夜灯

去年双十一冲动消费的小熊派开发板,在抽屉里躺了大半年后终于重见天日。作为一个物联网小白,我决定用它做个实用的小玩意——能根据环境光线自动开关的智能小夜灯。整个过程就像玩电子积木,从硬件组装到云端配置,每一步都充满惊喜和意外。下面就把这个有趣的项目分享给大家,手把手教你如何让吃灰的开发板焕发新生。

1. 硬件准备与连接

翻箱倒柜找出尘封的小熊派开发板套件,核心组件包括:

  • STM32L431RC主控的开发板
  • E53_SC1扩展板(含光敏传感器和高亮LED)
  • Type-C数据线
  • 杜邦线若干

注意:不同批次的扩展板引脚可能略有差异,建议先查看板子背面的版本号。

硬件连接其实比想象中简单得多,只需要三步:

  1. 将E53_SC1扩展板插入小熊派底部的GPIO接口
  2. 用USB线连接开发板和电脑
  3. 把开发板右上角的模式开关拨到"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. 华为云物联网平台配置

为了让小夜灯具备云端控制能力,我选择了华为云物联网平台(免费版足够个人使用)。配置过程主要分四步:

  1. 创建产品:在IoTDA服务中新建一个产品,关键参数如下:

    • 协议类型:LWM2M
    • 数据格式:二进制
    • 厂商名称:自定义
  2. 定义物模型:添加两个服务属性:

    • light_intensity(float类型,表示光照强度)
    • led_switch(bool类型,控制LED开关)
  3. 注册设备:获取设备ID和密钥,这些信息需要烧录到开发板中。

  4. 规则引擎配置:设置自动控制逻辑,当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. 实际使用与优化

项目完成后,我把这个小夜灯放在书桌上,发现几个可以改进的地方:

  1. 灵敏度调节:原始阈值固定,白天拉窗帘时也会触发。于是增加了手动调节功能,通过开发板上的按键动态调整触发阈值。

  2. 灯光渐变:直接开关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));
    }
}
  1. 离线模式:网络不稳定时自动切换本地控制,保证基本功能可用。

经过这些优化,这个小夜灯已经完美融入我的工作环境。最让我惊喜的是,整个项目从开始到完成只用了两个周末,成本几乎为零(开发板是现成的,华为云服务有免费额度),却解决了一个实际需求。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐