??零知開源是一個(gè)真正屬于國(guó)人自己的開源軟硬件平臺(tái),在開發(fā)效率上超越了Arduino平臺(tái)并且更加容易上手,大大降低了開發(fā)難度。零知開源在軟件方面提供了完整的學(xué)習(xí)教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來(lái)創(chuàng)作產(chǎn)品,測(cè)試產(chǎn)品??靵?lái)動(dòng)手試試吧!
?訪問零知開源平臺(tái),獲取更多實(shí)戰(zhàn)項(xiàng)目和教程資源吧!
項(xiàng)目概述
本項(xiàng)目基于STM32F407VET6零知增強(qiáng)板,實(shí)現(xiàn)SHT41高精度溫濕度傳感器的驅(qū)動(dòng)和數(shù)據(jù)采集。SHT41是Sensirion推出的新一代數(shù)字溫濕度傳感器,具有±0.2°C的溫度精度和±1.8%RH的濕度精度,采用I2C接口通信。本教程將展示如何通過STM32F407的硬件I2C接口驅(qū)動(dòng)SHT41,并實(shí)現(xiàn)實(shí)時(shí)溫濕度數(shù)據(jù)的采集與顯示。
一、硬件連接
1.1 硬件清單
>主控芯片:STM32F407VET6零知增強(qiáng)板
>傳感器:SHT41溫濕度傳感器(I2C地址:0x44)
>杜邦線若干
1.2 接線硬件表
| SHT41引腳 | 零知增強(qiáng)板引腳 | 功能說(shuō)明 |
|---|---|---|
| VCC | 3.3V | 電源正極 |
| GND | GND | 電源地 |
| SCL | 21/SCL | I2C時(shí)鐘線 |
| SDA | 20/SDA | I2C數(shù)據(jù)線 |
注意:I2C總線需要4.7kΩ上拉電阻(開發(fā)板通常已內(nèi)置)
1.3 接線實(shí)物圖

二、軟件環(huán)境配置
2.1 安裝開發(fā)工具
零知IDE 3.8.0
選擇開發(fā)板零知增強(qiáng)板
2.2 依賴庫(kù)
Adafruit SHT4x Library
Adafruit_I2CDevice
Adafruit BusIO
三、核心代碼實(shí)現(xiàn)
3.1 零知IDE代碼驅(qū)動(dòng)
#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);
}
// 設(shè)置高精度模式
sht4.setPrecision(SHT4X_HIGH_PRECISION);
// 關(guān)閉加熱器(節(jié)能模式)
sht4.setHeater(SHT4X_NO_HEATER);
}
void loop() {
sensors_event_t humidity, temp;
sht4.getEvent(&humidity, &temp); // 讀取數(shù)據(jù)
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" ℃");
Serial.print("Humidity: ");
Serial.print(humidity.relative_humidity);
Serial.println("% rH");
delay(1000); // 每秒讀取一次
}
3.2核心庫(kù)函數(shù)解析
3.2.1Adafruit_SHT4x庫(kù)
bool Adafruit_SHT4x::begin(TwoWire *theWire) {
i2c_dev = new Adafruit_I2CDevice(SHT4x_DEFAULT_ADDR, theWire);
if (!i2c_dev->begin()) return false;
return reset(); // 發(fā)送復(fù)位命令
}
功能:初始化I2C通信并復(fù)位傳感器
參數(shù):I2C接口指針(默認(rèn)使用Wire)
返回值:初始化成功返回true,失敗返回false
bool Adafruit_SHT4x::getEvent(sensors_event_t *humidity,
sensors_event_t *temp) {
// 根據(jù)精度和加熱器設(shè)置選擇命令
uint8_t cmd = SHT4x_NOHEAT_HIGHPRECISION;
uint16_t duration = 10;
// 發(fā)送測(cè)量命令
if (!i2c_dev->write(&cmd, 1)) return false;
delay(duration); // 等待測(cè)量完成
// 讀取6字節(jié)數(shù)據(jù)(溫度+CRC, 濕度+CRC)
uint8_t readbuffer[6];
if (!i2c_dev->read(readbuffer, 6)) return false;
// CRC校驗(yàn)
if (readbuffer[2] != crc8(readbuffer, 2) ||
readbuffer[5] != crc8(readbuffer + 3, 2))
return false;
// 原始數(shù)據(jù)轉(zhuǎn)換
uint16_t temp_raw = (readbuffer[0] < 8) | readbuffer[1];
uint16_t hum_raw = (readbuffer[3] < 8) | readbuffer[4];
// 轉(zhuǎn)換為實(shí)際值
_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;
}
功能:獲取溫濕度數(shù)據(jù)并填充到事件結(jié)構(gòu)體
參數(shù):指向溫濕度事件結(jié)構(gòu)體的指針
返回值:成功返回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;
}
功能:計(jì)算CRC8校驗(yàn)碼
參數(shù):數(shù)據(jù)指針和長(zhǎng)度
返回值:CRC8校驗(yàn)值
3.2.2Adafruit_Sensor庫(kù)
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;
}
功能:填充溫度事件結(jié)構(gòu)體
參數(shù):
temp:目標(biāo)結(jié)構(gòu)體指針
timestamp:時(shí)間戳
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;
}
功能:填充濕度事件結(jié)構(gòu)體
參數(shù):
humidity:目標(biāo)結(jié)構(gòu)體指針
timestamp:時(shí)間戳
3.2.3Adafruit_I2CDevice庫(kù)
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操作(常用模式)
參數(shù):
write_buffer:寫入數(shù)據(jù)緩沖區(qū)
write_len:寫入數(shù)據(jù)長(zhǎng)度
read_buffer:讀取數(shù)據(jù)緩沖區(qū)
read_len:讀取數(shù)據(jù)長(zhǎng)度
stop:是否在寫操作后發(fā)送停止條件
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設(shè)備讀取數(shù)據(jù)
參數(shù):
buffer:數(shù)據(jù)緩沖區(qū)
len:讀取長(zhǎng)度
stop:是否發(fā)送停止條件
四、常見問題解答
Q1:編譯時(shí)報(bào)錯(cuò)"Adafruit_SHT4x.h: No such file or directory"
A:解決方法
檢查是否安裝了依賴庫(kù)(Adafruit BusIO)
Q2:傳感器檢測(cè)失?。?Couldn't find SHT4x")
A:排查步驟
檢查硬件連接(VCC、GND、SCL、SDA)
確認(rèn)I2C地址正確(SHT41默認(rèn)為0x44)
使用I2C掃描工具確認(rèn)設(shè)備地址
檢查上拉電阻(4.7kΩ)
Q3:數(shù)據(jù)讀取不穩(wěn)定或CRC校驗(yàn)失敗
A:解決方案
降低I2C時(shí)鐘速度
縮短I2C總線長(zhǎng)度
嘗試不同的精度模式
Q4:如何提高測(cè)量精度?
A:優(yōu)化方法
使用高精度模式:sht4.setPrecision(SHT4X_HIGH_PRECISION)
啟用加熱器:sht4.setHeater(SHT4X_MED_HEATER_100MS)
避免傳感器暴露在氣流中
五、結(jié)果顯示
成功運(yùn)行后,串口監(jiān)視器將輸出以下格式的數(shù)據(jù):

資源鏈接
SHT41數(shù)據(jù)手冊(cè)
STM32F407VET6參考手冊(cè)
Adafruit SHT4x庫(kù)GitHub
通過本教程,開發(fā)者可以快速構(gòu)建穩(wěn)定可靠的環(huán)境監(jiān)測(cè)系統(tǒng),點(diǎn)擊了解更多零知開發(fā)教程:
https://www.lingzhilab.com/freesources.html
審核編輯 黃宇
-
I2C
+關(guān)注
關(guān)注
28文章
1543瀏覽量
130263 -
溫濕度傳感器
+關(guān)注
關(guān)注
6文章
618瀏覽量
37260 -
STM32F4
+關(guān)注
關(guān)注
3文章
204瀏覽量
29745
發(fā)布評(píng)論請(qǐng)先 登錄
SHT3x系列溫濕度傳感器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
SHT1x系列溫濕度傳感器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
STM32F407VET6和STM32F407IET6有什么區(qū)別?
零知開源——STM32F407VET6驅(qū)動(dòng)SHT41溫濕度傳感器完整教程
sht10溫濕度傳感器驅(qū)動(dòng)
零知開源分享-溫濕度模塊DHT11的使用
基于SHT11溫濕度傳感器和單片機(jī)技術(shù)的智能溫濕度測(cè)量系統(tǒng)
SHT10溫濕度傳感器是如何進(jìn)行通信的
溫濕度傳感器如何驅(qū)動(dòng)SHT85單片機(jī)STM32 HAL庫(kù)?
DHT22+數(shù)字溫濕度傳感器+AM2302+溫濕度模塊+取代SHT11+SHT15
基于STM32F407VET6的CS1237驅(qū)動(dòng)程序
stm32f407vet6原理介紹
零知開源——基于STM32F407VET6零知增強(qiáng)板的四路獨(dú)立計(jì)時(shí)器

零知開源——STM32F407VET6驅(qū)動(dòng)SHT41溫濕度傳感器完整教程
評(píng)論