天天看點

ESP8266(Nodemcu)的I2C通信電路連接配接代碼部分

ESP8266的I2C通信

電路連接配接

ESP8266(Nodemcu)的I2C通信電路連接配接代碼部分

ESP8266的引腳D1連接配接子產品的SCL、D2連接配接子產品的SDA、子產品的VCC、GND連接配接ESP8266的3.3V供電

ESP8266(Nodemcu)的I2C通信電路連接配接代碼部分

闆是臨時湊的用了三個子產品分别是溫濕度傳感器、光照傳感器、空氣品質傳感器。

代碼部分

僅供參考

#include <ESP8266WiFi.h>//安裝esp8266arduino開發環境
static WiFiClient espClient;

#include <Wire.h>
#include <BH1750FVI.h>
#include <ArduinoJson.h>//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);
}
           

根據對應需求進行更改即可。

繼續閱讀