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左右。

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

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

### ESP32HX710B气压传感器交互 #### 硬件连接 对于ESP32HX710B气压传感器之间的硬件连接,通常遵循I²C通信协议标准连线方式。具体来说: - **VCC** 连接到 ESP32 的 3.3V 输出端口。 - **GND** 接到 ESP32 地线 (GND) 上。 - **SDA** 数据线应连接至 GPIO 21 或其他指定用于 I²C 总线 SDA 功能的引脚上[^1]。 - **SCL** 时钟信号则需接入 GPIO 22 或者同样支持 I²C 协议的另一个管脚。 需要注意的是,在某些情况下,如果采用不同的开发板或者特定版本的HX710B模块,则具体的针脚定义可能会有所变化,请参照实际产品的文档说明进行调整。 #### 软件环境搭建 为了使ESP32能够顺利运行并控制HX710B工作,建议使用Arduino IDE作为编程工具,并安装相应的库文件以便简化操作过程。此外,还可以考虑利用MicroPython框架来进行更灵活快速的应用开发[^3]。 #### 示例代码 下面给出一段简单的Arduino风格示例代码片段,演示如何初始化设置以及获取来自HX710B的数据: ```cpp #include <Wire.h> #define HX710B_ADDRESS 0x5D // 默认地址 void setup() { Serial.begin(9600); Wire.begin(); } float readPressure(){ int data[3]; float pressure; Wire.beginTransmission(HX710B_ADDRESS); Wire.write(0xF4); Wire.endTransmission(); delay(25); Wire.requestFrom((int)HX710B_ADDRESS, 3); if(Wire.available()){ for(int i=0;i<3;i++){ data[i]=Wire.read(); } } long rawValue=((data[0]<<16)|(data[1]<<8)|data[2]); pressure=(rawValue/4096.0)*250; // 假设满量程为250kPa return pressure; } void loop() { float p=readPressure(); Serial.print("Pressure="); Serial.println(p); delay(1000); } ``` 此段代码实现了通过I²C接口向HX710B发送命令请求读数,并解析返回的结果计算得到当前的大气压力值(单位:kPa)。请注意这里的转换比例因子`250/4096`取决于所使用的具体型号及其出厂校准参数,因此在正式应用前应当查阅产品手册确认正确的换算关系。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值