近期想用ESP32做个无线示波器,arduino开发环境自带udp示例,再加上adc代码,很容易完成。于是思路产生
1.电脑端用Python的socket接收数据,并用plot动态绘图,代码如下
‘’’
#coding=gbk
import socket
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import struct
初始化数据列表
data = []
创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
绑定地址和端口
server_ip = ‘172.20.10.8’
server_port = 8080
server_socket.bind((server_ip, server_port))
定义绘图更新函数
def update_plot(frame):
global data
# 接收4字节的二进制数据(一个浮点数)
#packed_data = client_socket.recv(4)
packed_data, addr =server_socket.recvfrom(1024)
if packed_data:
# 解包二进制数据为浮点数
value, = struct.unpack(‘f’, packed_data)
data.append(value)
if len(data) > 100:
data.pop(0) # 保持数据长度为100
else:
print(“No more data”)
plt.close()
# 清除当前的图形
plt.cla()
plt.plot(data)
plt.ylim(-1.5, 1.5) # 根据正弦函数的范围设置y轴限制
创建图形和轴对象
fig, ax = plt.subplots()
ani = animation.FuncAnimation(fig, update_plot, interval=50)
显示图形
plt.show()
关闭连接
client_socket.close()
server_socket.close()
‘’’
2.先用手机上Python作为数据发送端测试一下能否工作,手机端代码如下
‘’’
#coding=gbk
import socket
import time
import math
import struct
创建UDP socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
服务器的IP地址和端口号
server_ip = ‘172.20.10.8’
server_port = 8080
发送数据
try:
for i in range(200): # 发送200个数据点
x = i * 0.1 # x值
y = math.sin(x) # 计算正弦值
# 将浮点数打包为二进制格式
packed_data = struct.pack(‘f’, y)
client_socket.sendto(packed_data, (server_ip, server_port))
time.sleep(0.001) # 每0.001秒发送一次
finally:
client_socket.close()
‘’’
3.运行效果
发送接近1ms
4.电脑端Python延时较高
200个点数据,0.3秒已发送完成,17秒才放完动画
(无法传视频,感兴趣的小伙伴可以尝试)
后续再传ESP32的效果,再换个上位机,Python太慢了。