AHT15溫濕度感測器數據回傳序列埠_教案.pdf
#include <Wire.h> // 匯入Wire函式庫,用於I2C通訊
#define AHT15_ADDRESS 0x38 // 定義AHT15感測器的I2C地址
#define AHT15_RESET 0xBA // 定義重置命令的值
#define AHT15_INIT 0xBE // 定義初始化命令的值
#define AHT15_START_MEASUREMENT 0xAC // 定義開始測量命令的值
void setup() { // 設定函數,在程式開始時執行一次
Wire.begin(); // 啟用Wire函式庫
Serial.begin(115200); // 啟動序列通訊鮑率115200
// Reset sensor
Wire.beginTransmission(AHT15_ADDRESS); // 開始向AHT15_ADDRESS發送數據
Wire.write(AHT15_RESET); // 發送重置命令
if (Wire.endTransmission() != 0) { // 如果傳輸結束並返回錯誤
Serial.println("重置錯誤"); // 顯示錯誤信息
while(1); // 進入無窮迴圈
}
delay(20); // 等待20毫秒
// Initialize sensor
Wire.beginTransmission(AHT15_ADDRESS); // 開始向AHT15_ADDRESS發送數據
Wire.write(AHT15_INIT); // 發送初始化命令
Wire.write(0x08); // 發送額外的初始化數據
Wire.write(0x00); // 發送額外的初始化數據
if (Wire.endTransmission() != 0) { // 如果傳輸結束並返回錯誤
Serial.println("初始化錯誤"); // 顯示錯誤信息
while(1); // 進入無窮迴圈
}
delay(10); // 等待10毫秒
}
void loop() { // 主迴圈,會不斷重複執行
// Start measurement
Wire.beginTransmission(AHT15_ADDRESS); // 開始向AHT15_ADDRESS發送數據
Wire.write(AHT15_START_MEASUREMENT); // 發送開始測量命令
Wire.write(0x33); // 發送額外的開始測量數據
Wire.write(0x00); // 發送額外的開始測量數據
if (Wire.endTransmission() != 0) { // 如果傳輸結束並返回錯誤
Serial.println("測量失敗"); // 顯示錯誤信息
delay(1000); // 等待1000毫秒
return; // 返回,跳過此次迴圈的剩餘部分
}
delay(80); // 等待80毫秒以完成測量
// Read data
Wire.requestFrom(AHT15_ADDRESS, 6); // 從AHT15_ADDRESS請求6個字節的數據
if (Wire.available() != 6) { // 如果可用數據不是6個字節
Serial.println("讀取錯誤"); // 顯示錯誤信息
return; // 返回,跳過此次迴圈的剩餘部分
}
uint8_t data[6]; // 創建一個用於存儲數據的陣列
for (int i = 0; i < 6; i++) { // 對於每個字節
data[i] = Wire.read(); // 讀取並存儲數據
}
// Calculate humidity and temperature
uint32_t rawHumidity = ((uint32_t)data[1] << 12) | ((uint32_t)data[2] << 4) | (data[3] >> 4); // 計算原始濕度值
float humidity = rawHumidity * 100.0 / (1 << 20); // 轉換原始濕度值為百分比
uint32_t rawTemperature = (((uint32_t)data[3] & 0xF) << 16) | ((uint32_t)data[4] << 8) | data[5]; // 計算原始溫度值
float temperature = ((200.0 * rawTemperature) / (1 << 20)) - 50; // 轉換原始溫度值為攝氏度
// Print results
Serial.print("Humidity: "); // 顯示"濕度:"
Serial.print(humidity); // 顯示濕度值
Serial.print("% , "); // 顯示"% ,"
Serial.print("Temperature: "); // 顯示"溫度:"
Serial.print(temperature); // 顯示溫度值
Serial.println("°C"); // 顯示"°C"
delay(2000); // 等待2000毫秒
}