这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【ESP32-S31_Function_coreboard-1开发板】热成像仪

共1条 1/1 1 跳转至

【ESP32-S31_Function_coreboard-1开发板】热成像仪

高工
2026-09-14 11:40:22     打赏

【ESP32-S31 Function coreboard-1开发板】热成像仪


本文介绍了 ESP32-S31 Function coreboard-1 开发板结合 MLX90640 传感器模块和 WiFi 功能,实现网页动态显示热成像画面的项目设计,包括模块设计、环境搭建、工程代码、流程图、效果演示等。


项目介绍

  • 传感器模块:PCB 设计、原理图、打板测试;

  • 准备工作:环境搭建、硬件连接;

  • 工程测试:流程图、关键代码、Web UI 设计、效果演示。

cover_mlx90640.jpeg

MLX90640

MLX90640 是一款高分辨率 红外热成像传感器,可与 ESP32-S31 配合使用,实现实时温度可视化。

通过 MicroPython 脚本读取数据并显示热图,调整刷新率和插值优化图像。


模块设计

为了便于 MLX90640 传感器设备连接,设计 PCB 模块。

mlx90640_3D.jpg

原理图

mlx90640_sch.jpg

实物图

mlx90640_module.jpg

详见:MLX90640热成像传感器 - 立创开源硬件平台 .

硬件连接

MLX90640 传感器模块采用 IIC 通信,因此需要将其连接至 ESP32-S31 的 IIC 接口。

I2C 是一种串行同步半双工通信协议,总线上可以同时挂载多个主机和从机。I2C 使用两条双向开漏线:串行数据线 (SDA) 和串行时钟线 (SCL),通过电阻上拉。

  • ESP32-S31 有 2 个 I2C 控制器(也被称为端口),负责处理 I2C 总线上的通信。

HP I2C 管脚分配

  • HP I2C 的所有信号线均支持通过 GPIO 交换矩阵特性重映射到任意空闲的 GPIO。

LP I2C 管脚分配

  • LP I2C 的所有信号线均支持通过 LP GPIO 交换矩阵特性重映射到任意空闲的 LP GPIO 。

详见:I2C 管脚分配说明 | 乐鑫科技 .

连接方式


MLX90640ESP32-S31Note
SDASDA (Pin2)Serial Data
SCLSCL (Pin3)Serial Clock
GNDGNDGround
VIN3V3Power


实物图

connect_mlx90640_web.jpg


流程图


flowchart_mlx90640_web.jpg


工程代码

Thonny IDE 新建 mlx90640_web.py 文件,添加如下代码

 from machine import I2C
 import network
 import socket
 import time
 from mlx90640 import MLX90640, RefreshRate
 
 # ========== WiFi配置 ==========
 WIFI_SSID = "xxx"
 WIFI_PASS = "xxx"
 
 temperature_frame = [0.0] * 768
 last_frame_ts = 0
 FRAME_INTERVAL = 1/4   # 4Hz
 
 # --------- 网页设计 -----------
 
 def connect_wifi():
     wlan = network.WLAN(network.STA_IF)
     wlan.active(True)
     if not wlan.isconnected():
         print("连接 WiFi:", WIFI_SSID)
         wlan.connect(WIFI_SSID, WIFI_PASS)
         while not wlan.isconnected():
             time.sleep(0.3)
             print(".",end="")
     ip = wlan.ifconfig()[0]
     print("\nWiFi已连接, ESP32S3 IP地址:", ip)
     return wlan
 
 # Web服务初始化
 def init_web():
     addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
     s = socket.socket()
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     s.bind(addr)
     s.listen(1)
     print("Web 服务启动,浏览器打开 IP 访问热成像页面")
     return s
 
 # ---------------- 传感器初始化 ----------------
 time.sleep(3)
 print("FreakStudio:Testing the MLX90640 fractional infrared temperature sensor")
 i2c = I2C(0, scl=3, sda=2, freq=100000)
 devices_list = i2c.scan()
 print('START I2C SCANNER')
 if len(devices_list) == 0:
     print("No i2c device !")
 else:
     print('i2c devices found:', len(devices_list))
 mlxaddr = next((d for d in devices_list if 0x31 <= d <= 0x35), None)
 
 try:
     thermal_camera = MLX90640(i2c, mlxaddr)
     print("MLX90640 sensor initialized successfully")
 except ValueError as init_error:
     print(f"Sensor initialization failed: {init_error}")
     raise SystemExit(1)
 
 print(f"Device serial number: {thermal_camera.serial_number}")
 # 设置4Hz刷新率
 try:
     thermal_camera.refresh_rate = RefreshRate.REFRESH_4_HZ
     print(f"Refresh rate set to {thermal_camera.refresh_rate} Hz")
 except ValueError as rate_error:
     print(f"Failed to set refresh rate: {rate_error}")
     raise SystemExit(1)
 thermal_camera.emissivity = 0.92
 
 wlan = connect_wifi()
 sock = init_web()
 
 # 主循环:轮询采集 + 处理web请求,单线程
 while True:
     now = time.ticks_ms()
     # 定时采集,4Hz
     if time.ticks_diff(now, last_frame_ts) >= FRAME_INTERVAL*1000:
         try:
             thermal_camera.get_frame(temperature_frame)
         except (RuntimeError, ValueError) as e:
             # 捕获math domain error,丢帧重试,避免崩溃
             print(f"Frame read error, skip frame: {e}")
             continue
         last_frame_ts = now
         min_temp = min(temperature_frame)
         max_temp = max(temperature_frame)
         avg_temp = sum(temperature_frame) / len(temperature_frame)
 
     # 非阻塞accept,超时很短
     sock.settimeout(0.01)
     try:
         conn, addr = sock.accept()
         request = conn.recv(1024).decode()
         if "/data" in request:
             send_data = ",".join([f"{v:.2f}" for v in temperature_frame])
             send_data += f",{min_temp:.2f},{max_temp:.2f},{avg_temp:.2f}"
             response = "HTTP/1.1 200 OK\r\nContent-Type:text/plain\r\n\r\n" + send_data
             conn.send(response)
         else:
             response = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n" + HTML
             conn.send(response)
         conn.close()
     except OSError:
         # accept超时,继续循环读取传感器
         pass

保存代码。

效果演示

  • Thonny 运行程序,或将程序另存为 main.py 至开发板根目录,复位运行;

  • 终端输出 WiFi 连接状态、IP 地址等信息;

  • 同一局域网下,打开浏览器,输入 IP 地址 192.168.31.103 ,进入 ESP32-S31 开发板网页服务器,显示热成像传感器实时画面,帧率 4Hz;

  • 调整硬件传感器角度,使之对准目标热源;

mlx_web_show.jpg

  • 将手掌置于传感器前适当距离,可看到热成像效果;

mlx_web_hand.gif

  • 调整传感器和热源的距离

mlx_web_body.gif

  • 显示更多热成像画面

mlx_web_move.gif

总结

本文介绍了 ESP32-S31 Function coreboard-1 开发板结合 MLX90640 传感器模块和 WiFi 功能,实现网页动态显示热成像画面的项目设计,包括模块设计、环境搭建、工程代码、流程图、效果演示等,为相关产品的快速开发和应用设计提供了参考。






关键词: ESP32     热成像     传感器     PCB     Python         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]