1 Star 0 Fork 0

卓晴 / 研究工作

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

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的读取协议。

利用中断在 ESP32 MicroPython 程序中读取AM2302 测试了利用 ESP32 MicroPython 端口中断完成对于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 读取温度曲线

3、串联DS18B20

将六个DS18B20串联在一起,进行读取温度数据。

(1) 连接电路

▲ 图2.3.3.1 布置了六个DS18B20的温度传感器

(2) 读取程序

from machine                import Pin
import time
import ds18x20
import onewire

ow = onewire.OneWire(Pin(2))
ds=ds18x20.DS18X20(ow)

roms = ds.scan()
print(len(roms))

while True:
    ds.convert_temp()
    time.sleep_ms(750)

    tempdim = []
    for r in roms:
        tempdim.append(ds.read_temp(r))

    print(tempdim)

(3) 转换结果

▲ 图2.2.3.1 多个温度传感器转换结果

 

※ 测试结论 ※


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

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

■ 相关文献链接:

● 相关图表链接:

★ 本文来自于CSDN文献:ESP32 One-Wire驱动功能

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/tsinghuajoking/yj.git
git@gitee.com:tsinghuajoking/yj.git
tsinghuajoking
yj
研究工作
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891