micropython ds18x20 错误 rom/address/serial

micropython ds18x20 wrong rom/address/serial

我有 ESP23 开发套件和 micropython 固件 esp32-idf3-20200329-v1.12-317-g688323307。 我还有 ds18b20 防水传感器。 datasheet link

我为此编写了这段代码:

import time, onewire, ds18x20
import machine

from machine import Pin

ds_pin=Pin(19)
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))

roms = ds_sensor.scan()

for rom in roms:
    print(rom)

它 returns 这是信息:

[bytearray(b'(\xbcN6\x14\x19\x01\xba')]

在从传感器读取温度数据之前,我们首先需要使用 scan() 函数扫描 DS18B20 传感器。找到的地址保存在roms变量中(roms变量是list类型)。 scan() 函数发送请求和传感器 returns 其唯一的 64 位串行代码。

I used manual here

今天我又买了两个 ds18x20 防水传感器(我不知道是什么类型的传感器 - ds18a20/ds18b20 或者 - 它们是什么,因为急切的中国制造商将传感器密封在金属子弹内太好了,所以我不能只看里面)。 我试图 运行 与他们相同的代码,但它返回以下内容:

bytearray(b'(\xff\xff\xff\xff\xff\xff\xff')
bytearray(b'(\xfe\xff\xff\xff\xff\xff\xff')
bytearray(b'(\xfc\xff\xff\xff\xff\xff\xff')
bytearray(b'(\xf8\xff\xff\xff\xff\xff\xff')
bytearray(b'(\xf0\xff\xff\xff\xff\xff\xff')
bytearray(b'(\xd0\xff\xff\xff\xff\xff\xff')
bytearray(b'(\x90\xff\xff\xff\xff\xff\xff')
bytearray(b'(\x90\xfe\xff\xff\xff\xff\xff')
bytearray(b'(\x90\xf6\xff\xff\xff\xff\xff')
bytearray(b'(\x90\xe6\xff\xff\xff\xff\xff')
bytearray(b'(\x90\xc6\xff\xff\xff\xff\xff')
bytearray(b'(\x90\x86\xff\xff\xff\xff\xff')
bytearray(b'(\x90\x86\xfd\xff\xff\xff\xff')
bytearray(b'(\x90\x86\xf9\xff\xff\xff\xff')
bytearray(b'(\x90\x86y\xff\xff\xff\xff')
bytearray(b'(\x90\x86y\xfe\xff\xff\xff')
bytearray(b'(\x90\x86y\xfa\xff\xff\xff')
bytearray(b'(\x90\x86y\xf2\xff\xff\xff')
bytearray(b'(\x90\x86y\xe2\xff\xff\xff')
bytearray(b'(\x90\x86y\xa2\xff\xff\xff')
bytearray(b'(\x90\x86y\xa2\xfd\xff\xff')
bytearray(b'(\x90\x86y\xa2\xf9\xff\xff')
bytearray(b'(\x90\x86y\xa2\xf1\xff\xff')
bytearray(b'(\x90\x86y\xa2\xe1\xff\xff')
bytearray(b'(\x90\x86y\xa2\xc1\xff\xff')
bytearray(b'(\x90\x86y\xa2\x81\xff\xff')
bytearray(b'(\x90\x86y\xa2\x01\xff\xff')
bytearray(b'(\x90\x86y\xa2\x01\xfb\xff')
bytearray(b'(\x90\x86y\xa2\x01\xf3\xff')
bytearray(b'(\x90\x86y\xa2\x01\xe3\xff')
bytearray(b'(\x90\x86y\xa2\x01\xc3\xff')
bytearray(b'(\x90\x86y\xa2\x01\x83\xff')
bytearray(b'(\x90\x86y\xa2\x01\x03\xff')
bytearray(b'(\x90\x86y\xa2\x01\x03\xfe')
bytearray(b'(\x90\x86y\xa2\x01\x03\xfc')
bytearray(b'(\x90\x86y\xa2\x01\x03\xdc')
bytearray(b'(\x90\x86y\xa2\x01\x03\')

当我尝试使用此值读取温度时,它 returns“CRC 错误”。

可以做什么?是代码有问题,还是传感器出了问题?

  1. 扫描时一次连接一个传感器。

  2. 您尚未分享 DS18x20 传感器的接线方式。确保它的正电源连接是 3.3V 而不是 5V。

  3. 确保在传感器的数据引脚和 3.3V 之间连接了一个电阻(4.7K 应该是好的)。如果没有这个电阻器,OneWire 设备绝对无法可靠地工作——您可能会遇到您所遇到的那种问题。

如果您确定接线正确,下一步就是尝试使用不同的固件,例如使用 Arduino Core 的 Dallas 单线扫描仪。这将消除您正在使用的库和 MicroPython 出现问题的可能性。

看起来像假传感器

How to tell original from fake DS18B20 temperature sensors

看来我是个傻子)) 是的。一个4.7K的上拉电阻就活了!它还活着!! aaa 医生怎么了? 然后我们使用内部 PULL_UP 模式,我们只为 ESP 拉高信号。 但! DS18B20也是微芯片。而小DS18B20的电线就像巨大的无线电天线。 也许在我的第一个传感器中这个问题在硬级别上得到了解决。