简 介: 本文给出了改在 ESP32 形成万用表联网转换模块过程。 经过改造之后,便可以通过 UDP 来访问万用联网数据了。
关键词
: 万用表,ESP32
01 万用表联网
一、背景介绍
由于所使用的 计算机Windows突然检测不到 USB串口线 ,在 读取万用表USB串口模块 制作了利用 CH340 读取串口的模块,但后来这款串口模块也无法识别。 现在利用在 利用ESP32构造一个ZIGBEE的网络发送转接 所使用到的 ESP32模块改在一款 WiFi转换成 RS232 串口,这样便可以摆脱对于计算机UART依赖,直接通过实验室中的 WiFi 来完成对于万用表网络的访问,获得万用表测量信息。
二、制作转接板
1、ESP32转接模块
ESP32 MicroPython 模块使用 ESP32模块转接板 ,在面包板上搭建与 MAX3232 的接口电路。
▲ 图1.2.1 基于ESP32的MicroPython测试模块
(1)ESP32模块
后面又找到了一个用于调试的 ESP32 计时系统,下面还是基于这款模块完成模块改造。
▲ 图1.2.2 ESP32计时系统
利用其中的 UART1 比较方便外出引出接口。
▲ 图A1.2.3 改造ESP32输出接口
(2)引出接口
Ⅱ.引出接口定义
PIN1 | PIN2 | PIN3 | PIN4 |
---|---|---|---|
3.3V | GND | RXD | TXD |
Ⅲ.焊接输出管脚
根据 ESP32 计时系统的原理图,如下引出 UART1 的接口。
▲ 图1.2.4 焊接引出UART1接口
ESP32 的 UART 对应的管脚为:
▲ 图1.2.5 ESP32 UART 缺省管脚
经过测试,直接使用UART1 在 PIN9,PIN10上没有输出,现在修改的模式则是利用 UART2 在 GPIO12(RX),GPIO14(TX)上完成输入输出的设置。
(3)ESP32刷新固件
利用 Thonny 对于 ESP32 固件进行刷新。具体方法可以参见 ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F 。
2、测试ESP32模块
测试 ESP32 的UART1功能。经过测试之后,验证 UART 的功能正常。
from machine import Pin,UART
import time
import machine
machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=12, tx=14, timeout=10)
bz1 = Pin(21, Pin.OUT)
bz1.on()
time.sleep_ms(50)
bz1.off()
print("Test LED")
while True:
uart1.write('hello')
b = uart1.read(5)
print(b)
time.sleep_ms(250)
3、MAX3232转接模块
由于所使用的 MAX3232 模块都是表贴模块,所以利用 一分钟制版方法 搭建具有100mil 测插针接口的小板,便于在面包板上与前面 ESP32 测试版进行连接。
(1)转接板设计
设计转接板,下面给出了原理图以及快速制版的 PCB 设计图。
AD\Test\2022\MAX3232SIP.SchDoc
▲ 图1.2.3 Altium Design设计的转接板
(2)转接板调试
下面测试电平转接板的功能。 利用前面 ESP32 的 UART 发送与接收 “hello” 字符串。 测量输出信号的电平以,以及短接 UART 的 RX,TX 的管脚。可以获得发送与接收的字符串。
▲ 图1.2.7 焊接后测试RS3232功能
▲ 图1.2.8 测试转接板的输出RS232信号
三、连接万用表网络
1、读取数据
根据原来的万用表读取程序 : ShowPannelResult() ,获得万用表网络读取协议。下面程序表明,读取万用表的周期为 25ms。
//---------------------------------------------------------------------------
void __fastcall TMainForm::Timer1Timer(TObject *Sender) {
static int nShowResultCount = 0;
if((nShowResultCount ++) >= 25) {
nShowResultCount = 0;
if(m_nShowResultFlag) {
ShowPannelResult();
}
}
}
读取数据与解析数据程序片段。
int GetMeterValueAll(double * lfResult) {
unsigned char ucBuffer[1024];
ClearPort(PORT1);
SendChar(0x55, PORT1);
unsigned char ucChar;
if(ReceCharL(&ucChar, PORT1, 20)) return 0;
if(ucChar != 0x55) return 0;
unsigned char ucMask;
if(ReceCharL(&ucMask, PORT1, 20)) return 0;
int nLength = ucMask;
int i;
for(i = 0; i < nLength; i ++) {
if(ReceChar(&ucChar, PORT1)) return 0;
ucBuffer[i] = ucChar;
ucMask += ucChar;
}
if(ReceChar(&ucChar, PORT1)) return 0;
if(ucChar != (ucMask ^ 0xff)) return 0;
if(ReceChar(&ucChar, PORT1)) return 0;
if(ucChar != 0xaa) return 0;
float * p;
int nNumber = nLength / 4;
for(i = 0; i < nNumber; i ++) {
p = (float *)&ucBuffer[i * 4];
*(lfResult + i) = *(p);
}
return nNumber;
}
2、连接接口定义
定义与万用表联网 RS232 接口定义。 将这个接口定义与 PC UART 的定义相同。 也就是 DB9 的管脚中定义为:
- PIN2:RXD
- PIN3:TXD
- PIN5:GND
▲ 图1.3.1 接口定义
3、测试读取万用表网络
利用下面程序,通过发送 0x55 字符之后,接收后面的数据。
from machine import Pin,UART
import time
import machine
machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=12, tx=14, timeout=100)
bz1 = Pin(21, Pin.OUT)
bz1.on()
time.sleep_ms(50)
bz1.off()
print("Test LED")
while True:
_ = uart1.write(bytes([0x55]))
b = uart1.read(50)
print(b)
time.sleep_ms(10)
下面是接收到的万用表的信息。
b'U\x10\x83\xa8{7\xd6\xe5\x9484\x807\xba\x00\x00\x00\x00\xe6\xaa'
b'U\x10\x83\xa8{7\xd6\xe5\x9484\x807\xba\x00\x00\x00\x00\xe6\xaa'
b'U\x10\x8b\xe1j7\x93\x17\x9984\x807\xba\x00\x00\x00\x00\xc2\xaa'
b'U\x10:\x9b\x8e7\x93\x17\x9984\x807\xba\x00\x00\x00\x005\xaa'
b'U\x10:\x9b\x8e7\x93\x17\x9984\x807\xba\x00\x00\x00\x005\xaa'
b'U\x10\x83\xa8{70b\x9f84\x807\xba\x00\x00\x00\x00\x04\xaa'
b'U\x10:\x9b\x8e70b\x9f84\x807\xba\x17\xb7\xd1\xb8\xf0\xaa'
b'U\x10:\x9b\x8e70b\x9f84\x807\xba\x17\xb7\xd1\xb8\xf0\xaa'
b'U\x100b\x9f7\x93\x17\x998RI\x1d\xba\x00\x00\x00\x00\x9a\xaa'
b'U\x100b\x9f7\x93\x17\x998RI\x1d\xba\x00\x00\x00\x00\x9a\xaa'
b'U\x10:\x9b\x8e7r0\x9b8RI\x1d\xba\x00\x00\x00\x00n\xaa'
四、UDP连接与发送
1、转发Python程序
下面是最终的 ESP32 MicroPython 程序。
from machine import Pin,UART
import time
import machine
import usocket,network
machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=16, tx=17, timeout=50)
bz1 = Pin(21, Pin.OUT)
bz1.on()
time.sleep_ms(50)
bz1.off()
wlan = network.WLAN(network.STA_IF)
wlan.active(False)
wlan.active(True)
time.sleep_ms(100)
wlan.connect('TENDA626A', 'gniqouhz')
bz1.on()
while not wlan.isconnected():
time.sleep_ms(100)
wlan.ifconfig()
bz1.off()
us = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
sockaddr = usocket.getaddrinfo('0.0.0.0', 7654)[0][-1]
us.bind(sockaddr)
count = 0
while True:
data,addr = us.recvfrom(1024)
if len(data) > 0:
_ = uart1.write(bytes([0x55]))
count += 1
if count >= 10:
count = 0
bz1.on()
time.sleep_ms(5)
bz1.off()
b = uart1.read(50)
if type(b) == bytes:
if len(b) > 0:
us.sendto(b, addr)
2、修改 MEGA程序
上位机软件:
D:\zhuoqing\window\cb\MyResearch\Test\TestAD5344\M8BL_BAS\M8BL_BAS.exe
修改后的程序,能够完成原来基于 UART 的程序功能。
▲ 图1.4.1 测试后的程序
※ 总 结 ※
本文给出了改在 ESP32 形成万用表联网转换模块过程。 经过改造之后,便可以通过 UDP 来访问万用联网数据了。
利用 TENDA无线服务器中的 DHCP 服务器进行静态IP分配。可以使得接入ESP32 的IP地址固定了。 本文中的ESP32的接入IP地址为:115.
▲ 图2.1 利用 HDCP 服务器进行静态IP分配
■ 相关文献链接:
- USB转UART模块驱动问题:Z-TEK
- 读取万用表USB串口模块
- 利用ESP32构造一个ZIGBEE的网络发送转接
- ESP32模块转接板
- ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F
- 一分钟制版方法
● 相关图表链接: