【雷达灯控】安信可 Rd-03E+ 氛围灯 + 灯随人动

[复制链接]
查看1174 | 回复13 | 2024-3-12 23:09:09 | 显示全部楼层 |阅读模式
本帖最后由 1055173307 于 2024-3-12 23:11 编辑

前情提要
在园长的活动中获得了RD03E雷达模块,再度感谢安信可感谢园长。活动要求要完成一个项目,正好电脑外接屏幕需要一个合适的背光氛围灯让堆屎山代码的时候眼睛稍微舒服一点,所以就画两天时间研究了一下模块然后草草写一段代码完成以下需求。
项目简介
使用前段时间白嫖的立创ESP32S3开发板(我知道这有点大材小用的意思,但是正好顺手了),加上三条淘宝捡的磁吸WS2812灯带以及这次的雷达模块组成。目标是做成一个灯随人动的氛围灯使用,可以随着不同的人体距离切换不同的灯效。
实现过程
1.模块上电检测,看传感器检测效果。手势识别的固件确实是比较适合用在手势识别上,在测距上效果差强人意。所以跟着群里大佬果断刷了精准测距的固件,刷固件过程跟着官方文档一步步走,用挣点元子的无线DAP,直接零踩坑完成固件烧录。事实证明精准测距固件还是好用的。
微信图片_20240312223441.jpg
然后顺手在上一篇帖子的雷达支架上改一下把esp32也装上,原支架和改进后的如图:
微信图片_20240312222856.jpg 微信图片_20240312213832.jpg
2.ESP32S3读取串口数据,过程就是轻松愉快,简单的外设调用
初始化:
Snipaste_2024-03-12_22-36-49.jpg
回调函数处理:
Snipaste_2024-03-12_22-37-05.jpg
数据处理函数,把接收到的数组处理成状态和距离信息,只需要校验帧头帧尾,状态信息直接写入,距离信息两个字节用移位合并一下就得出来了:
Snipaste_2024-03-12_22-37-24.jpg
3.根据雷达信息更新灯效模式
首先说明一下灯效以及切换逻辑
微信图片_20240312224237.jpg
初始化进入照明模式,即固定暖黄光的氛围灯,打亮屏幕后的墙体;
若持续5s人在1m外则切换到渐变模式,渐变是灯带同一颜色在RGB色环循环;
持续5S人在2m外切换流水模式,流水即灯带呈流水灯效果;
持续100S无人就关灯,稍微做一点节能;
连续1.5S有人存在就切换回流水灯;
持续5S有人在2m切换渐变模式;
持续5s内有人在1m内且50%的时间是微动状态就切换回照明模式;
实现函数如下vsc里的格式好像被格式化掉了,将就看:
  1. void RD03E::ModeUpdate()
  2. {
  3.     static Mode_t tar_Mode=mode_max;
  4.     switch (mode)
  5.     {
  6.     case OFF:
  7.         if(State!=NO_TARGET){//连续检测
  8.             sta_cnt++;
  9.             if(sta_cnt==30){//每秒20次
  10.                 last_mode = mode;
  11.                 mode = FLOW;
  12.                 is_ChangeMode = true;
  13.                 sta_cnt = 0;
  14.                 Serial.printf("Mode change FLOW\n");
  15.             }
  16.         }
  17.         else{
  18.             sta_cnt=0;
  19.         }
  20.         break;

  21.     case LIGHT:
  22.         if(distance>100){
  23.             dis_cnt++;
  24.             if(dis_cnt == 100){
  25.                 last_mode = mode;
  26.                 mode = FADE;
  27.                 is_ChangeMode = true;
  28.                 dis_cnt = 0;
  29.                 Serial.printf("Mode change FADE\n");
  30.             }
  31.         }
  32.         else{
  33.             dis_cnt=0;
  34.         }
  35.         break;

  36.     case FADE:
  37.         if(distance<100){
  38.             if(tar_Mode==LIGHT){
  39.                 dis_cnt++;
  40.                 if(State==SLIGHT_MOVEMENT){
  41.                     sta_cnt++;
  42.                 }

  43.                 if(dis_cnt==100){
  44.                     if(sta_cnt>50)
  45.                     {
  46.                         last_mode = mode;
  47.                         mode = LIGHT;
  48.                         is_ChangeMode = true;
  49.                         dis_cnt=0;
  50.                         sta_cnt=0;
  51.                         tar_Mode = mode_max;
  52.                         Serial.printf("Mode change LIGHT\n");
  53.                     }
  54.                     else
  55.                     {
  56.                     Serial.printf("dis:%d,sta:%d,cdis:%d\n",dis_cnt,sta_cnt,distance);
  57.                     dis_cnt=0;
  58.                     sta_cnt=0;
  59.                     }
  60.                 }
  61.             }
  62.             else if(tar_Mode==FLOW){
  63.                 tar_Mode=mode_max;
  64.                 dis_cnt=0;
  65.                 sta_cnt=0;
  66.             }
  67.             else if(tar_Mode==mode_max){
  68.                 tar_Mode=LIGHT;
  69.                 dis_cnt=0;
  70.                 sta_cnt=0;
  71.             }
  72.         }
  73.         else if(distance>200){
  74.             if(tar_Mode==FLOW){
  75.                 dis_cnt++;
  76.                 if(dis_cnt==100){
  77.                     last_mode = mode;
  78.                     mode = FLOW;
  79.                     is_ChangeMode = true;
  80.                     dis_cnt=0;
  81.                     sta_cnt=0;
  82.                     tar_Mode = mode_max;
  83.                     Serial.printf("Mode change FLOW\n");
  84.                 }
  85.             }
  86.             else if(tar_Mode==LIGHT){
  87.                 tar_Mode=mode_max;
  88.                 dis_cnt=0;
  89.                 sta_cnt=0;
  90.             }
  91.             else if(tar_Mode==mode_max){
  92.                 tar_Mode=FLOW;
  93.                 dis_cnt=0;
  94.                 sta_cnt=0;
  95.             }
  96.         }
  97.         else{
  98.             tar_Mode = mode_max;
  99.             dis_cnt=0;
  100.             sta_cnt=0;
  101.         }
  102.         break;

  103.     case FLOW:
  104.         if(distance<200){
  105.             if(tar_Mode==FADE){
  106.                 dis_cnt++;
  107.                 if(dis_cnt==100){
  108.                     last_mode=mode;
  109.                     mode=FADE;
  110.                     is_ChangeMode=true;
  111.                     tar_Mode=mode_max;
  112.                     dis_cnt=0;
  113.                     sta_cnt=0;
  114.                     Serial.printf("Mode change FADE\n");
  115.                 }
  116.             }
  117.             else if(tar_Mode==OFF){
  118.                 tar_Mode=mode_max;
  119.                 dis_cnt=0;
  120.                 sta_cnt=0;
  121.             }
  122.             else if(tar_Mode==mode_max){
  123.                 tar_Mode=FADE;
  124.                 dis_cnt=0;
  125.                 sta_cnt=0;
  126.             }
  127.         }
  128.         else if(State==NO_TARGET){
  129.             if(tar_Mode==OFF){
  130.                 sta_cnt++;
  131.                 if(sta_cnt>2000){
  132.                     last_mode = mode;
  133.                     mode = OFF;
  134.                     is_ChangeMode=true;
  135.                     tar_Mode=mode_max;
  136.                     dis_cnt=0;
  137.                     sta_cnt=0;
  138.                     Serial.printf("Mode change OFF\n");
  139.                 }
  140.             }
  141.             else if(tar_Mode==FADE){
  142.                 tar_Mode=mode_max;
  143.                 dis_cnt=0;
  144.                 sta_cnt=0;
  145.             }else if(tar_Mode==mode_max){
  146.                 tar_Mode=OFF;
  147.                 dis_cnt=0;
  148.                 sta_cnt=0;
  149.             }
  150.         }
  151.         else{
  152.             tar_Mode = mode_max;
  153.             dis_cnt=0;
  154.             sta_cnt=0;
  155.         }
  156.         break;
  157.    
  158.     default:
  159.         break;
  160.     }
  161. }
复制代码
4.灯效实现
在这里贴出来正常亮灯时的代码,此外还有各种灯效模式切换时的灯效实现(照明模式渐亮,渐变模式展开亮灯,流水灯模式快速流水切换等),因为代码又臭又长就不再这里献丑了
渐变模式的代码:
Snipaste_2024-03-12_22-56-57.jpg
流水模式的代码:
Snipaste_2024-03-12_22-57-08.jpg
效果展示
这是照明模式下的效果,对应人在使用电脑的场景
微信图片_20240312213835.jpg
这是流水灯模式的灯光效果,即人在2m外的模式
微信图片_20240312213839.jpg 微信图片_20240312213843.jpg
这是渐变模式下的灯光效果,即人在1-2m范围内的场景
微信图片_20240312213847.jpg
画饼计划
1.利用ESP32的特性,接入MQTT服务器以及HA,这个等毕设差不多了会用树莓派搭一个,到时候更新进度;
2.更换灯带为WS2811+冷暖光LED灯珠的灯板,因为WS2812模拟暖光效果比较一般,色温不理想,顺便画一块板子做集成和LED驱动,后续有空了填坑;
希望大佬们多帮我提提建议,完善这个项目

(最后说明一下:因为B站第一个视频想留个一个筹备中的项目发,而且这个项目本身难度也比较低,所以不计划上传,如果有人感兴趣想看效果我可以录一下发群里;源代码暂时没摸清楚怎么上传,如果有人想试试效果我可以再琢磨一下发上来大家试试,搞个esp32就行了
回复

使用道具 举报

cnfulishe | 2024-3-12 23:21:04 | 显示全部楼层
不错
回复

使用道具 举报

putin | 2024-3-12 23:22:38 来自手机 | 显示全部楼层
可以🌝🌝🤙🤙🤙
回复 支持 反对

使用道具 举报

望风阁 | 2024-3-13 00:03:05 来自手机 | 显示全部楼层
交作业
回复

使用道具 举报

WT_0213 | 2024-3-13 08:37:13 | 显示全部楼层
很不错
回复

使用道具 举报

1084504793 | 2024-3-13 09:07:19 | 显示全部楼层
回复

使用道具 举报

lazy | 2024-3-13 10:18:45 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-3-13 11:00:23 | 显示全部楼层
厉害
选择去发光,而不是被照亮
回复

使用道具 举报

molun | 2024-3-13 14:00:26 | 显示全部楼层
学习了
等风,等雨,也等你!
回复

使用道具 举报

noonezero | 2024-3-14 10:15:23 | 显示全部楼层
赞一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则