ESP32 One-Wire驱动功能

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP32 One-Wire驱动功能相关的知识,希望对你有一定的参考价值。

简 介: 通过测试ESP32 MicroPython中的1-Wire功能,可以看到对于DS18B20可以很好地读取其中的温度,但需要对于DS18B20增加对应的电源。

对于AM2302,直接使用ESP32 1-wire的功能无法直接读取对应的数据。需要重新进行开发。

关键词 1-wireESP32MicroPythonDS18b20as2302

 

§01 线总线


1、单线总线

  One-Wire 是 Maxim 全资子公司 Dallas 的一项专有技术与目前多数标准串行数据通信方式,如 SPI/I2C/MICROWIRE不同,它采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的。它具有节省 I/O口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。为了专注于通信本身,文章只介绍命令序列和信号方式(信号类型和时序)。

1、基本时序

(1) 复位与应答

▲ 图1.0.1 单总线初始化时序图

(2) 读写时序

▲ 图1.0.2 主机读、写时隙的时序示意图

2、基于One-Wire器件

  1-Wire Devices & Products 中给出了一些基于1-Wire 的器件:

▲ 图1.0.3 One-Wire的元器件

二、ESP32单线驱动

  ESP32 的MicroPython中具有 OneWire Driver ,并对于ds18x20系列的传感器有专门的驱动函数。

1、One-Wire

from machine import Pin
import onewire

ow = onewire.OneWire(Pin(12)) # create a OneWire bus on GPIO12
ow.scan()               # return a list of devices on the bus
ow.reset()              # reset the bus
ow.readbyte()           # read a byte
ow.writebyte(0x12)      # write a byte on the bus
ow.write('123')         # write bytes on the bus
ow.select_rom(b'12345678') # select a specific device by its ROM code

2、ds18x20

import time, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
    print(ds.read_temp(rom))

3、ESP32模块接口

  选择 ESP32-S模块转接板设计与实现 中的ESP32 MicroPython 实验模块测试 1-wire 读写协议。

  选择GPIO2作为1-wire 完成读写协议。

▲ 图1.1.2.0 ESP32模块接口

三、温湿度传感器

  手边有 AM2302 , 下面通过ESP32对其进行实验。

1、器件外观

▲ 图1.1.1 温湿度传感器

2、连接电路图

▲ 图1.1.2 AM2302与MCU连接示意图

3、读取数据

▲ 图1.3.1 读取数据结构

 

§02 验过程


一、测试AM2302

1、实验电路板

▲ 图3.1.1 实验电路板

2、1-Wire 扫描

(1) Python程序

from machine                import Pin
import onewire

ow = onewire.OneWire(Pin(2))

ret = ow.scan()
print(ret)

(2) 1-Wire波形

▲ 图3.1.2 1-Wire scan波形图

  输出: 【】,没有扫描到任何期间。

3、读取数据

(1) 代码

from machine                import Pin
import onewire
import time

ow = onewire.OneWire(Pin(2))

ow.reset()

buf = bytearray(5)

for i in range(5):
    buf[i] = ow.readbyte()

def buf2am2302(buf):
    humidity = buf[0]
    humidity = humidity * 256 + buf[1]

    temperature = buf[2]
    temperature = temperature * 256 + buf[3]

    check = buf[0]+buf[1]+buf[2]+buf[3]
    check = check&0xff

    print(humidity)
    print(temperature)
    print(check, buf[4])

    return humidity, temperature

buf2am2302(buf)

(2) 读数数据

  读出的数据出现错误

  这说明ESP32的one-wire驱动程序不太适应AM2302的读取协议。

二、DS18B20

1、测试电路板

▲ 图2.2.2 面包板上的测试电路

2、测试结果

(1) 代码

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# EXEC2.PY                     -- by Dr. ZhuoQing 2021-09-21
#
# Note:
#============================================================
from machine                import Pin
import time
import ds18x20
import onewire
ow = onewire.OneWire(Pin(2))
ds=ds18x20.DS18X20(ow)
roms = ds.scan()
print(roms)
while True:
    ds.convert_temp()
    time.sleep_ms(750)
    print(ds.read_temp(roms[0]))
#------------------------------------------------------------
#        END OF FILE : EXEC2.PY
#============================================================

(2) 读出结果

  读出的结果具有很大的跳跃。

78.375
85.0
78.375
78.375
85.0
78.3125
78.375
78.4375
85.0
78.375
78.3125
78.4375
85.0

  将DS18B20 的VCC增加 3.3V之后,读出的数值就非常正常量。

23.5
23.5
23.5
23.5
23.5
23.5625
24.4375
25.75
26.6875
27.3125
27.875
27.9375
27.75
27.5625
27.3125
27.0625
26.875

  使用手指安捏DS18B20之后引起的问题上升与下降。

▲ 图2.2.3 读取温度曲线

 

试结论 ※


  过测试ESP32 MicroPython中的1-Wire功能,可以看到对于DS18B20可以很好地读取其中的温度,但需要对于DS18B20增加对应的电源。

  对于AM2302,直接使用ESP32 1-wire的功能无法直接读取对应的数据。需要重新进行开发。


■ 相关文献链接:

● 相关图表链接:

以上是关于ESP32 One-Wire驱动功能的主要内容,如果未能解决你的问题,请参考以下文章

ESP32设备驱动-MMA8653FC加速度计驱动

ESP32/8266 + Arduino SSD1306库驱动OLED

使用ESP32驱动QMA7981读取三轴加速度(带例程)

ESP8266 /ESP32软件IIC方式驱动OLED显示字符,基于micropython

esp32cam micropython使用I2S驱动DAC模块播放音频

【PIO系列2】与ESP32创建串口连接