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

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

[复制链接]
本帖最后由 PY学习笔记 于 2026-6-14 11:29 编辑

在上一篇的基础上,将雷达采集到的人体存在、距离、运动状态等各类数据实时上传,在 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.     """完全复制你提供的测试代码初始化流程,一字未改"""
  36.     while c4002.begin() != True:
  37.         print("C4002 初始化失败!")
  38.         time.sleep_ms(500)
  39.     print("C4002 初始化成功!")
  40.     time.sleep_ms(50)
  41.     # 关闭指示灯
  42.     if c4002.set_run_led_state(c4002.LED_OFF):
  43.         print("设置运行指示灯成功!")
  44.     else:
  45.         print("设置运行指示灯失败!")
  46.     if c4002.set_out_led_state(c4002.LED_OFF):
  47.         print("设置输出指示灯成功!")
  48.     else:
  49.         print("设置输出指示灯失败!")
  50.     # 设置分辨率模式(80cm 分辨率,支持 15 个距离门限)
  51.     if c4002.set_resolution_mode(c4002.RESOLUTION_80CM):
  52.         print("设置分辨率模式成功!")
  53.     else:
  54.         print("设置分辨率模式失败!")
  55.     # 设置检测范围 0-1100cm
  56.     if c4002.set_detect_range(0, 1100):
  57.         print("设置检测范围成功!")
  58.     else:
  59.         print("设置检测范围失败!")
  60.     # 设置光照阈值(0 = 无论光照条件如何始终检测)
  61.     if c4002.set_light_thresh(0):
  62.         print("设置光照阈值成功!")
  63.     else:
  64.         print("设置光照阈值失败!")
  65.     # 启用所有距离门限
  66.     gate_state = [
  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.         c4002.C4002_ENABLE, c4002.C4002_ENABLE, c4002.C4002_ENABLE,
  72.     ]
  73.     if c4002.configure_gate(c4002.MOTION_DISTANCE_GATE, gate_state):
  74.         print("启用运动距离门限成功!")
  75.     if c4002.configure_gate(c4002.PRESENCE_DISTANCE_GATE, gate_state):
  76.         print("启用存在距离门限成功!")
  77.     # 设置上报周期(10 * 0.1s = 1s)
  78.     if c4002.set_report_period(10):
  79.         print("设置上报周期成功!")
  80. def get_gpio2_status():
  81.     """读取 GPIO2 的状态并返回中文描述"""
  82.     pin_value = radar_output_pin.value()
  83.     if pin_value == 1:
  84.         return "HIGH (检测到目标)"
  85.     else:
  86.         return "LOW (未检测到目标)"
  87. def get_target_state_text(state):
  88.     if state == c4002.NO_TARGET:
  89.         return "无目标"
  90.     elif state == c4002.PRESENCE:
  91.         return "静态存在"
  92.     elif state == c4002.MOTION:
  93.         return "运动"
  94.     elif state == c4002.MOTION_OR_PRESENCE:
  95.         return "运动或存在"
  96.     elif state == c4002.MOTION_OR_NO_TARGET:
  97.         return "运动或无目标"
  98.     elif state == c4002.PRESENCE_OR_NO_TARGET:
  99.         return "存在或无目标"
  100.     else:
  101.         return "未知"
  102. def get_direction_text(direction):
  103.     if direction == c4002.AWAY:
  104.         return "远离"
  105.     elif direction == c4002.APPROACHING:
  106.         return "靠近"
  107.     elif direction == c4002.NODIRECTION:
  108.         return "无方向"
  109.     else:
  110.         return "未知"
  111. def loop():
  112.     global udp_sock
  113.     ret_result = c4002.get_note_info()
  114.     if ret_result.note_type == c4002.RESULT:
  115.         # -------- 获取全部传感器数值(与你测试代码完全一致)--------
  116.         light = c4002.get_light_intensity()
  117.         target_state = c4002.get_target_state()
  118.         presence_count_down = c4002.get_presence_count_down()
  119.         presence_target = c4002.get_presence_target_info()
  120.         motion_target = c4002.get_motion_target_info()
  121.         gpio2_val = radar_output_pin.value()
  122.         gpio2_text = get_gpio2_status()
  123.         # -------- 串口打印(方便 Thonny 调试观察)--------
  124.         print("------- 获取全部结果 --------")
  125.         print("光照强度: {:.2f} lux".format(light))
  126.         print("目标状态: {}".format(get_target_state_text(target_state)))
  127.         print("存在倒计时: {} s".format(presence_count_down))
  128.         print("存在距离: {:.2f} m".format(presence_target.distance))
  129.         print("存在能量: {}".format(presence_target.energy))
  130.         print("运动距离: {:.2f} m".format(motion_target.distance))
  131.         print("运动能量: {}".format(motion_target.energy))
  132.         print("运动速度: {:.2f} m/s".format(motion_target.speed))
  133.         print("运动方向: {}".format(get_direction_text(motion_target.direction)))
  134.         print("GPIO2 输出: {}".format(gpio2_text))
  135.         print("--------------------------------")
  136.         # -------- 打包全部数据通过 UDP 发往 PC --------
  137.         payload = {
  138.             "ts": time.ticks_ms(),
  139.             "light": round(light, 2),
  140.             "target_state": target_state,
  141.             "target_state_text": get_target_state_text(target_state),
  142.             "presence_count_down": presence_count_down,
  143.             "presence": {
  144.                 "distance": round(presence_target.distance, 2),
  145.                 "energy": presence_target.energy
  146.             },
  147.             "motion": {
  148.                 "distance": round(motion_target.distance, 2),
  149.                 "energy": motion_target.energy,
  150.                 "speed": round(motion_target.speed, 2),
  151.                 "direction": motion_target.direction,
  152.                 "direction_text": get_direction_text(motion_target.direction)
  153.             },
  154.             "gpio2": gpio2_val,
  155.             "gpio2_text": gpio2_text
  156.         }
  157.         try:
  158.             udp_sock.sendto(json.dumps(payload).encode(), (PC_IP, PC_PORT))
  159.         except Exception as e:
  160.             print("[UDP] 发送失败:", e)
  161. def main():
  162.     global udp_sock
  163.     connect_wifi()
  164.     udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  165.     setup()
  166.     while True:
  167.         loop()
  168.         time.sleep_ms(10)
  169. if __name__ == "__main__":
  170.     main()
复制代码

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

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



PC端WEB页面.zip

6.06 KB, 下载次数: 4

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

本版积分规则

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

硬件清单

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

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

mail