目录

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

目录

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);

}

波形如下:

https://i-blog.csdnimg.cn/blog_migrate/882de3ff5a14254ae3b1b3748e0de45e.png#pic_center

中间等待 9.2ms

https://i-blog.csdnimg.cn/blog_migrate/206ad0bcb20cdae288d818917a991c2e.png#pic_center

写命令 2C 06 再读温湿度数据 等待 9.2ms

https://i-blog.csdnimg.cn/blog_migrate/f8f14c6b9d2e7a310897ff4cedb73b6b.png#pic_center

读到 6 字节数据。