??零知開源是一個真正屬于國人自己的開源軟硬件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!
?訪問零知開源平臺,獲取更多實戰項目和教程資源吧!
www.lingzhilab.com
目錄
一、硬件連接
1.1 硬件清單
?1.2 接線硬件表
1.3 接線實物圖
二、軟件環境配置
2.1 安裝開發工具?
2.2 依賴庫
三、核心代碼實現
3.1 零知IDE代碼驅動?
3.2?核心庫函數解析?
3.2.1?Adafruit_SHT4x庫?
3.2.2?Adafruit_Sensor庫
3.2.3?Adafruit_I2CDevice庫
四、常見問題解答
Q1:編譯時報錯"Adafruit_SHT4x.h: No such file or directory"?
Q2:傳感器檢測失敗("Couldn't find SHT4x")?
Q3:數據讀取不穩定或CRC校驗失敗
Q4:如何提高測量精度?
五、結果顯示
項目概述?
????????本項目基于STM32F407VET6零知增強板,實現SHT41高精度溫濕度傳感器的驅動和數據采集。SHT41是Sensirion推出的新一代數字溫濕度傳感器,具有±0.2°C的溫度精度和±1.8%RH的濕度精度,采用I2C接口通信。本教程將展示如何通過STM32F407的硬件I2C接口驅動SHT41,并實現實時溫濕度數據的采集與顯示。?
一、硬件連接
1.1 硬件清單
? ? ? ? ?>主控芯片:STM32F407VET6零知增強板
? ? ? ? ?>傳感器:SHT41溫濕度傳感器?(I2C地址:0x44)
? ? ? ? ?>杜邦線若干
?1.2 接線硬件表
SHT41引腳 | 零知增強板引腳 | 功能說明 |
---|---|---|
VCC | 3.3V | 電源正極 |
GND | GND | 電源地 |
SCL | 21/SCL | I2C時鐘線 |
SDA | 20/SDA | I2C數據線 |
?注意:I2C總線需要4.7kΩ上拉電阻(開發板通常已內置)
1.3 接線實物圖
二、軟件環境配置
2.1 安裝開發工具?
?????????零知IDE 3.8.0
? ? ? ? ?選擇開發板零知增強板
2.2 依賴庫
- Adafruit SHT4x Library
- Adafruit_I2CDevice
- Adafruit BusIO
三、核心代碼實現
3.1 零知IDE代碼驅動?
#include "Adafruit_SHT4x.h"
Adafruit_SHT4x sht4 = Adafruit_SHT4x();void setup() {Serial.begin(115200);while (!Serial) delay(10); // 等待串口初始化// 初始化傳感器if (!sht4.begin()) {Serial.println("Sensor not found!");while (1) delay(1);}// 設置高精度模式sht4.setPrecision(SHT4X_HIGH_PRECISION);// 關閉加熱器(節能模式)sht4.setHeater(SHT4X_NO_HEATER);
}void loop() {sensors_event_t humidity, temp;sht4.getEvent(&humidity, &temp); // 讀取數據Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" ℃");Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");delay(1000); // 每秒讀取一次
}
3.2?核心庫函數解析?
3.2.1?Adafruit_SHT4x庫?
bool Adafruit_SHT4x::begin(TwoWire *theWire) {i2c_dev = new Adafruit_I2CDevice(SHT4x_DEFAULT_ADDR, theWire);if (!i2c_dev->begin()) return false;return reset(); // 發送復位命令
}
- 功能:初始化I2C通信并復位傳感器
- 參數:I2C接口指針(默認使用Wire)
- 返回值:初始化成功返回true,失敗返回false
bool Adafruit_SHT4x::getEvent(sensors_event_t *humidity, sensors_event_t *temp) {// 根據精度和加熱器設置選擇命令uint8_t cmd = SHT4x_NOHEAT_HIGHPRECISION; uint16_t duration = 10;// 發送測量命令if (!i2c_dev->write(&cmd, 1)) return false;delay(duration); // 等待測量完成// 讀取6字節數據(溫度+CRC, 濕度+CRC)uint8_t readbuffer[6];if (!i2c_dev->read(readbuffer, 6)) return false;// CRC校驗if (readbuffer[2] != crc8(readbuffer, 2) ||readbuffer[5] != crc8(readbuffer + 3, 2)) return false;// 原始數據轉換uint16_t temp_raw = (readbuffer[0] << 8) | readbuffer[1];uint16_t hum_raw = (readbuffer[3] << 8) | readbuffer[4];// 轉換為實際值_temperature = -45 + 175 * temp_raw / 65535.0;_humidity = -6 + 125 * hum_raw / 65535.0;// 填充傳感器事件if (temp) fillTempEvent(temp, millis());if (humidity) fillHumidityEvent(humidity, millis());return true;
}
- 功能:獲取溫濕度數據并填充到事件結構體
- 參數:指向溫濕度事件結構體的指針
- 返回值:成功返回true,失敗返回false
static uint8_t crc8(const uint8_t *data, int len) {const uint8_t POLYNOMIAL(0x31);uint8_t crc(0xFF);for (int j = len; j; --j) {crc ^= *data++;for (int i = 8; i; --i) {crc = (crc & 0x80) ? (crc << 1) ^ POLYNOMIAL : (crc << 1);}}return crc;
}
- 功能:計算CRC8校驗碼
- 參數:數據指針和長度
- 返回值:CRC8校驗值
3.2.2?Adafruit_Sensor庫
void Adafruit_SHT4x::fillTempEvent(sensors_event_t *temp, uint32_t timestamp) {memset(temp, 0, sizeof(sensors_event_t));temp->version = sizeof(sensors_event_t);temp->sensor_id = _sensorid_temp;temp->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;temp->timestamp = timestamp;temp->temperature = _temperature;
}
- 功能:填充溫度事件結構體
- 參數:
????????temp:目標結構體指針
????????timestamp:時間戳
void Adafruit_SHT4x::fillHumidityEvent(sensors_event_t *humidity, uint32_t timestamp) {memset(humidity, 0, sizeof(sensors_event_t));humidity->version = sizeof(sensors_event_t);humidity->sensor_id = _sensorid_humidity;humidity->type = SENSOR_TYPE_RELATIVE_HUMIDITY;humidity->timestamp = timestamp;humidity->relative_humidity = _humidity;
}
- 功能:填充濕度事件結構體
- 參數:
????????humidity:目標結構體指針
????????timestamp:時間戳
3.2.3?Adafruit_I2CDevice庫
bool Adafruit_I2CDevice::write_then_read(const uint8_t *write_buffer,size_t write_len, uint8_t *read_buffer,size_t read_len, bool stop) {if (!write(write_buffer, write_len, stop)) {return false;}return read(read_buffer, read_len);
}
功能:先寫后讀的I2C操作(常用模式)
參數:
- write_buffer:寫入數據緩沖區
- write_len:寫入數據長度
- read_buffer:讀取數據緩沖區
- read_len:讀取數據長度
- stop:是否在寫操作后發送停止條件
bool Adafruit_I2CDevice::read(uint8_t *buffer, size_t len, bool stop) {size_t pos = 0;while (pos < len) {size_t read_len = min(len - pos, _maxBufferSize);bool read_stop = (pos + read_len >= len) ? stop : false;if (!_read(buffer + pos, read_len, read_stop))return false;pos += read_len;}return true;
}
功能:從I2C設備讀取數據
參數:
- buffer:數據緩沖區
- len:讀取長度
- stop:是否發送停止條件
四、常見問題解答
Q1:編譯時報錯"Adafruit_SHT4x.h: No such file or directory"?
A:解決方法
檢查是否安裝了依賴庫(Adafruit BusIO)?
Q2:傳感器檢測失敗("Couldn't find SHT4x")?
A:排查步驟
- 檢查硬件連接(VCC、GND、SCL、SDA)
- 確認I2C地址正確(SHT41默認為0x44)
- 使用I2C掃描工具確認設備地址
- 檢查上拉電阻(4.7kΩ)?
Q3:數據讀取不穩定或CRC校驗失敗
A:解決方案
- 降低I2C時鐘速度
- 縮短I2C總線長度
- 嘗試不同的精度模式
Q4:如何提高測量精度?
A:優化方法
- 使用高精度模式:sht4.setPrecision(SHT4X_HIGH_PRECISION)
- 啟用加熱器:sht4.setHeater(SHT4X_MED_HEATER_100MS)
- 避免傳感器暴露在氣流中?
五、結果顯示
成功運行后,串口監視器將輸出以下格式的數據:?
資源鏈接?
????????SHT41數據手冊?
????????STM32F407VET6參考手冊
????????Adafruit SHT4x庫GitHub
?通過本教程,開發者可以快速構建穩定可靠的環境監測系統,點擊了解更多零知開發教程:
零知實驗室--零知開源