【ESP32-S31 Function coreboard-1开发板】热成像仪
本文介绍了 ESP32-S31 Function coreboard-1 开发板结合 MLX90640 传感器模块和 WiFi 功能,实现网页动态显示热成像画面的项目设计,包括模块设计、环境搭建、工程代码、流程图、效果演示等。
项目介绍
传感器模块:PCB 设计、原理图、打板测试;
准备工作:环境搭建、硬件连接;
工程测试:流程图、关键代码、Web UI 设计、效果演示。

MLX90640
MLX90640 是一款高分辨率 红外热成像传感器,可与 ESP32-S31 配合使用,实现实时温度可视化。
通过 MicroPython 脚本读取数据并显示热图,调整刷新率和插值优化图像。
模块设计
为了便于 MLX90640 传感器设备连接,设计 PCB 模块。


原理图


实物图


详见: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 管脚分配说明 | 乐鑫科技 .
连接方式
| MLX90640 | ESP32-S31 | Note |
| SDA | SDA (Pin2) | Serial Data |
| SCL | SCL (Pin3) | Serial Clock |
| GND | GND | Ground |
| VIN | 3V3 | Power |
实物图


流程图

工程代码
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;
调整硬件传感器角度,使之对准目标热源;


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


调整传感器和热源的距离


显示更多热成像画面


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