ESP32 i2c GY-906 0xFF 1037.55 响应,温度传感器
Posted
技术标签:
【中文标题】ESP32 i2c GY-906 0xFF 1037.55 响应,温度传感器【英文标题】:ESP32 i2c GY-906 0xFF 1037.55 response, temperature sensor 【发布时间】:2021-02-25 00:51:48 【问题描述】:我正在尝试在 ESP32 TTGO T-display 上运行以下代码,从 loboris 运行 micropython。 (它是 esp32 预装了 TTGO Display 的显示驱动程序)我通过 i2c 连接了一个 GY-906 温度传感器进行测试。 i2c.scan() 在 0x5a [80] 上发现它没有问题,就像它应该的那样,但是当我请求温度数据时,响应总是 0xFF 而不是正确的温度读数。
当我在 WeMos D1 上运行完全相同的代码时(唯一的区别是引脚号),我得到了返回的温度数据。我附上了两个逻辑分析仪的屏幕截图,希望有人能告诉我我需要做些什么不同的事情。两者都直接从 3.3、gnd 和 2 个 i2c 引脚接线。
我尝试过的方法:在 SDA、SLC(10k、1k、100)上添加上拉电阻。切换到不同的 i2c 引脚。结果似乎是一样的。我错过了什么?我不知道的地方应该有一个电阻器吗?其他硬件?截图让我觉得GY906正在响应,只是响应值错误。
主代码
import temp_sensor
Pin = machine.Pin
I2C = machine.I2C
i2c = machine.I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)
temp1 = temp_sensor.Temp.init(i2c)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
time.sleep(1)
print(temp1.read_object_temp())
temp_sensor.py
import mlx90614 ##From https://github.com/mcauser/micropython-mlx90614
class Temp():
def init(i2c):
try:
sensor = mlx90614.MLX90614(i2c)
except:
print('couldnt connect to an i2c temp sensor')
sensor = False
else:
print('temp found')
#return sensor
finally:
return sensor
糟糕的 esp32 TTGO T 显示器: 好8266:
【问题讨论】:
缺少一个我没有复制进去的导入机器、显示器、时间。它就在那里。 我试过减慢 i2c 时钟并加快它的速度。它没有帮助。 50k一直到400k。 WeMos 在大多数速度下都可以工作。 在工作单元上,整个 I2C 事务的写入和读取部分通过重复的 START 条件连接。在非工作单元上,写事务通过 STOP 条件结束,不久之后,读事务有一个完全独立的 START。一些 I2C 设备根本无法处理以这种方式拆分的事务 - 我在此传感器的数据表中找不到任何明确的声明,但示例事务都使用了重复的 START。 也就是说,我不确定您可以采取哪些措施来影响 I2C 事务的执行方式。我猜你的那个单元上有一个过时或有问题的模块 - 但它可能是machine.I2C
或 mlx90614
有问题。
@jasonharper 谢谢。我认为 loboris 的预编译图像中的 machine.I2C 无法正常工作。我用标准的 esp32 图像(esp32 v1.13)重新刷新了非工作设备,它读取温度很好。所以 mlx90614.py 和 i2c 硬件和引脚看起来都很好。我正在使用我需要的显示库(我使用该图像的原因)编译新版本的固件。会回来报告的。
【参考方案1】:
对于从 gy-906 或 MXL90614 传感器接收 1037.55 响应的任何人,这将转换为来自传感器的 0xFF、0xFF 或全高(1)。当传感器不了解如何响应时,这似乎会发生。 (感谢@jasonharper 帮助我理解这一点)
以下是数学运算的原理:
十进制的0xFF、0xFF为65535。 传感器分辨率为 1/50 度数,这意味着您将 65535 x 0.02 除以转换为开尔文,或 1310.7 (K) 开尔文到摄氏度(减去 237.15)得到 1037.55 C 摄氏度到华氏度为您提供 1899.59 F归根结底,您的传感器打嗝是因为它不喜欢写入和读取之间的停止位,或者您的 I2C 总线有问题,或者协议执行请求错误,或者您有布线问题(长度或线规或连接等)。 如果是我喜欢的协议,看看最近有没有人更新了 I2C 系统库,如果可能的话尝试不同的版本。
我追踪这个问题好几天了。幸运的是,我有许多不同的支持 MicroPython 的芯片,并且能够将其缩小到旧版本的机器。I2C 库在上面添加了那个愚蠢的“停止”。
我在 amazon 上购买了 10 美元的协议分析器来制作上面的图像,并尝试在以下每一个上加载代码:Wemos D1、HitLego ESP32S 和 TTGO T-Display。通过尝试每个代码,我能够将其范围缩小到只有 T-Display 不工作,这需要一个定制的旧固件版本才能让 ST7789 显示器工作。下一步是尝试从 loboris 更新和重新编译显示库,以使用最新的 Micropython 固件。如果我成功了,我会在下面回复。
【讨论】:
以上是关于ESP32 i2c GY-906 0xFF 1037.55 响应,温度传感器的主要内容,如果未能解决你的问题,请参考以下文章
基于STM32的MLX90614(GY-906)人体红外测温