从零打造智能灯控OpenHarmony LiteOS-M实战指南项目背景与硬件准备在物联网技术蓬勃发展的今天智能家居设备正逐渐走入千家万户。而作为开发者能够亲手打造一个属于自己的智能设备无疑是一件充满成就感的事情。本文将带领大家使用BearPi-HM Nano开发板和OpenHarmony LiteOS-M操作系统从零开始构建一个完整的智能灯控系统。所需硬件清单BearPi-HM Nano开发板基于Hi3861芯片USB Type-C数据线用于供电和调试LED灯模块及杜邦线若干可选光敏电阻模块用于环境光检测可选按键模块用于本地控制开发板核心参数特性规格主控芯片Hi3861V100CPU架构32位RISC-V主频160MHz内置Flash2MB内置SRAM352KB无线连接2.4GHz WiFi开发环境OpenHarmony 3.0LTS开发环境搭建1. 工具链安装首先需要配置OpenHarmony的开发环境。推荐使用Ubuntu 20.04 LTS作为开发主机系统# 安装基础工具 sudo apt update sudo apt install -y git python3.8 python3-pip # 安装hb工具 pip3 install --user ohos-build # 将hb添加到PATH echo export PATH~/.local/bin:$PATH ~/.bashrc source ~/.bashrc # 验证安装 hb -v2. 获取源码BearPi-HM Nano有专门的代码仓库包含了板级支持包和示例项目git clone https://gitee.com/bearpi/bearpi-hm_nano.git cd bearpi-hm_nano3. 编译配置进入项目目录后需要进行编译配置# 初始化编译环境 python3 build.py -p bearpi-hm_nano # 选择默认配置 python3 build.py -p bearpi-hm_nano -b debug智能灯控系统设计1. 系统架构设计我们的智能灯控系统将采用多任务架构主要包含以下功能模块┌─────────────────────────────────┐ │ 应用层 │ │ ┌───────────┐ ┌───────────┐ │ │ │ 网络通信 │ │ LED控制 │ │ │ └───────────┘ └───────────┘ │ ├─────────────────────────────────┤ │ 内核层 │ │ ┌───────────┐ ┌───────────┐ │ │ │ 任务调度 │ │ IPC机制 │ │ │ └───────────┘ └───────────┘ │ ├─────────────────────────────────┤ │ 硬件层 │ │ ┌───────────┐ ┌───────────┐ │ │ │ WiFi │ │ GPIO/PWM │ │ │ └───────────┘ └───────────┘ │ └─────────────────────────────────┘2. 创建基础工程在applications/sample目录下新建我们的项目mkdir -p applications/sample/smart_light cd applications/sample/smart_light创建主要源文件main.c程序入口和任务创建wifi_task.c网络通信任务light_task.c灯光控制任务BUILD.gn构建配置文件核心功能实现1. WiFi连接与通信首先实现网络连接功能让开发板能够接入局域网// wifi_task.c #include ohos_init.h #include cmsis_os2.h #include wifi_device.h #define WIFI_SSID YourWiFiSSID #define WIFI_PASSWORD YourPassword static void WiFiEventCallback(NetEvent* event) { switch (event-eventId) { case NET_EVENT_CONNECTED: printf(WiFi connected!\n); break; case NET_EVENT_DISCONNECTED: printf(WiFi disconnected!\n); break; } } void WiFiTask(void *arg) { // 初始化WiFi模块 WifiErrorCode err EnableWifi(); if (err ! WIFI_SUCCESS) { printf(Enable WiFi failed: %d\n, err); return; } // 注册事件回调 err RegisterNetEventCallback(WiFiEventCallback); if (err ! WIFI_SUCCESS) { printf(Register callback failed: %d\n, err); return; } // 配置连接参数 WifiDeviceConfig config { .ssid WIFI_SSID, .preSharedKey WIFI_PASSWORD, .securityType WIFI_SEC_TYPE_PSK }; // 连接WiFi int netId; err AddDeviceConfig(config, netId); if (err ! WIFI_SUCCESS) { printf(Add config failed: %d\n, err); return; } err ConnectTo(netId); if (err ! WIFI_SUCCESS) { printf(Connect failed: %d\n, err); return; } // 任务主循环 while (1) { osDelay(1000); } }2. PWM灯光控制使用PWM实现LED亮度调节功能// light_task.c #include ohos_init.h #include cmsis_os2.h #include hi_pwm.h #define LED_PWM_PORT PWM_PORT_PWM0 #define LED_PWM_FREQ 1000 // 1kHz static uint8_t current_brightness 0; void SetLEDBrightness(uint8_t brightness) { // 限制亮度范围0-100 if (brightness 100) brightness 100; // 计算占空比 uint16_t duty (brightness * LED_PWM_FREQ) / 100; // 设置PWM参数 hi_pwm_init(LED_PWM_PORT); hi_pwm_set_clock(PWM_CLK_160M); hi_pwm_start(LED_PWM_PORT, LED_PWM_FREQ, duty); current_brightness brightness; printf(LED brightness set to %d%%\n, brightness); } void LightControlTask(void *arg) { // 初始化PWM hi_pwm_init(LED_PWM_PORT); // 默认关闭LED SetLEDBrightness(0); // 任务主循环 while (1) { // 这里可以添加亮度调节逻辑 osDelay(100); } }3. 任务间通信使用LiteOS-M的事件机制实现任务间通信// main.c #include ohos_init.h #include cmsis_os2.h #include los_event.h #define LIGHT_EVENT 0x00000001 extern void WiFiTask(void *arg); extern void LightControlTask(void *arg); static osThreadId_t wifiTaskHandle; static osThreadId_t lightTaskHandle; static LOS_Event g_lightEvent; void AppMain(void) { // 初始化事件 LOS_EventInit(g_lightEvent); // 创建WiFi任务 const osThreadAttr_t wifiTask_attributes { .name WiFiTask, .stack_size 2048, .priority osPriorityNormal, }; wifiTaskHandle osThreadNew(WiFiTask, NULL, wifiTask_attributes); // 创建灯光控制任务 const osThreadAttr_t lightTask_attributes { .name LightTask, .stack_size 2048, .priority osPriorityNormal, }; lightTaskHandle osThreadNew(LightControlTask, NULL, lightTask_attributes); printf(Smart Light System Started!\n); } SYS_RUN(AppMain);功能扩展与优化1. 添加HTTP服务器实现一个简单的HTTP服务器接收控制指令// http_server.c #include lwip/netif.h #include lwip/tcp.h #include string.h #define HTTP_PORT 80 static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { if (p NULL) { tcp_close(pcb); return ERR_OK; } // 解析HTTP请求 if (strstr((char*)p-payload, GET /light/on) ! NULL) { LOS_EventWrite(g_lightEvent, LIGHT_EVENT | 0x01); // 开灯事件 } else if (strstr((char*)p-payload, GET /light/off) ! NULL) { LOS_EventWrite(g_lightEvent, LIGHT_EVENT | 0x02); // 关灯事件 } // 发送HTTP响应 char *response HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n htmlbodyh1Smart Light Control/h1/body/html; tcp_write(pcb, response, strlen(response), TCP_WRITE_FLAG_COPY); tcp_close(pcb); pbuf_free(p); return ERR_OK; } static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err) { tcp_recv(pcb, http_recv); return ERR_OK; } void StartHTTPServer(void) { struct tcp_pcb *pcb tcp_new(); tcp_bind(pcb, IP_ADDR_ANY, HTTP_PORT); pcb tcp_listen(pcb); tcp_accept(pcb, http_accept); }2. 灯光控制任务增强扩展灯光控制任务支持更多功能// light_task.c 更新 void LightControlTask(void *arg) { uint32_t ret; uint32_t event; // 初始化PWM hi_pwm_init(LED_PWM_PORT); SetLEDBrightness(0); while (1) { // 等待事件 ret LOS_EventRead(g_lightEvent, LIGHT_EVENT, LOS_WAITMODE_OR, event, LOS_WAIT_FOREVER); if (ret ! LOS_OK) continue; // 处理事件 if (event 0x01) { // 开灯 SetLEDBrightness(80); // 默认80%亮度 } else if (event 0x02) { // 关灯 SetLEDBrightness(0); } else if (event 0x04) { // 亮度增加 SetLEDBrightness(current_brightness 10); } else if (event 0x08) { // 亮度减少 SetLEDBrightness(current_brightness - 10); } // 清除已处理的事件 LOS_EventClear(g_lightEvent, event); } }3. 添加本地按键控制对于没有网络连接的情况可以添加物理按键控制// button.c #include hi_gpio.h #include los_event.h #define BUTTON_PIN 5 // GPIO5 #define DEBOUNCE_DELAY 50 // 50ms防抖延时 void ButtonTask(void *arg) { // 初始化GPIO hi_gpio_init(); hi_gpio_set_dir(BUTTON_PIN, HI_GPIO_DIR_IN); hi_gpio_set_pull(BUTTON_PIN, HI_GPIO_PULL_UP); uint8_t lastState 1; // 默认上拉高电平 uint32_t lastPressTime 0; while (1) { uint8_t currentState hi_gpio_get_val(BUTTON_PIN); // 检测下降沿按键按下 if (lastState 1 currentState 0) { uint32_t now LOS_TickCountGet(); // 防抖处理 if (now - lastPressTime DEBOUNCE_DELAY) { // 发送切换灯光状态事件 if (current_brightness 0) { LOS_EventWrite(g_lightEvent, LIGHT_EVENT | 0x02); // 关灯 } else { LOS_EventWrite(g_lightEvent, LIGHT_EVENT | 0x01); // 开灯 } lastPressTime now; } } lastState currentState; osDelay(10); } }系统集成与调试1. 构建配置在项目目录下创建BUILD.gn文件import(//build/lite/config/component/lite_component.gni) lite_component(smart_light) { features [ :light_app, ] } executable(light_app) { sources [ main.c, wifi_task.c, light_task.c, http_server.c, button.c, ] include_dirs [ //kernel/liteos_m/kernel/include, //device/hisilicon/hispark_pegasus/sdk_liteos/include, //foundation/communication/interfaces/kits/wifi_lite, ] deps [ //foundation/communication/wifi_lite:wifiservice, //kernel/liteos_m:los_kernel, ] defines [ LOS_COMPILE_LITE, LOSCFG_SHELL, ] }2. 编译与烧录完成代码编写后进行编译和烧录# 在项目根目录执行编译 python3 build.py -p bearpi-hm_nano # 烧录固件 python3 build.py -p bearpi-hm_nano -b debug -f3. 系统调试使用串口工具查看系统输出# 查看可用串口 ls /dev/ttyUSB* # 使用minicom连接 minicom -D /dev/ttyUSB0 -b 115200预期输出示例[INFO] WiFi connected! [INFO] HTTP server started on port 80 [INFO] LED brightness set to 0%进阶功能探索1. 添加定时功能利用LiteOS-M的软件定时器实现定时开关灯#include los_swtmr.h #define TIMER_ID_LIGHT_OFF 1 static void LightOffTimerCallback(uint32_t arg) { LOS_EventWrite(g_lightEvent, LIGHT_EVENT | 0x02); // 关灯事件 } void SetLightTimer(uint32_t seconds) { UINT32 timerId; LOS_SwtmrCreate(seconds * 1000, LOS_SWTMR_MODE_ONCE, LightOffTimerCallback, timerId, 0); LOS_SwtmrStart(timerId); }2. 实现OTA升级为系统添加无线升级功能// ota.c #include ohos_init.h #include cmsis_os2.h #include hi_ota.h #define OTA_SERVER http://your-ota-server.com/firmware.bin void OTATask(void *arg) { while (1) { osDelay(24 * 60 * 60 * 1000); // 每天检查一次更新 printf(Checking for OTA updates...\n); OtaConfig config { .url OTA_SERVER, .verifyMode OTA_VERIFY_MODE_SHA256, }; int ret HiOTAStart(config); if (ret 0) { printf(OTA update started successfully\n); } else { printf(OTA update failed: %d\n, ret); } } }3. 添加环境光传感器实现自动亮度调节功能// sensor.c #include hi_adc.h #define LIGHT_SENSOR_CHANNEL 1 uint16_t ReadLightSensor(void) { hi_adc_init(); uint16_t value; hi_adc_read(LIGHT_SENSOR_CHANNEL, value, HI_ADC_EQU_MODEL_4, HI_ADC_CUR_BAIS_DEFAULT, 0); return value; } void AutoBrightnessTask(void *arg) { while (1) { uint16_t sensorValue ReadLightSensor(); uint8_t brightness (sensorValue * 100) / 4095; // 12位ADC // 映射到合适的亮度范围 brightness 20 (brightness * 60 / 100); SetLEDBrightness(brightness); osDelay(5000); // 每5秒调整一次 } }