溫濕度計
實驗介紹
本章主要介紹溫濕度計的實現(xiàn),本產(chǎn)品板載了溫濕度傳感器SI7006。該傳感器不但能測量溫度,還能測量相對濕度。本章我們將向大家介紹如何使用haas1000來讀取SI7006數(shù)字溫濕度傳感器,從而得到環(huán)境溫度和相對濕度等信息,并把從溫濕度值顯示在OLED模塊上。 開始學(xué)習(xí)之前我們先看一下顯示效果,如下圖所示:
涉及知識點
I2C通信原理
SI7006光照與接近傳感器原理
OLED繪圖
開發(fā)環(huán)境準(zhǔn)備
硬件
開發(fā)用電腦一臺
HAAS EDU K1 開發(fā)板一塊
USB2TypeC 數(shù)據(jù)線一根
軟件
開發(fā)環(huán)境的搭建請參考《AliOS Things集成開發(fā)環(huán)境使用說明之搭建開發(fā)環(huán)境》,其中詳細(xì)的介紹了AliOS Things 3.3的IDE集成開發(fā)環(huán)境的搭建流程。
本案例的代碼下載請參考《AliOS Things集成開發(fā)環(huán)境使用說明之創(chuàng)建工程》,
> 選擇解決方案:“HaaS EDU K1教育開發(fā)案例合集”
> 選擇開發(fā)板:haaseduk1 board configure
-- 編譯固件可參考《AliOS Things集成開發(fā)環(huán)境使用說明之編譯固件》。
-- 燒錄固件可參考《AliOS Things集成開發(fā)環(huán)境使用說明之燒錄固件》。
I2C通信原理
IIC總線是一種最早由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。它是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成的串行總線,可發(fā)送和接收數(shù)據(jù)。在CPU與被控IC之間、IC與IC之間進行雙向傳送,高速IIC總線一般可達400kbps以上。 I2C總線在傳送數(shù)據(jù)過程中共有三種類型信號, 它們分別是:開始信號、結(jié)束信號和應(yīng)答信號。 開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。 結(jié)束信號:SCL為高電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。 應(yīng)答信號:接收數(shù)據(jù)的IC在接收到8bit數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。CPU向受控單元發(fā)出一個信號后,等待受控單元發(fā)出一個應(yīng)答信號,CPU接收到應(yīng)答信號后,根據(jù)實際情況作出是否繼續(xù)傳遞信號的判斷。若未收到應(yīng)答信號,由判斷為受控單元出現(xiàn)故障。 波形如下圖:
SI7006傳感器簡介
SI7006 是Silicon Lab公司推出的一款相對濕度及溫度傳感器,其結(jié)合了工廠校準(zhǔn)濕度和溫度傳感器元件、模擬-數(shù)字轉(zhuǎn)換器,信號處理和一個I2C主機接口。使用業(yè)界標(biāo)準(zhǔn)低K電介質(zhì)聚合物提供了出色的精度和長期穩(wěn)定性,同時具有低漂移和低滯后。同時其創(chuàng)新的CMOS設(shè)計還使其具備很低的功耗。 特征:
相對濕度傳感器:
±5%RH(最大)@ 0-80%RH的
溫度傳感器:
±1.0℃的精確度(最大)@ -10至+ 85°C
0至100%RH的工作范圍內(nèi)
可達-40至+125°C的工作范圍
工作電壓范圍寬(1.9?3.6V)
低功耗:2.2μW平均功率為3.3V和每秒1個樣本
I2C主機接口
片上集成加熱器
采用3mm x 3mm QFN封裝
卓越的長期穩(wěn)定性
支持工廠校準(zhǔn)
在回流和運行壽命的保護
防止污染的灰塵,污垢,日用化工和其它液體
應(yīng)用:
資產(chǎn)和貨物跟蹤
汽車氣候控制和去霧
嬰兒監(jiān)視器
持續(xù)氣道正壓通氣(CPAP)機
洪水和水檢測
煤氣,火災(zāi)和煙霧探測器
手機/智能手機
工業(yè)HVAC / R
筆記本電腦/平板電腦
激光打印機
微環(huán)境/數(shù)據(jù)中心
PLC和IO模塊
遠(yuǎn)程遙測裝置
平板電腦
測試和測量
恒溫/恒濕
通風(fēng)和空調(diào)系統(tǒng)
氣象站
風(fēng)力發(fā)電逆變器
擋風(fēng)玻璃和后視鏡系統(tǒng)
無線基站
無線傳感器網(wǎng)絡(luò)
OLED繪圖
參考上一章節(jié)。
軟硬件環(huán)境準(zhǔn)備
硬件
1、開發(fā)用電腦一臺 2、HaaS EDU K1開發(fā)板一個 (開發(fā)板內(nèi)置SI7006傳感器) 3、USB Type-C 數(shù)據(jù)線一根
硬件設(shè)計
在本實驗中,SI7006貼片在主板上,中間I2C與MCU通信,原理圖如下所示:
EDU SI7006部分原理圖
軟件設(shè)計
應(yīng)用代碼部分
文件路徑如下: solutions/eduk1_demo/k1_apps/humiture/humiture.c solutions/eduk1_demo/k1_apps/humiture/humiture.h
si7006_getTempHumidity(&hump, &temp);
sprintf(temp_str, "T:%5.1fC", temp);
sprintf(hump_str, "H:%5.1f%%", hump);
OLED_Icon_Draw(14, 4, &icon_thermometer_24_24, 0);
OLED_Icon_Draw(14, 36, &icon_hygrometer_24_24, 0);
OLED_Icon_Draw(2, 24, &icon_skip_left, 0);
OLED_Icon_Draw(122, 24, &icon_skip_right, 0);
OLED_Show_String(42, 8, temp_str, 16, 1);
OLED_Show_String(42, 40, hump_str, 16, 1);
OLED_Refresh_GRAM();
aos_msleep(500);
驅(qū)動部分
文件路徑如下: components/peripherals/sensor/drv/drv_temp_humi_si_si7006.c 驅(qū)動代碼整體主要分為三部分:
獲取產(chǎn)品ID
獲取溫度值
獲取濕度值
void si7006_getID(uint8_t *id_buf)
{
uint8_t reg[4] = {Si7006_READ_ID_LOW_0,Si7006_READ_ID_LOW_1,Si7006_READ_ID_HIGH_0,Si7006_READ_ID_HIGH_1};
hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, reg, 2, 1000);
aos_msleep(30);
hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, id_buf, 4, 1000);
hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®[2], 2, 1000);
aos_msleep(30);
hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, &id_buf[4], 4, 1000);
return;
}
bool si7006_getTemperature(float *temperature)
{
uint8_t reg = Si7006_MEAS_TEMP_NO_MASTER_MODE;
uint8_t read_data[2] = {0};
unsigned int value;
hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®, 1, 1000);
aos_msleep(30);
hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000);
value = (read_data[0] << 8) | read_data[1];
LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value);
// A temperature measurement will always return XXXXXX00 in the LSB field.
if (value & 0xFFFC)
{
*temperature = (175.72f * (float)value) / 65536.0f - 46.85f;
LOGI("APP", "temperature: %2f \n", *temperature);
}
else
{
LOGI("APP", "Error on temp\n");
return 1;
}
return 0;
}
/*
i2c – the i2c device
dev_addr – device address
mem_addr – mem address
mem_addr_size – mem address
data – i2c master send data
size – i2c master send data size
*/
bool si7006_getHumidity(float *humidity)
{
uint8_t reg = Si7006_MEAS_REL_HUMIDITY_NO_MASTER_MODE;
uint8_t read_data[3] = {0};
unsigned int value;
hal_i2c_master_send(&i2c_dev, i2c_dev.config.dev_addr, ®, 1, 1000);
aos_msleep(30);
hal_i2c_master_recv(&i2c_dev, i2c_dev.config.dev_addr, read_data, 2, 1000);
value = (read_data[0] << 8) | read_data[1];
LOGI("APP", "%0x -- %0x -->0x%x\n", read_data[0],read_data[1],value);
if (value & 0xFFFE)
{
*humidity = ((125.0f * (float)value ) / 65535.0f) - 6.0f;
LOGI("APP", "humidity: %f \n", *humidity);
}
else
{
LOGI("APP", "Error on humidity\n");
return 1;
}
return 0;
}
//get temp and humidity
void si7006_getTempHumidity(float *humidity, float *temperature)
{
si7006_getTemperature(temperature);
si7006_getHumidity(humidity);
}