​ ​ ​ ​ 上一节 《自制智能镜之——屏幕显示时间日期篇》给大家介绍了一下屏幕显示日期时间的实现方式,现在来说一说智能镜重要的化妆灯功能和人体感应功能。
​ ​ ​ ​
​ ​ ​ ​

PWM驱动灯板

​ ​ ​ ​ demo使用了一冷一暖两种LED灯,通过输出两路 PWM 驱动,实现灯光亮度可调和冷暖色的切换。例程中有关pwm的初始化和启动、占空比设置等相关代码都实现在 tuya_mirror_pwm.c 文件中。

OPERATE_RET mirror_pwm_init(VOID);OPERATE_RET mirror_pwm_set(UCHAR_T color, USHORT_T duty);OPERATE_RET mirror_pwm_off(VOID);

mirror_pwm_set() 可以改变控制连接冷暖两路的PWM的开启和停止以及各自的占空比,直接输入灯色传参和占空比即可实现灯板的冷暖光切换和亮度调整:

OPERATE_RET mirror_pwm_set(UCHAR_T color, USHORT_T duty)
{FLOAT_T percent = 0.0;if(user_pwm_init_flag != TRUE){PR_ERR("user pwm not init!");return OPRT_INVALID_PARM;}percent = (FLOAT_T)(duty/1000.0);bk_pwm_stop(pChannelList[0]);bk_pwm_stop(pChannelList[1]);switch (color){case 0:PR_NOTICE("set light cold");bk_pwm_update_param(pChannelList[0], pwm_period, (UINT32)(percent * pwm_period), 0, 0);bk_pwm_start(pChannelList[0]);break;case 1:PR_NOTICE("set light medium");bk_pwm_update_param(pChannelList[0], pwm_period, (UINT32)((percent * pwm_period)/2), 0, 0);bk_pwm_update_param(pChannelList[1], pwm_period, (UINT32)((percent * pwm_period)/2), 0, 0);bk_pwm_start(pChannelList[0]);bk_pwm_start(pChannelList[1]);break;case 2:PR_NOTICE("set light warm");bk_pwm_update_param(pChannelList[1], pwm_period, (UINT32)(percent * pwm_period), 0, 0);//bk_pwm_update_param(pChannelList[0], pwm_period, 0, 0, 0);bk_pwm_start(pChannelList[1]);break;default:break;}return OPRT_OK;
}

封装好这几个接口后,接下来就需要在应用代码中合适的地方调用来控制灯板。

人体感应

​ ​ ​ ​ 本demo还有一个人体感应开关灯光和屏幕的功能,是通过一个PIR传感器来简单实现的。该传感器会在检测到人体运动的时候输出高电平,简单易用。

​ ​ ​ ​ 直接写一个读取连接传感器IO的电平的函数,然后把它放到线程里周期运行,并在读到高电平的时候保存PIR状态在设备数据结构体当中:

STATIC VOID mirror_pir_detect(VOID)
{    if(tuya_gpio_read(PIR_IN_PORT)) {PR_NOTICE("-----------SOMEONE HERE-------------");mirror_ctrl_data.PIR_state = trigger;}
}VOID mirror_data_get_handle(VOID)
{   ......// Detect pir IO portmirror_pir_detect();
}
STATIC VOID sensor_data_get_thread(PVOID_T pArg)
{   while(1) {mirror_data_get_handle();tuya_hal_system_sleep(TASKDELAY_SEC);}
}

​ ​ ​ 然后另一个线程对设备数据结构体中PIR的状态进行判定,当设备打开人体感应功能,且设备总开关处于打开的情况下,PIR检测到有人的时候将会打开灯光开关,同时启动定时器。当定时器触发进入中断时将会关闭灯光开关。

VOID pir_data_handle(VOID)
{MIRROR_CTRL_DATA_T *p;p = &mirror_ctrl_data;if(p->PIR_state == trigger) {p->PIR_state = none;if((p->PIR_switch != TRUE)||(p->Mirror_switch != TRUE)) {return;}if(IsThisSysTimerRun(off_timer) == TRUE) {sys_stop_timer(off_timer);sys_start_timer(off_timer, 1000*600, TIMER_ONCE);}else {sys_start_timer(off_timer, 1000*600, TIMER_ONCE);}p->Light_switch = TRUE;}
}

这样就实现了人来即亮,延时熄灭的效果。

其他功能

​ ​ ​ 经过上面的步骤,我们的智能镜demo就只剩下电池电量检测及显示功能没实现了,这个功能通过ADC采样得到电池电压,再根据电压值预估电池剩余电量,同时把之前屏幕素材收集阶段准备的几张电池图案显示在屏幕上。这个实现起来非常简单,这里就不加赘述了。
​ ​ ​ 把所有功能的运行逻辑加以整合和修改,同时引入涂鸦云dp功能点下发控制逻辑,一个可用手机APP控制的智能镜嵌入式demo代码就完成了。

编译和烧录

​ ​ ​ 在linux终端输入指令运行SDK环境目录下的build_app.sh脚本来编译代码生成固件,指令格式为 sh build_app.sh APP_PATH APP_NAME APP_VERSION

若出现下图所示提示,则表示编译成功,固件已经生成:
固件生成路径为:apps->APP_PATH->output

将固件烧录至模组即可开始功能调试阶段,有关烧录和授权方式可以参照文档: WB系列模组烧录授权

智能镜——7.化妆灯和人体感应篇相关推荐

  1. 红外感应灯和人体感应灯两者之间区别在哪?

    感应灯在生活中的应用很普遍,感应灯有很多种,其中较为常见的是红外感应灯和人体感应灯,那么这两者之间有什么区别呢? 1.性质区别: 人体感应灯是基于红外线技术的一种自动控制产品,当有人进入感应范围的时候 ...

  2. 25、基于51单片机声控光控灯红外人体感应控制声光控开关亮灭设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Proteus仿真 七.程序源码 八.资料包括 摘要 随着社会的不断进步 ...

  3. 60、基于51单片机1602显示智能台灯坐姿定时+光线+红外+人体感应系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Protues仿真 七.程序 八.资料包括 摘要 社会在不断进步,人类在 ...

  4. 【电路】自用人体感应灯(HC-SR501人体感应模块)

    文章目录 低成本人体感应灯 需求分析 器件清单 参数测量 HC-SR501人体感应模块 LED灯板 方案设计 思路简介 原理图 PCB设计 成品 低成本人体感应灯 需求分析 老旧小区地下室没有灯,找钥 ...

  5. 智能镜——5.应用入口及触摸按键实现篇

    ​ ​ ​ ​ 在上一篇文章<自制智能镜之--嵌入式开发环境搭建篇>中介绍了如何在涂鸦平台上创建智能镜和嵌入式开发环境的搭建流程.在搭建完一个实现了配网绑定和 dp 功能点上报下发的基本代 ...

  6. 智能镜——4.产品创建及开发环境搭建篇

    前言 如何给一面普通的镜子赋予更多的功能?本期系列文章将会教给大家怎样通过涂鸦平台及涂鸦wifi模组快速实现一款智能镜产品. 创建产品 首先登录涂鸦智能IoT平台,点击 "创建产品" ...

  7. Arduino制作一个人体感应灯

    现在的很多家庭中都装有感应灯,人体感应灯比声控感应灯的优点是不会影响别人休息,安静. 接下来就是简单的制作过程. 1.需要的设备: 1.arduino Uno主控板一个: 2.人体红外传感器一个: 3 ...

  8. 智能镜——6.屏幕显示时间日期篇

    ​ ​ ​ ​ 上一节 <自制智能镜之--应用层入口及触摸按键实现篇>介绍了有关应用层代码的结构及应用入口和触摸按键的实现等相关内容,这节来说说智能镜的屏幕显示和时间日期的获取. ​ ​ ...

  9. 基于51单片机多功能智能台灯设计 视力灯 坐姿矫正套件 台灯 人体感应 包括实物+电路原理图+程序+proteus仿真

    基于51单片机多功能智能台灯设计 视力灯 坐姿矫正套件 台灯 人体感应 包括实物+电路原理图+程序+proteus仿真 ID:69100646120443268太白路自信的桔梗

最新文章

  1. 上周热点回顾(9.7-9.13)
  2. python cv release_Python cv.GetSize方法代码示例
  3. 机器学习实战笔记(Python实现)-01-机器学习实战
  4. 2011年 11月底-12月初 51Aspx源码发布详情
  5. 英语中十二个月名称的由来
  6. 完整案例:实现延迟队列的两种方法
  7. html中input、label、form、textarea、select
  8. 在线邮箱订阅反馈html5模板
  9. 【多题合集】AC自动机练习,被HDU支配的恐惧
  10. python控制ppt定时_python中使用requests实现自动回帖.ppt
  11. windows下gvim的配置完美支持中文和UTF-8
  12. python单词倒排_【原创】python倒排索引之查找包含某主题或单词的文件
  13. python投注_python练习 | 下注猜大小 | 入门级
  14. matlab太阳影子定位,基于MATLAB软件的太阳影子定位
  15. dosbox运行C语言,DOSBox-DOS模拟器-DOSBox下载 v0.74官方版-完美下载
  16. 【web前端开发】vs code插件推荐
  17. MOS管过大电流时关断为什么会出现尖峰电压
  18. Web安全工具—WireShark使用(持续更新)
  19. Mysql 的自增主键达到最大值,怎么办
  20. Java--Integer的常量缓存池(默认-128~127数值范围)

热门文章

  1. 【JS】字符串查询替换算法
  2. 机器学习中精准率/召回率/PR曲线/AUC-ROC曲线等概念
  3. 09 编译2022年最新的Linux kernel、U-Boot和BusyBox rootfs源码,并用QEMU模拟器运行
  4. 常用办公软件(Word、Excel、PowerPoint、Markdown、Xmind)技巧,能让你从根本上抓住改文档的“需求”!
  5. 基于智能合约的高校志愿服务管理系统
  6. c语言无纸化软件系统资源不足,系统资源不足无法完成请求的服务怎么办_系统资源不足卸载迈克菲解决教程 - 系统家园...
  7. 魔百和M101-无线模块XR819-强刷固件包及教程
  8. Python小游戏,弹力球
  9. 我所知道坦克大战(单机版)之 建造目录
  10. 服务器主板u3芯片配i3CP0,小块头大智慧 华硕U36配i3/i5精睿来袭