清风不语
基于CEM5826-M11毫米波雷达项目实践
概述:
前几天在进行iceasy商城的抽奖活动时得到一张10元包邮优惠券,于是购买了一个CEM5826-M11毫米波雷达模块,拿到之后便迫不及待的上手体验了一下,利用 CEM5826-M11 毫米波雷达模块 与 ESP32C3串口通信 来检测运动物体的速度和信号强度,并通过 OLED 屏幕实时显示这些信息。详细使用看下文。
硬件介绍:
0.96寸OLED屏:用于显示速度和返回信号强度。
ESP32C3:将CEM5826-M11传回信息处理显示在OLED屏上,同时上传至串口监视器。
CEM5826-M11毫米波雷达:检测人体并通过串口将速度和信号强度传于ESP32
关于CEM5826-M11毫米波雷达:
CEM5826-M11 是一款高灵敏度 24GHz 毫米波人体微动存在检测雷达模块。区别于传统 雷达通过检测人体移动的大幅度动作或肢体动作来判断人体存在,本模块主要特点是在传统人 体感应雷达的功能基础上,同时具备检测积累人体微动幅度的运动,来判断人体的存在的功 能。因此相比传统多普勒雷达来说,具备一定范围内的存在检测,准确率更高。不易漏报。 (引用于24GHz毫米波雷达模块CEM5826-M11用户手册第三页)
效果演示:
代码部分:
以下代码是经过AI辅助修改后的版本更便于理解运行方式
#include <Wire.h>
#include <Adafruit_SSD1306.h>
// OLED 屏幕定义
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// 初始化串口通信
Serial.begin(115200);
while (!Serial) {
; // 等待串口初始化完成
}
Serial1.begin(115200, SERIAL_8N1, 1, 0); // RX=GPIO01, TX=GPIO00
// 初始化I2C接口
Wire.begin(4, 5); // SDA=GPIO04, SCL=GPIO05
// 初始化OLED屏幕
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址可能是0x3C或0x3D
for (;;); // 如果初始化失败,进入无限循环
}
display.display();
delay(2000); // 等待启动
display.clearDisplay();
}
void updateDisplay(float speed, int strength) {
// 显示信息
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// 显示速度
display.setCursor(0, 0);
display.print("Speed: ");
if (speed >= 0) {
display.print(speed);
display.print(" km/h");
} else {
display.print("0.00km/h");
}
// 显示运动状态
display.setCursor(0, 20);
if (speed > 0) {
display.print("Motion Detected");
} else {
display.print("No Motion");
}
// 显示强度
display.setCursor(0, 40);
display.print("Strength: ");
if (strength >= 0) {
display.print(strength);
} else {
display.print("N/A");
}
display.display();
}
bool isNumeric(String str) {
for (char c : str) {
if (!isdigit(c) && c != '.' && c != '-') return false;
}
return true;
}
void loop() {
if (Serial1.available()) {
String data = Serial1.readStringUntil('\n'); // 读取一行数据
Serial.print("Received data: ");
Serial.println(data); // 打印接收到的原始数据
float speed = -1;
int strength = -1;
// 解析速度值
int speedIndex = data.indexOf("v=");
if (speedIndex != -1) {
int speedEndIndex = data.indexOf(" ", speedIndex + 2);
if (speedEndIndex == -1) speedEndIndex = data.indexOf("km/h", speedIndex + 2);
if (speedEndIndex != -1) {
String speedStr = data.substring(speedIndex + 2, speedEndIndex);
speedStr.trim(); // 移除前后空白字符
if (isNumeric(speedStr)) {
speed = speedStr.toFloat();
}
}
}
// 解析强度值
int strengthIndex = data.indexOf("str=");
if (strengthIndex != -1) {
int strengthEndIndex = data.indexOf(' ', strengthIndex + 4);
if (strengthEndIndex == -1) strengthEndIndex = data.length();
String strengthStr = data.substring(strengthIndex + 4, strengthEndIndex);
strengthStr.trim(); // 移除前后空白字符
if (isNumeric(strengthStr)) {
strength = strengthStr.toInt();
}
}
// 更新显示
updateDisplay(speed, strength);
}
}
附录:
开发环境:Arduino IDE
所需库:<Wire.h><Adafruit_SSD1306.h>
版块:
萤火工场
2024/11/30 16:49
全部评论