利用ESP32模块制作万用表联网转接模块

简 介: 本文给出了改在 ESP32 形成万用表联网转换模块过程。 经过改造之后,便可以通过 UDP 来访问万用联网数据了。

关键词 万用表ESP32

万用表联网
目 录
Contents
背景介绍
制作转接板
连接万用表网络
UDP连接与发送
总 结

01 用表联网


一、背景介绍

  由于所使用的 计算机Windows突然检测不到 USB串口线 ,在 读取万用表USB串口模块 制作了利用 CH340 读取串口的模块,但后来这款串口模块也无法识别。 现在利用在 利用ESP32构造一个ZIGBEE的网络发送转接 所使用到的 ESP32模块改在一款 WiFi转换成 RS232 串口,这样便可以摆脱对于计算机UART依赖,直接通过实验室中的 WiFi 来完成对于万用表网络的访问,获得万用表测量信息。

二、制作转接板

1、ESP32转接模块

  ESP32 MicroPython 模块使用 ESP32模块转接板 ,在面包板上搭建与 MAX3232 的接口电路。

▲ 图1.2.1 基于ESP32的MicroPython测试模块

▲ 图1.2.1 基于ESP32的MicroPython测试模块

(1)ESP32模块

  后面又找到了一个用于调试的 ESP32 计时系统,下面还是基于这款模块完成模块改造。

▲ 图1.2.2 ESP32计时系统

▲ 图1.2.2 ESP32计时系统

  利用其中的 UART1 比较方便外出引出接口。

▲ 图A1.2.3 改造ESP32输出接口

▲ 图A1.2.3 改造ESP32输出接口

(2)引出接口

 Ⅱ.引出接口定义
表1-1 ESP32输出管脚定义
PIN1 PIN2 PIN3 PIN4
3.3V GND RXD TXD
 Ⅲ.焊接输出管脚

  根据 ESP32 计时系统的原理图,如下引出 UART1 的接口。

▲ 图1.2.4 焊接引出UART1接口

▲ 图1.2.4 焊接引出UART1接口

  ESP32 的 UART 对应的管脚为:

▲ 图1.2.5 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设计的转接板

▲ 图1.2.3 Altium Design设计的转接板

(2)转接板调试

  下面测试电平转接板的功能。 利用前面 ESP32 的 UART 发送与接收 “hello” 字符串。 测量输出信号的电平以,以及短接 UART 的 RX,TX 的管脚。可以获得发送与接收的字符串。

▲ 图1.2.7 焊接后测试RS3232功能

▲ 图1.2.7 焊接后测试RS3232功能

▲ 图1.2.8 测试转接板的输出RS232信号

▲ 图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 接口定义

▲ 图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  测试后的程序

▲ 图1.4.1 测试后的程序

  结 ※


  文给出了改在 ESP32 形成万用表联网转换模块过程。 经过改造之后,便可以通过 UDP 来访问万用联网数据了。


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/126674441