ESP32使用micropython读取气压(水深)传感器HX710数据

文章介绍了如何利用一款标称0-40kPa的气压传感器配合ESP32的micropython模块进行驱动,通过精确的AD转换,可以用于水深测量。作者编写了驱动代码并进行了初步测试,证明了传感器的灵敏度和可行性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、模块基本情况

最近在某宝发现一个气压传感器,下面这个:

标称可以测量0-40kPa气压,如果这样的话,岂不是也可以拿来测水压,进而测量水深?

1米水深大约10kPa,那就是可以测4米水深,而且这个模块用的HX710芯片,是24位AD,精度非常高了,小型场景应用绰绰有余。

二、驱动方法

由于使用的是ESP32,micropython模组,因此就编写了一个micropython环境下的模块驱动程序。

HX710只有2个引脚,一个时钟脚SCK,一个数据脚DATA,时钟脚输入,数据脚输出。

手册里有几条比较重要:

  1. SCK高电平超过60us就会使芯片进入断电状态。因此初始化时,使SCK先拉高,此时DATA也是高电平。

  1. 要使芯片工作,拉低SCK。此时芯片即开始进行AD转换。注意转换周期会超过4个数据读取周期,程序要做一个稍微的等待,直到DATA引脚出现低电平,代表AD转换结束,可以读取数据了。

  1. 拉高SCK,再拉低SCK,即为一个bit的数据读取周期。芯片会在SCK的下降沿输出数据。因此程序在拉低SCK后即可读取数据。要注意的是,SCK拉高后不要有长延时,因为超过60us芯片会停止工作。

  1. 重复拉高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左右。

这个只是个定性的测试,没有做定量分析。数据看来还是有点像那么回事,比较灵敏;线性度嘛,我手也不是很准,插入深度不准确,待应用时再做线性标定。

所以结论是:这个传感器还行!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值