138浏览
查看: 138|回复: 0

[ESP8266/ESP32] 网页数据可视化:C4002毫米波雷达监控系统

[复制链接]
本帖最后由 PY学习笔记 于 2026-6-20 09:30 编辑

在上一篇的基础上,将雷达采集到的人体存在、距离、运动状态等各类数据实时上传,在 WEB 页面完成可视化展示,直观呈现雷达的探测结果。
1、原理
C4002 可以持续输出多项监测数据,包含人体存在状态、静止距离、运动距离、运动方向以及运动速度。
主控 ESP32 通过串口读取雷达原始数据,完成解析和处理后,依托 HTTP 协议将数据传输至前端页面。WEB 页面会自动实时刷新,以可视化形式展示全部探测信息,能够直观查看现场人体存在情况、大致位置以及运动相关参数。
2、测试效果
代码分为两部分。
ESP32 通过串口驱动 C4002 雷达,完成参数配置后采集光照、目标状态、距离、速度及 GPIO 引脚数据,打包为 JSON 并以 UDP 协议发送至电脑。
  1. import time
  2. import machine
  3. import network
  4. import socket
  5. import json
  6. # 导入 C4002 库(需与 DFRobot_C4002.py 一起上传到板子)
  7. from DFRobot_C4002 import DFRobot_C4002, PresenceTarget, MotionTarget
  8. # ================== 网络配置 ==================
  9. WIFI_SSID = "SSID"
  10. WIFI_PASSWORD = "PASS"
  11. PC_IP = "192.168.31.156"   # ← 改成你电脑在局域网中的实际 IP
  12. PC_PORT = 5001             # ← 与 PC 端保持一致
  13. # =============================================
  14. # 初始化 UART1,使用 GP0(TX) 和 GP1(RX)
  15. # 默认波特率: 115200
  16. c4002 = DFRobot_C4002(uart_num=1, baud=115200, tx=0, rx=1)
  17. # 初始化 GPIO2 作为雷达输出引脚的输入端
  18. radar_output_pin = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_DOWN)
  19. c4002.set_out_pin_mode(c4002.OUT_PIN_MODE1)
  20. # UDP 套接字(后面初始化)
  21. udp_sock = None
  22. def connect_wifi():
  23.     wlan = network.WLAN(network.STA_IF)
  24.     wlan.active(True)
  25.     if wlan.isconnected():
  26.         print("[WiFi] 已连接:", wlan.ifconfig()[0])
  27.         return wlan
  28.     print("[WiFi] 正在连接...")
  29.     wlan.connect(WIFI_SSID, WIFI_PASSWORD)
  30.     while not wlan.isconnected():
  31.         time.sleep(1)
  32.     print("[WiFi] 连接成功,IP:", wlan.ifconfig()[0])
  33.     return wlan
  34. def setup():
  35.     while c4002.begin() != True:
  36.         print("C4002 初始化失败!")
  37.         time.sleep_ms(500)
  38.     print("C4002 初始化成功!")
  39.     time.sleep_ms(50)
  40.     # 关闭指示灯
  41.     if c4002.set_run_led_state(c4002.LED_OFF):
  42.         print("设置运行指示灯成功!")
  43.     else:
  44.         print("设置运行指示灯失败!")
  45.     if c4002.set_out_led_state(c4002.LED_OFF):
  46.         print("设置输出指示灯成功!")
  47.     else:
  48.         print("设置输出指示灯失败!")
  49.     # 设置分辨率模式(80cm 分辨率,支持 15 个距离门限)
  50.     if c4002.set_resolution_mode(c4002.RESOLUTION_80CM):
  51.         print("设置分辨率模式成功!")
  52.     else:
  53.         print("设置分辨率模式失败!")
  54.     # 设置检测范围 0-1100cm
  55.     if c4002.set_detect_range(0, 1100):
  56.         print("设置检测范围成功!")
  57.     else:
  58.         print("设置检测范围失败!")
  59.     # 设置光照阈值(0 = 无论光照条件如何始终检测)
  60.     if c4002.set_light_thresh(0):
  61.         print("设置光照阈值成功!")
  62.     else:
  63.         print("设置光照阈值失败!")
  64.     # 启用所有距离门限
  65.     gate_state = [
  66.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  67.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  68.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  69.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  70.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  71.     ]
  72.     if c4002.configure_gate(c4002.MOTION_DISTANCE_GATE, gate_state):
  73.         print("启用运动距离门限成功!")
  74.     if c4002.configure_gate(c4002.PRESENCE_DISTANCE_GATE, gate_state):
  75.         print("启用存在距离门限成功!")
  76.     # 设置上报周期(10 * 0.1s = 1s)
  77.     if c4002.set_report_period(10):
  78.         print("设置上报周期成功!")
  79. def get_gpio2_status():
  80.     """读取 GPIO2 的状态并返回中文描述"""
  81.     pin_value = radar_output_pin.value()
  82.     if pin_value == 1:
  83.         return "HIGH (检测到目标)"
  84.     else:
  85.         return "LOW (未检测到目标)"
  86. def get_target_state_text(state):
  87.     if state == c4002.NO_TARGET:
  88.         return "无目标"
  89.     elif state == c4002.PRESENCE:
  90.         return "静态存在"
  91.     elif state == c4002.MOTION:
  92.         return "运动"
  93.     elif state == c4002.MOTION_OR_PRESENCE:
  94.         return "运动或存在"
  95.     elif state == c4002.MOTION_OR_NO_TARGET:
  96.         return "运动或无目标"
  97.     elif state == c4002.PRESENCE_OR_NO_TARGET:
  98.         return "存在或无目标"
  99.     else:
  100.         return "未知"
  101. def get_direction_text(direction):
  102.     if direction == c4002.AWAY:
  103.         return "远离"
  104.     elif direction == c4002.APPROACHING:
  105.         return "靠近"
  106.     elif direction == c4002.NODIRECTION:
  107.         return "无方向"
  108.     else:
  109.         return "未知"
  110. def loop():
  111.     global udp_sock
  112.     ret_result = c4002.get_note_info()
  113.     if ret_result.note_type == c4002.RESULT:
  114.         # -------- 获取全部传感器数值--------
  115.         light = c4002.get_light_intensity()
  116.         target_state = c4002.get_target_state()
  117.         presence_count_down = c4002.get_presence_count_down()
  118.         presence_target = c4002.get_presence_target_info()
  119.         motion_target = c4002.get_motion_target_info()
  120.         gpio2_val = radar_output_pin.value()
  121.         gpio2_text = get_gpio2_status()
  122.         # -------- 串口打印-------
  123.         print("------- 获取全部结果 --------")
  124.         print("光照强度: {:.2f} lux".format(light))
  125.         print("目标状态: {}".format(get_target_state_text(target_state)))
  126.         print("存在倒计时: {} s".format(presence_count_down))
  127.         print("存在距离: {:.2f} m".format(presence_target.distance))
  128.         print("存在能量: {}".format(presence_target.energy))
  129.         print("运动距离: {:.2f} m".format(motion_target.distance))
  130.         print("运动能量: {}".format(motion_target.energy))
  131.         print("运动速度: {:.2f} m/s".format(motion_target.speed))
  132.         print("运动方向: {}".format(get_direction_text(motion_target.direction)))
  133.         print("GPIO2 输出: {}".format(gpio2_text))
  134.         print("--------------------------------")
  135.         # -------- 打包全部数据通过 UDP 发往 PC --------
  136.         payload = {
  137.             "ts": time.ticks_ms(),
  138.             "light": round(light, 2),
  139.             "target_state": target_state,
  140.             "target_state_text": get_target_state_text(target_state),
  141.             "presence_count_down": presence_count_down,
  142.             "presence": {
  143.                 "distance": round(presence_target.distance, 2),
  144.                 "energy": presence_target.energy
  145.             },
  146.             "motion": {
  147.                 "distance": round(motion_target.distance, 2),
  148.                 "energy": motion_target.energy,
  149.                 "speed": round(motion_target.speed, 2),
  150.                 "direction": motion_target.direction,
  151.                 "direction_text": get_direction_text(motion_target.direction)
  152.             },
  153.             "gpio2": gpio2_val,
  154.             "gpio2_text": gpio2_text
  155.         }
  156.         try:
  157.             udp_sock.sendto(json.dumps(payload).encode(), (PC_IP, PC_PORT))
  158.         except Exception as e:
  159.             print("[UDP] 发送失败:", e)
  160. def main():
  161.     global udp_sock
  162.     connect_wifi()
  163.     udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  164.     setup()
  165.     while True:
  166.         loop()
  167.         time.sleep_ms(10)
  168. if __name__ == "__main__":
  169.     main()
复制代码

PC 端开启 UDP 监听接收数据,依托 Flask+SocketIO 搭建网页服务。前端借助图表组件、自定义雷达动画,将各类雷达数据动态可视化展示,实现毫米波雷达数据实时监控。
代码见附件

网页数据可视化:C4002毫米波雷达监控系统图1
网页数据可视化:C4002毫米波雷达监控系统图2
3、小结
整套方案可以稳定实现毫米波雷达数据采集与网页可视化展示,搭建难度低,使用起来简单便捷。
C4002 对人体有无、动静状态的判断表现稳定,但模块输出的静止距离、运动距离、运动方向和运动速度等精细数据存在偏差,数值仅可作为参考,不能当作精准测量数据使用。后续可以通过增加数据滤波等方式,进一步优化数据表现,提升整体使用效果。



PC端WEB页面.zip

6.06 KB, 下载次数: 28

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail