ESP32用Arduino硬件IIC读取SHT30温湿度计的数据

网上有不少ESP32用硬件IIC读取SHT30温湿度计的数据的文章,大多缺少解释,不太看得明白,我通过波形查看标注了一下说明,有不对的地方望帮助指出,谢谢
直接上代码吧:

#include <Wire.h>

//IIC管脚为GPIO 21(SDA)、GPIO 22(SCL)
//如果要使用其他管脚,在使库函数时,只需调用:Wire.begin(SDA, SCL);
//OLED的地址是 0X3c(7位)
//时间发生器PCF8563T 地址是0X51

//温度SHT30 地址是0x44 不需要乘2这个概念!!!!!!!

//温度sht30 地址0x44

byte temp[6];  //6个数据:温度高位,温度低位,温度CRC,湿度高位,湿度低位,湿度CRC
int wendu, shidu;

void setup(){
  Serial.begin(115200); 
  Wire.begin(); 
}
 
void loop(){

    
    Wire.beginTransmission(0x44);     //发开启传输Start + 地址0x44(7位) + 写入Bit(1位)
    Wire.write(0x2C);                 //写入命令 0x2C:开启Clock stretching   0x24:关闭Clock stretching (开启的时候会在没有转换完之前拉低时钟信号,迫使IIC等待转换 大概 9.2ms)
    Wire.write(0x06);                 //写入命令 0x06 重复率高,慢,重复率越高,转换持续的时间越长,功耗越高,但是转换精度越高。
    Wire.endTransmission();           //停止Stop

//    Wire.requestFrom(0x44, 0x06, false);  //将输据读出到缓存 地址 6个字节 结束后Stop;false和true在波形上看不到区别
    Wire.requestFrom(0x44, 0x06, true);  //将输据读出到缓存 地址 6个字节 结束后Stop;
    temp[0] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    temp[1] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    temp[2] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    temp[3] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    temp[4] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    temp[5] = Wire.read();            // 接收并读取从机发来的一个字节的数据
    //Wire.endTransmission();         //发完后自动会发Stop,不需要这句话

    wendu = temp[0]<<8 | temp[1];     //高位左移8位 并上低位
    shidu = temp[3]<<8 | temp[4];     //高位左移8位 并上低位

    float wendufloat = (float)wendu / 65535 * 175 - 45;   //公式就是这样
    float shidufloat = ((float)shidu / 65535) * 100 ;     //公式就是这样

    Serial.printf("wendu = %02X %02X  ; shidu = %02X %02X ;\r\n",temp[0],temp[1],temp[3],temp[4]);
    Serial.printf("wendu = %04X ; shidu = %04X;\r\n",wendu, shidu);
    Serial.printf("wendu = %f ; shidu = %f;\r\n",wendufloat, shidufloat);


  //  Serial.println("The iic device list!");  //用于检测在线的IIC设备地址
  // for(int i=0x01;i<127;i++)
  // {
  //   Wire.beginTransmission(i);
  //   if(Wire.endTransmission()==0)
  //   {
  //     Serial.print("0x");
  //     Serial.println(i,HEX);
  //   }
  // }

  delay(1000);

}

波形如下:
在这里插入图片描述
中间等待9.2ms

在这里插入图片描述
写命令2C 06 再读温湿度数据 等待9.2ms
在这里插入图片描述
读到6字节数据。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值