ESP8266的I2C通信
電路連接配接
ESP8266的引腳D1連接配接子產品的SCL、D2連接配接子產品的SDA、子產品的VCC、GND連接配接ESP8266的3.3V供電
闆是臨時湊的用了三個子產品分别是溫濕度傳感器、光照傳感器、空氣品質傳感器。
代碼部分
僅供參考
#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);
}
根據對應需求進行更改即可。