2024-10-10 12:13
75 次阅读|
0 个评论
01 概述 状态指示灯是最常见的一种人机交互方式。常用做法是,通过不同的闪烁频率,来告知用户,目前设备所处的状态,是正常,故障,还是其它状态。 指示灯的额定工作电压有220, 110,48,36,24,12,6,3 V等。受控制电路通过电流大小的限制,同时也为了延长灯泡的使用寿命,常采取在灯泡前加一限流电阻或用两只灯泡串联使用, 以降低工作电压。 嵌入式中的指示灯通常情况下都和主控电压等级一致,部分场景可能会是5V,12V等。 02 实现方法 指示灯可以有常亮,常闭,闪动三种状态。其中常亮和常闭最简单,只需要在合适的时候将灯点亮,或者关闭,就可以实现,程序逻辑不复杂,只需要调用一次GPIO的写函数就可以。但是闪动状态就不同了,闪烁的频率不同,代表的状态不同。如何实现指示灯按照不同的频率闪烁呢? 1 延时函数 指示灯按照不同频率闪烁,最简单的办法就是使用延时函数,不同的延时来实现不同的闪烁频率,例如有如下的代码实现: LED(on);//打开led delay(100);//延时100ms LED(off);//关闭led delay(900);//延时900ms 上述代码实现了1s内,亮100ms,灭900ms。 这种办法,如果在裸机情况下无法使用,因为延时会导致cpu一直卡在延时函数,无法进行正常运行。因此延时函数的办法,只适用于在使用rtos的情况下,可以单独创建一个任务,来实现LED不同频率的闪动。 2 定时器中断 假设我们指示灯的闪烁频率不同,可能是100ms,可能是500ms。那我们可以实现一个100ms的定时器,在定时器中,配合计数,来实现不同频率的闪动。 例如: time_callback() { if(count == 0) { LED(on); } Else if(count < 10) { LED(off); } count++; = 10) { Count = 0; } } 上述代码是一个定时器回调函数,定时器每100ms超时后,会进入time_callback中。第一次进入count的值是0,这时候指示灯被点亮。之后9次进入回调函数,指示灯都会被关闭。当第10次执行回调函数时,count会被清零。重新进入一次循环。如此循环往复。 本组件实现的就是第二种方法。当然实际代码可能比示例要稍微复杂些。但是道理是类似的。 03 组件的使用。 1 Gitee链接地址 Demo位于amaziot_bloom_os_sdk\sample\libraries\8.1_led_status Gitee源码地址:https://gitee.com/ning./hongdou Github源码地址:https://github.com/ayumid/hongdou 编译指令:.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\8.1_led_status 2 组件功能介绍 应于于空开等需要状态指示灯的项目中。可以控制设备在不同状态下,LED以不同的频率进行闪烁。从而向用户指示当前设备工作的状态。 3 代码讲解 1 lib_led_status_level_flip 功能:该函数用于,改变LED 亮 灭 状态。 参数:无 返回值:无 示例: lib_led_status_level_flip(); 2 lib_led_status_init 功能:该函数用于,初始化LED GPIO 和 定时器。 参数:无 返回值:无 示例: lib_led_status_init(); 3 lib_led_status_lighting 功能:该函数用于,LED常亮。 参数:无 返回值:无 示例: lib_led_status_lighting(); 4 lib_led_status_100ms_flashing1 功能:该函数用于,100ms闪烁1次。 参数:无 返回值:无 示例: lib_led_status_100ms_flashing1(); 5 lib_led_status_100ms_flashing2 功能:该函数用于,100ms闪烁两次。 参数:无 返回值:无 示例: lib_led_status_100ms_flashing2(); 6 lib_led_status_100ms_flashing3 功能:该函数用于,100ms闪烁三次。 参数:无 返回值:无 示例: lib_led_status_100ms_flashing3(); 7 lib_led_status_1s_flashing 功能:该函数用于,间隔1s闪烁。 参数:无 返回值:无 示例: lib_led_status_1s_flashing(); 8 lib_led_status_100ms_flashing 功能:该函数用于,间隔100ms闪烁。 参数:无 返回值:无 示例: lib_led_status_100ms_flashing2(); 9 lib_led_status_factory 功能:该函数用于,工厂模式闪烁。 参数:无 返回值:无 示例: lib_led_status_factory(); 10 lib_led_status_timer_cbk 功能:该函数用于,定时器回调函数,根据不同模式调用不同的api。 参数:无 返回值:无 示例: lib_led_status_timer_cbk(NOTLIVE); 4 Demo实战 4.1 创建一个Demo 复制3.2-inter_at示例工程,到同一个文件夹下,修改文件名为8.2_power_alarm,如图: 4.2 修改makefile 增加文件组件所在目录头文件路径,和源文件路径,如图: 4.3 增加头文件 使用代码编辑器,将新建的工程文件加入代码编辑器中,打开main.c,修改main.c,加入am.h等头文件,如图: 4.4 修改代码 在Phase2Inits_exit 创建一个任务,如图: 4.5 宏定义介绍 sample_led_status_uart_printf 输出日志到DEBUG 串口,日志比较少,可以输出到这个串口,如果日志比较多,需要输出到usb口,以免不必要的问题出现 sample_led_status_catstudio_printf 输出日志到USB 串口,使用catstudio查看,catstudio查看日志需要更新对应版本mdb.txt文件,软件打开filtter过滤日志,只查看用户输出的日志 SAMPLE_LED_STATUS_TASK_STACK_SIZE 栈空间宏定义 4.6 全局变量介绍 SAMPLE_LED_STATUS_TASK_STACK_SIZE 任务栈空间,本例使用数组实现,用户在做项目时,可以预先估算下当先任务需要的大致栈空间,OS没有提供可以查看栈空间使用情况的API sample_led_status_task_ref 任务指针 4.7 函数介绍 Phase1Inits_enter 底层初始化,本例空 Phase1Inits_exit 底层初始化,本例空 Phase2Inits_enter 底层初始化,本例空 Phase2Inits_exit 创建主任务,初始化消息队列,定时器,任务等。 代码片段: int ret; ret = OSATaskCreate(&sample_led_status_task_ref, sample_led_status_task_stack, SAMPLE_LED_STATUS_TASK_STACK_SIZE, 120, "sample_gpio_task_gpio", sample_gpio_task_gpio, NULL); ASSERT(ret == OS_SUCCESS); sample_led_status_uart_printf("Phase2Inits_exit\n"); sample_gpio_task_gpio 主任务,间隔10s更改led状态。 代码片段: //每一种形态显示10s lib_led_status = NORMAL; sample_led_status_uart_printf("%s NORMAL", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = NOGPRS; sample_led_status_uart_printf("%s NOGPRS", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = NOSERVER; sample_led_status_uart_printf("%s NOSERVER", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = UNREGISTERED; sample_led_status_uart_printf("%s UNREGISTERED", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = UPGRADE; sample_led_status_uart_printf("%s UPGRADE", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = NOTLIVE; sample_led_status_uart_printf("%s NOTLIVE", __FUNCTION__, __LINE__); sample_led_status_sleep(10); lib_led_status = FACTORY; sample_led_status_uart_printf("%s FACTORY", __FUNCTION__, __LINE__); sample_led_status_sleep(10); 4.8 编译 在SDK根目录打开命令行,输入命令.\build.bat -l .\amaziot_bloom_os_sdk\sample\libraries\8.1_led_status\ 1.270(MB)| |------------------------------------------------------------------------------------| cp_1606L.axf cp_1606L.bin cp_1606L.map gnumake: Leaving directory `F:/3.asr-b/cat.1-asr1606/1.software/BlOOM_OS_1606_OPENCPU_1191_A09_WIHT_NEWRF/amaziot_bloom_os_sdk/sample/libraries/8.1_led_status' "copy NEZHAC_CP_CNR_MIFI_TX.bin to ./ " 已复制 1 个文件。 4.9 生成固件 参考入门中开发工具,生成工具。 4.10 测试 测试步骤: 参考编译教程,和文档开头的编译指令,进行编译 按照编译教程选择对应的选项 烧录 4.11 固件 上电后,debug串口会打印出计算出的数据; 本文章源自奇迹物联开源的物联网应用知识库Cellular IoT Wiki,更多技术干货欢迎关注收藏Wiki: Cellular IoT Wiki 知识库(https://rckrv97mzx.feishu.cn/wiki/wikcnBvAC9WOkEYG5CLqGwm6PHf) 注:本文部分内容来源于网络,如有侵权,请及时联系我们。