芯查查logo
  • 数据服务
    1. 新产品
    2. 物料选型
    3. 查替代
    4. 丝印反查
    5. 查品牌
    6. PCN/PDN
    7. 查方案
    8. 查代理
    9. 数据合作
  • SaaS/方案
      SaaS产品
    1. 供应链波动监控
    2. 半导体产业链地图
    3. BOM管理
    4. 解决方案
    5. 汽车电子
    6. 政府机构
    7. 数据API
  • 商城
  • 行业资讯
    1. 资讯
    2. 直播
  • 论坛社区
    1. 论坛
    2. 学习
    3. 测评中心
    4. 活动中心
    5. 积分商城
  • 查一下
  • 开通会员
清风不语
基于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
  • 举报
😁😂😃😄😅😆😉😊😋😌😍😏😒😓😔😖😘😚😜😝😞😠😡😢😣😤😥😨😩😪😫😭😰😱😲😳😵😷😸😹😺😻😼😽😾😿🙀🙅🙆🙇🙈🙉🙊🙋🙌🙍🙎🙏✂✅✈✉✊✋✌✏✒✔✖✨✳✴❄❇❌❎❓❔❕❗❤➕➖➗➡➰🚀🚃🚄🚅🚇🚉🚌🚏🚑🚒🚓🚕🚗🚙🚚🚢🚤🚥🚧🚨🚩🚪🚫🚬🚭🚲🚶🚹🚺🚻🚼🚽🚾🛀Ⓜ🅰🅱🅾🅿🆎🆑🆒🆓🆔🆕
@好友

全部评论

加载中
游客登录通知
已选择 0 人
自定义圈子
移动
发布帖子
发布动态
发布问答
最新帖子
萤火工场GD32VW553-IOT测评+蓝牙串口透传树莓派pico 2测评 - 初体验【工程师经验】+ 飞线【开源】zvs142857 2.1A,3A快充 充电宝迷你UC3842 开关电源优化全解析:攻克常见难题,提升性能
热门版块
查看更多
电子DIY
维修技术
电子元器件
萤火工场
汽车电子工程师论坛
工业电子专区
新手入门指南
单片机/MCU论坛
PCB设计
开源项目

170

收藏

分享

微信扫码
分享给好友

评论