赞
踩
最近在某宝发现一个气压传感器,下面这个:
标称可以测量0-40kPa气压,如果这样的话,岂不是也可以拿来测水压,进而测量水深?
1米水深大约10kPa,那就是可以测4米水深,而且这个模块用的HX710芯片,是24位AD,精度非常高了,小型场景应用绰绰有余。
由于使用的是ESP32,micropython模组,因此就编写了一个micropython环境下的模块驱动程序。
HX710只有2个引脚,一个时钟脚SCK,一个数据脚DATA,时钟脚输入,数据脚输出。
手册里有几条比较重要:
SCK高电平超过60us就会使芯片进入断电状态。因此初始化时,使SCK先拉高,此时DATA也是高电平。
要使芯片工作,拉低SCK。此时芯片即开始进行AD转换。注意转换周期会超过4个数据读取周期,程序要做一个稍微的等待,直到DATA引脚出现低电平,代表AD转换结束,可以读取数据了。
拉高SCK,再拉低SCK,即为一个bit的数据读取周期。芯片会在SCK的下降沿输出数据。因此程序在拉低SCK后即可读取数据。要注意的是,SCK拉高后不要有长延时,因为超过60us芯片会停止工作。
重复拉高SCK、拉低SCK24次,芯片就输出了24位的AD转换结果数据。别忘了最后拉高SCK让芯片进入断电状态。
更多的细节可以翻阅其数据手册。
- import machine,time
- from machine import Pin
-
-
- class HX710:
- def __init__(self,pinClk,pinDat):
- self.pinClk=Pin(pinClk,Pin.OUT)
- self.pinDat=Pin(pinDat,Pin.IN)
- self.pinClk.value(1)#CLK=1超过60us进入休眠,CLK=0工作
- time.sleep(0.1)
-
- def readData(self):
- data=0
- self.pinClk.value(0)
- #time.sleep_us(100)#CLK=0,经过4个周期数据才准备好
- i=0
- while i<=1000000:
- if self.pinDat.value()==0:#DAT=0说明数据准备好,可以读取
- break
- else:
- i+=1
- if i==1000000:
- print("read HX710 time out ERR!")
- return
-
- for i in range(24):
- self.pinClk.value(1)#下降沿读取数据,多两条指令周期待DATA脚输出稳定数据
- self.pinClk.value(1)
- self.pinClk.value(1)
- self.pinClk.value(0)
- if self.pinDat.value()==1:
- data=data | 1
- else:
- data=data | 0
- data=data<<1
- self.pinClk.value(1)#继续休眠
- return data
-
- if __name__ == "__main__":
- #PwrPin=Pin(25,Pin.OUT)
- #PwrPin.on()
- #time.sleep_ms(1000)
- a=HX710(18,23)#CLK=Pin(18),DATA=Pin(23)
- print(a.readData())
-
ESP32的micropython环境下,实测该程序数据读取周期内持续时间:高电平约15us左右,低电平20us左右,满足要求,可能正常读取数据。
实测该芯片精度如下:
没有施加额外压力情况下,芯片输出AD结果值约750000左右(笔者在成都,这个应该是成都2月低的气压)。
模块接气管,放入约10cm深的水中,输出值约1870000左右。放入约20cm深的水中,输出值约3250000左右。
这个只是个定性的测试,没有做定量分析。数据看来还是有点像那么回事,比较灵敏;线性度嘛,我手也不是很准,插入深度不准确,待应用时再做线性标定。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。