本帖最后由 aramy 于 2024-6-24 15:12 编辑
用开发板ESP32C3加安信可24G毫米波雷达模组Rd-03,再加上一个超声波雾化器构成一套卫生间感应香薰系统。
起因:去了酒店,卫生间总是有宜人的香味,感觉很舒服。研究了一下,是有香薰定时喷射到空气中,改善气味环境。于是就想给家里的卫生间整一套。
一:硬件准备:
人体感应模块,这里使用安信可24G毫米波雷达Rd-03,人体存在传感器,使用这个模块的优点是,感应距离可以配置,按说明文档最大感应范围是10米内,满足家里卫生间需求。
雾化模块,淘宝购买的一套超声波雾化模块,可以通过超声波的方式将液体打碎,变成汽体。可以将液态的香薰,通过虹吸方式运输到超声波雾化片上,然后汽化,散播到空气中。
主控芯片,这里我使用开发板ESP32C3,用来获取人体存在传感器信号,并驱动超声波雾化模块工作。
二:软件编程:
1、设置安信可24G毫米波雷达Rd-03模块。模块刚购买回来,接上串口总是提示:“Error:flashataLen is more than FLASH PAGE SIZE!”。经过安信可的工程师协助,将SW烧写口的焊盘焊上线,重新烧写固件,就完美解决了问题。当无人存在时雷达模块通过串口返还:“OFF”,当有人出现在探测范围内时,返回“ON”,并且还有rang信息。
2、选择了vscode+platformio进行编程,使用arduino进行编程。这里Rd-03模块是通过串口协议与主控连接的。主控ESP32C3只有一组串口,已经用来和上位机通讯用了,所以这里使用模拟串口,使用脚4、5,模拟出一组软串口,用来连接Rd-03模块。雾化器驱动部分还是很简单,因为有驱动模块了,所以只需要用一个管脚的额高低电平即可控制雾化器是否工作。 - [env:seeed_xiao_esp32c3]
- platform = espressif32
- board = seeed_xiao_esp32c3
- framework = arduino
- monitor_speed = 115200
- lib_deps =
- plerup/EspSoftwareSerial @ ~8.2.0
复制代码- #include "Arduino.h"
- #include <SoftwareSerial.h>
- SoftwareSerial radio(4, 5); //启动一个软串口,用来连接雷达模块 RX TX
- String strbuf = "";
- bool bodyflag = false; //检测到有人
- bool flag = false;
- uint_fast32_t lasttime = 0, springtime = 0;
- uint8_t spintPin = 3; //驱动雾化器管脚
- void setup()
- {
- // put your setup code here, to run once:
- Serial.begin(115200);
- radio.begin(115200);
- // Serial.println("Ready");
- pinMode(spintPin, OUTPUT);
- digitalWrite(spintPin, HIGH); //高电平 关闭雾化器
- }
复制代码3、在程序循环中,不停地读取Rd-03模块发来的串口信息,每次遇到“\n”就判断读取完一行,通过这一行的字符串,判断是"ON"、“OFF”,来区分是否检测到有人出现。 - //从串口读取数据
- char ch;
- if (radio.available())
- {
- ch = radio.read();
- if (ch == '\n')
- flag = true;
- else
- strbuf = strbuf + String(ch);
- }
- //观察串口数据,判断雷达是否检测到有人
- if (flag)
- { //一行结束
- // Serial.println(strbuf);
- if (strbuf.compareTo("ON") > 0)
- {
- bodyflag = true; //有人出现
- }
- else
- {
- bodyflag = false;
- }
- strbuf = "";
- flag = false;
- }
复制代码4:当有人出现,再去额外判断一下距离上次有人出现的时间间隔。当这个时间间隔超过阈值时,就去驱动雾化器工作。如果小于阈值,就不做任何动作。这样有效防止了,有人在感应区活动,雾化器不停工作的问题。然后雾化器工作时长也有限制,测试发现每次雾化时长1秒,是个不错的选择。 - //检测到有人,结合时间进行判断,距离上次检测时间是否超过60秒,超过则驱动
- if (bodyflag)
- {
- if (millis() - lasttime > 30000)
- {
- Serial.println("Driver is on!");
- digitalWrite(spintPin, LOW); //低电平 开启雾化器
- lasttime = millis();
- springtime = millis(); //雾化器管脚开始计时
- }
- lasttime = millis();
- }
- //雾化器每次开启1秒
- if (millis() - springtime > 1000)
- {
- digitalWrite(spintPin, HIGH); //关闭雾化器
- // Serial.println("Driver is off!");
- }
复制代码三:视频展示: 四:源码: |