ESP8266(Nodemcu)的I2C通信

ESP8266的I2C通信

电路连接

ESP8266(Nodemcu)的I2C通信_第1张图片
ESP8266的引脚D1连接模块的SCL、D2连接模块的SDA、模块的VCC、GND连接ESP8266的3.3V供电
ESP8266(Nodemcu)的I2C通信_第2张图片
板是临时凑的用了三个模块分别是温湿度传感器、光照传感器、空气质量传感器。

代码部分

仅供参考

#include //安装esp8266arduino开发环境
static WiFiClient espClient;

#include 
#include 
#include //json包

float humidity;
float cTemp;
float fTemp;
unsigned long lastMsMain = 0;

DynamicJsonDocument doc(1024);

// Create the Lightsensor instance
BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes);

// SHT30 IIC 7位地址为0x44
#define Addr 0x44

void setup()
{
  Wire.begin();//初始化I2C通信作为主设备
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);
  
  LightSensor.begin();

}

void loop()
{
  
  uint16_t lux = LightSensor.GetLightIntensity();//获得光照强度

  sht3x();
  
  if (millis() - lastMsMain >= 2000)//每2秒发送一次
  {
    lastMsMain = millis();

    Serial.print("Light: ");
    Serial.println(lux);

    doc["LightLuminance"]=lux;
    doc["Humidity"]=humidity;
    doc["CurrentTemperature"]=cTemp;    
    String output;
    serializeJson(doc, output);
    const char *str = output.c_str(); 
  }
}



//温湿度传感
void sht3x()
{
  unsigned int data[6]; //存储获取到的六个数据
  //开始IIC
  //写地址
  Wire.beginTransmission(Addr);
  //发送测量命令 0x2C06,但是因为IIC一次只能发一个8位数据,所以得发两次
  Wire.write(0x2C);
  Wire.write(0x06);
  //停止IIC
  Wire.endTransmission();
  //等待500ms是等待SHT30器件测量数据,实际上这个时间可以很短
  delay(500);

  //请求获取6字节的数据,然后会存到8266的内存里
  Wire.requestFrom(Addr, 6);

  //读取6字节的数据
  //这六个字节分别为:温度8位高数据,温度8位低数据,温度8位CRC校验数据
  //               湿度8位高数据,湿度8位低数据,湿度8位CRC校验数据
  if (Wire.available() == 6)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
    data[2] = Wire.read();
    data[3] = Wire.read();
    data[4] = Wire.read();
    data[5] = Wire.read();
  }

  //然后计算得到的数据,要转化为摄氏度、华氏度、相对湿度
  cTemp = ((((data[0] * 256.0) + data[1]) * 175) / 65535.0) - 45;
  fTemp = (cTemp * 1.8) + 32;
  humidity = ((((data[3] * 256.0) + data[4]) * 100) / 65535.0);

  //在串口里输出得到的数据
  Serial.print("相对湿度:");
  Serial.print(humidity);
  Serial.println("% RH");
  Serial.print("摄氏度温度:");
  Serial.print(cTemp);
  Serial.println(" C");
  Serial.print("华氏度温度:");
  Serial.print(fTemp);
  Serial.println(" F");
  delay(500);
}

根据对应需求进行更改即可。

你可能感兴趣的:(ESP8266,I2C,传感器,大数据)