??零知開源是一個真正屬于國人自己的開源軟硬件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!
?訪問零知開源平臺,獲取更多實戰項目和教程資源吧!
項目概述
本項目基于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.1Adafruit_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.2Adafruit_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.3Adafruit_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
通過本教程,開發者可以快速構建穩定可靠的環境監測系統,點擊了解更多零知開發教程:
https://www.lingzhilab.com/freesources.html
審核編輯 黃宇
-
I2C
+關注
關注
28文章
1541瀏覽量
127704 -
溫濕度傳感器
+關注
關注
5文章
597瀏覽量
36502 -
STM32F4
+關注
關注
3文章
203瀏覽量
29018
發布評論請先 登錄
SHT3x系列溫濕度傳感器的驅動設計與實現

SHT1x系列溫濕度傳感器的驅動設計與實現

STM32F407VET6和STM32F407IET6有什么區別?
零知開源分享-溫濕度模塊DHT11的使用
DHT22+數字溫濕度傳感器+AM2302+溫濕度模塊+取代SHT11+SHT15
stm32f407vet6原理介紹

零知開源——基于STM32F407VET6零知增強板的四路獨立計時器

評論