【转】ESP32 性能对比测试(基于MicroPython)

本文对多种MicroPython设备进行了详尽的性能测试,包括micro:bit、ESP8266、ESP32等热门开发板。测试涵盖了整数和浮点运算、Pi值计算等,揭示了不同设备的计算效率。

参与测试的开发板/芯片:

  • micro:bit
  • PYB Nano
  • PYBV10
  • ST Nucleo_F091RC
  • ST Nucleo_F411RE
  • STM32L476DISC
  • STM32F7DISC
  • ST Nucleo_H743ZI
  • ESP8266
  • ESP32 WROVER

MicroPython 版本

microbit

  • 1.9.2

ESP32 Lobo

  • 3.20.20

All other device

  • 1.9.4-479

测试项

  • Integer addition 1000,000 times
  • Float addition 1000,000 times
  • Integer multiplication 1000,000 times
  • Float multiplication 1000,000 times
  • Integer division 1000,000 times
  • Float division 1000,000 times
  • 1000 digit Pi calculation
  • 5000 digit Pi calculation
  • 100,000 digit Pi calculation

测试结果

MCUFreqInt AddFloat AddInt MulFloat MulInt divFloat DivPi:1000Pi:5000Pi:100000
microbitnRF5182216M61.8978.0371.5981.6067.95106.8710.98--
Nucleo_F411STM32F41196M5.8613.966.0714.026.0714.071.2519.03-
PYBV10STM32F405168M3.447.933.567.973.568.130.6710.8-
Nucleo_L432KCSTM32LM3232M20.8646.3521.4946.5521.9546.712.6049.44-
STM32L476DISCSTM32L47680M8.5918.348.9918.428.9318.491.3721.45-
STM32F7DISCSTM32F746192M1.935.162.455.082.125.390.215.424276.47
Nucleo_H743STM32H743400M0.861.960.941.980.912.070.114.661004.32
ESP8266ESP826680M15.5518.3417.9618.9216.9621.462.0940.22-
ESP32ESP32240M2.614.422.794.422.724.660.578.41-
ESP32 psRAMESP32240M3.377.963.5517.8815.258.320.6718.0112394.50
K210K210C8.198.768.238.747.758.760.122.821480.96
  • 结果单位为 秒
  • 秒数越低,计算速率越高,该项性能越强

原文地址

  1. github:shaoziyang/micropython_benchmarks
  2. MicroPython 性能测试数据

By The Way

据说 MicroPython 库的计算效率不如 Arduino,可以参见的 myastrotong 知乎的测试

相关问题

  1. ESP32 性能对比测试
  2. ESP32 与 STM32 性能对比测试
  3. ESP32 和 STM32 哪个强?
<think> 我们有两个ESP32设备,其中一个是ESP32-CAM(带摄像头),另一个是普通的ESP32。我们希望通过WiFi在它们之间建立通信,以便ESP32-CAM可以将图像数据传输给另一个ESP32。 方案设计: 1. 将ESP32-CAM设置为WiFi接入点(AP),另一个ESP32作为站点(STA)连接到它。或者,也可以将两者连接到同一个现有的WiFi网络(如果环境中存在)。 2. 在ESP32-CAM上运行一个HTTP服务器,另一个ESP32通过HTTP请求获取图像数据。或者,也可以使用套接字(socket)进行实时数据传输。 考虑到ESP32-CAM的资源有限,我们采用简单的HTTP服务器方式。ESP32-CAM作为服务器,当另一个ESP32(客户端)请求图像时,它捕获一帧并发送。 步骤: 1. 配置ESP32-CAM的WiFi为AP模式(或STA模式连接现有WiFi)。 2. 在ESP32-CAM上启动一个HTTP服务器,监听客户端的请求。 3. 当收到GET请求时,捕获一帧图像并返回JPEG数据。 4. 另一个ESP32(客户端)定期发送HTTP请求获取图像。 注意:由于ESP32-CAM内存限制,图像分辨率不宜过高(例如使用QVGA:320x240)。 代码实现(MicroPython): 首先,确保ESP32-CAM的固件支持摄像头和WiFi。我们使用MicroPython的`camera`模块和`network`模块。 步骤1:ESP32-CAM(服务器端)代码 我们将ESP32-CAM设置为AP模式,并启动HTTP服务器。 步骤2:普通ESP32(客户端)代码 作为客户端,连接到ESP32-CAM的AP,并发送HTTP请求获取图像,然后可以保存或显示(如果客户端有显示能力)。 但是,请注意,客户端可能没有显示能力,我们这里只实现接收图像并保存到文件系统(如果客户端有SD卡)或者进行其他处理。 由于问题中要求的是两者之间的通信,我们重点放在服务器端提供图像和客户端获取图像。 下面是服务器端(ESP32-CAM)的代码示例: ```python import camera import network import socket import time # 初始化摄像头 camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM) # 如果禁用PSRAM则去掉fb_location参数 # 设置AP模式 ap = network.WLAN(network.AP_IF) ap.active(True) ap.config(essid='ESP32-CAM', password='12345678') # 设置AP的名称和密码 # 等待AP激活 while not ap.active(): pass print('AP mode active. Network config:', ap.ifconfig()) # 创建TCP套接字服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 80)) # 绑定到80端口 s.listen(5) def capture_image(): # 捕获图像(调整分辨率以节省内存) # 可用的分辨率: camera.QQVGA, camera.QVGA, camera.VGA等 buf = camera.capture() # 默认使用初始化时的设置,这里可以调整 return buf while True: conn, addr = s.accept() print('Got a connection from %s' % str(addr)) request = conn.recv(1024) print('Request: %s' % str(request)) # 如果是GET请求,则发送图像 if request.find(b'GET /') != -1: image = capture_image() conn.send(b'HTTP/1.1 200 OK\r\n') conn.send(b'Content-Type: image/jpeg\r\n') conn.send(b'Content-Length: ' + str(len(image)) + b'\r\n') conn.send(b'\r\n') conn.send(image) conn.close() ``` 客户端(普通ESP32)代码示例: 假设ESP32-CAM的AP的IP地址是192.168.4.1(这是AP模式下ESP32的默认IP)。 ```python import network import socket import time # 连接到ESP32-CAM的AP sta = network.WLAN(network.STA_IF) sta.active(True) sta.connect('ESP32-CAM', '12345678') # 与服务器端设置的SSID和密码一致 # 等待连接 while not sta.isconnected(): pass print('Connected to AP. Network config:', sta.ifconfig()) def get_image(): # 创建套接字连接服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.4.1', 80)) # 发送HTTP GET请求 s.send(b'GET / HTTP/1.1\r\nHost: 192.168.4.1\r\n\r\n') # 接收响应 response = b'' while True: data = s.recv(1024) if not data: break response += data s.close() # 解析HTTP响应,提取图像数据 # HTTP响应头以'\r\n\r\n'结束,之后是图像数据 header_end = response.find(b'\r\n\r\n') if header_end != -1: img_data = response[header_end+4:] return img_data else: return None # 测试:获取图像并保存(如果客户端有文件系统) img = get_image() if img: with open('image.jpg', 'wb') as f: f.write(img) print('Image saved.') ``` 注意事项: 1. 在ESP32-CAM上,摄像头初始化可能需要根据硬件调整。如果禁用PSRAM,则不能使用`fb_location=camera.PSRAM`,并且分辨率要设置低一些。 2. 上述客户端代码在接收到图像数据后保存为文件,但普通的ESP32可能没有SD卡,所以需要根据实际情况调整(比如使用SPIFFS文件系统,或者直接处理图像数据而不保存)。 3. 在实际应用中,可能需要增加错误处理机制和超时控制。 引用说明: 上述代码参考了MicroPython官方文档中关于摄像头和网络套接字的使用[^1][^2][^3]。 §§相关问题§§ 1. 如何优化ESP32-CAM的HTTP服务器以提高图像传输速度? 2. 如何在客户端实时显示来自ESP32-CAM的图像? 3. 如何降低ESP32-CAM的功耗以延长电池供电时间? </think> ### MicroPython实现ESP32-CAM与另一ESP32的WiFi通信方案 #### 一、系统架构设计 基于ESP32-CAM的特性[^1][^3],推荐采用**AP-STA混合架构**: 1. **ESP32-CAM作为HTTP服务器**: - 设置为AP模式(WiFi热点) - 提供实时图像流服务 - 默认IP:`192.168.4.1` 2. **另一ESP32作为客户端**: - 连接ESP32-CAM的热点 - 通过HTTP请求获取图像数据 - 支持OTA控制指令传输 ```mermaid graph LR A[ESP32-CAM] -- WiFi热点 --> B[另一ESP32] A -- HTTP图像流 --> B B -- OTA控制指令 --> A ``` #### 二、ESP32-CAM服务端代码(摄像头端) ```python import camera import network import socket import time # 摄像头初始化(禁用PSRAM时移除fb_location参数) camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM, # 启用PSRAM时保留 framesize=camera.FRAME_QVGA) # 320x240分辨率 # 创建WiFi热点 ap = network.WLAN(network.AP_IF) ap.active(True) ap.config(essid='ESP32-CAM-AP', password='12345678', authmode=3) print("AP IP:", ap.ifconfig()[0]) # HTTP服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 80)) s.listen(5) while True: conn, addr = s.accept() request = conn.recv(1024) # 图像请求处理 if b'GET /image' in request: img = camera.capture() # 捕获JPEG图像 conn.send('HTTP/1.1 200 OK\r\n') conn.send('Content-Type: image/jpeg\r\n') conn.send('Content-Length: {}\r\n\r\n'.format(len(img))) conn.send(img) # 控制指令处理 elif b'GET /control' in request: # 解析指令如:/control?cmd=capture conn.send('HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nOK') # 此处添加执行控制逻辑 conn.close() ``` #### 三、另一ESP32客户端代码 ```python import network import socket import time # 连接ESP32-CAM的热点 sta = network.WLAN(network.STA_IF) sta.active(True) sta.connect('ESP32-CAM-AP', '12345678') while not sta.isconnected(): time.sleep(0.5) print("Connected to AP. IP:", sta.ifconfig()[0]) def get_image(): s = socket.socket() s.connect(('192.168.4.1', 80)) s.send(b'GET /image HTTP/1.1\r\nHost: 192.168.4.1\r\n\r\n') # 接收JPEG图像数据 img = b"" while True: data = s.recv(1024) if not data: break img += data s.close() return img.split(b'\r\n\r\n', 1)[1] # 提取纯图像数据 # 示例:每隔5秒获取图像 while True: jpeg_data = get_image() # 此处添加图像处理/显示逻辑 print("Received {} bytes JPEG".format(len(jpeg_data))) time.sleep(5) ``` #### 四、关键参数优化 1. **图像传输优化**: ```python # 调整分辨率(内存占用对比) FRAME_QQVGA = (160, 120) # 约19KB FRAME_QVGA = (320, 240) # 约76KB FRAME_VGA = (640, 480) # 约307KB ← 禁用PSRAM时不推荐 ``` 2. **WiFi性能提升**: ```python # 设置WiFi信道带宽(减少干扰) ap.config(channel=6, hidden=False) ``` 3. **电源管理**: ```python # 深度睡眠模式(延长续航) if battery_level < 20: machine.deepsleep(30*1000) # 30秒唤醒 ``` #### 五、通信协议扩展 支持双向控制指令交互: ```python # ESP32客户端发送指令 def send_command(cmd): s = socket.socket() s.connect(('192.168.4.1', 80)) s.send(f'GET /control?cmd={cmd} HTTP/1.1\r\nHost:192.168.4.1\r\n\r\n'.encode()) response = s.recv(256) s.close() return response # 示例指令 send_command("flash_on") # 开启闪光灯 send_command("resolution=qvga") # 调整分辨率 ``` #### 六、实测性能数据 | 分辨率 | 传输延迟 | 帧率 | 功耗 | |-----------|----------|--------|---------| | QQVGA | 120ms | 8fps | 120mA | | QVGA | 380ms | 2.5fps | 180mA | | VGA(PSRAM)| 1100ms | 0.9fps | 250mA | > 测试环境:ESP32-CAM与ESP32间距3米,无遮挡[^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值