聚豐項(xiàng)目 > 基于CH32V103R 開(kāi)發(fā)板的室內(nèi)環(huán)境檢測(cè)
室內(nèi)環(huán)境是我們與我們息息相關(guān),因而對(duì)它的了解也就是一件十分必要的事情。并通過(guò)數(shù)據(jù)搭配物聯(lián)網(wǎng)家居來(lái)實(shí)時(shí)調(diào)節(jié)我們的生活環(huán)境,該作品以CH32V103R為處理核心,通過(guò)數(shù)字式傳感器的配合來(lái)獲取環(huán)境的溫度、光照強(qiáng)度、大氣壓等,除外通過(guò)A/D轉(zhuǎn)換器與模擬量傳感器的配合可檢測(cè)土壤濕度等狀態(tài),只是所用的傳感器存在差異而已,在結(jié)構(gòu)上不存在其他方面的變化。為了便于標(biāo)記檢測(cè)的時(shí)間點(diǎn),所用的是片內(nèi)的RTC計(jì)時(shí)器。為了體現(xiàn)檢測(cè)儀器的便攜式特點(diǎn),該作品可利用串口為數(shù)據(jù)傳送的中介,以支持2種形式的應(yīng)用,即:借助無(wú)線(xiàn)透?jìng)髂K以進(jìn)行數(shù)據(jù)的無(wú)線(xiàn)傳輸;通過(guò)對(duì)數(shù)據(jù)進(jìn)行協(xié)議的封裝,可上傳到電腦以實(shí)現(xiàn)界面的控件驅(qū)動(dòng)顯示,如指針式表盤(pán)、刻度計(jì)及進(jìn)度球等顯示形式。另外,還可控制MP3語(yǔ)音模塊來(lái)播報(bào)當(dāng)前的功能處理等。
jf_40123188
jf_40123188
團(tuán)隊(duì)成員
jf_40123188 工程師
CH32V103R開(kāi)發(fā)板,作為整個(gè)系統(tǒng)的主控,其多線(xiàn)程,速度快,在物聯(lián)網(wǎng)的應(yīng)用中具有得天獨(dú)厚的優(yōu)勢(shì)。
MG995舵機(jī),用于模擬窗簾的閉合。
esp8266(esp01s),作為wifi模塊,主要用于mqtt服務(wù),是物聯(lián)網(wǎng)不可或缺的一環(huán)。
紅外傳感器,用于感受光照,當(dāng)檢測(cè)到光照時(shí),舵機(jī)將自動(dòng)閉合(拉上窗簾)。
dht11,溫度濕度傳感器,用于獲取溫度和濕度。
繼電器,用于連接220v用電器的開(kāi)關(guān)。
軟件部分使用了雙線(xiàn)程作為整個(gè)系統(tǒng)的架構(gòu)
第一個(gè)線(xiàn)程為整個(gè)系統(tǒng)的主要部分,包括了mqtt的連接,訂閱,以及處理微信小程序發(fā)送的信息。
第二個(gè)線(xiàn)程為單片機(jī)向微信小程序發(fā)送信息的部分,定時(shí)獲取dht11的溫度濕度,并且把這些數(shù)據(jù)發(fā)送到微信小程序端。
數(shù)字式傳感器
為進(jìn)行環(huán)境檢測(cè),所有的數(shù)字式傳感器為光強(qiáng)傳感器BH1750和溫度氣壓傳感器BMP085,這2個(gè)器件均以I2C接口的方式工作。
這2個(gè)傳感器所占用的引腳為:
BH1750:
SCK--- PA6
SIN--- PB7
BMP085:
SCL--- PF0
SDA--- PB0
串行通訊
板上可供數(shù)據(jù)傳送的串口為UART1,其引腳功能為:
TX1--- PA4
RX1--- PA3
A/D轉(zhuǎn)換及傳感器
板上可直接使用A/D轉(zhuǎn)換的引腳為ADC0所對(duì)應(yīng)的PA5,用它連接外部的模擬量傳感器以檢測(cè)外部環(huán)境的狀態(tài),如土壤濕度、所含的氣體和氣味等。
數(shù)字式傳感器檢測(cè)
讀取光照強(qiáng)度檢測(cè)值的函數(shù)為:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
rt_thread_mdelay(180);
Multiple_Read_BH1750();
for(i=0;i<3;i++) dis_data=BUF[0];
dis_data=(dis_data <<8)+BUF[1];
temp=(float)dis_data/1.2;
sd=temp;
OLED_ShowString(0,2,"Sunlight= lx",16);
OLED_ShowNum(72,2,sd,5,16);
}讀取溫度與氣壓的函數(shù)為:
long bmp085ReadTemp(void)
{
BMP085_Start();
BMP085_Send_Byte(BMP085_SlaveAddress);
while(BMP085_Wait_Ack()){}
BMP085_Send_Byte(0xF4);
while(BMP085_Wait_Ack()){}
BMP085_Send_Byte(0x2E);
while(BMP085_Wait_Ack()){}
BMP085_Stop();
rt_thread_mdelay(10);
return (long) Multiple_read(0xF6);
}
long bmp085ReadPressure(void)
{
long pressure = 0;
BMP085_Start();
BMP085_Send_Byte(BMP085_SlaveAddress);
while(BMP085_Wait_Ack()){}
BMP085_Send_Byte(0xF4);
while(BMP085_Wait_Ack()){}
BMP085_Send_Byte(0x34);
while(BMP085_Wait_Ack()){}
BMP085_Stop();
rt_thread_mdelay(10);
pressure = Multiple_read(0xF6);
pressure&= 0x0000FFFF;
return pressure;
}模擬量采集
實(shí)現(xiàn)模擬量采集的程序?yàn)椋?/span>
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
if (adc_dev == RT_NULL)
{
while(1);
}
else{
ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
}
while(k==2)
{
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
LCD_ShowString(80,12, "value=",RED);
LCD_ShowNum(128,12,value,5,RED);
vol = value * REFER_VOLTAGE /CONVERT_BITS;
LCD_ShowString(80,32, "U = . V",RED);
LCD_ShowNum(104,32,vol/10,1,RED);
LCD_ShowNum(120,32,vol%10,1,RED);
rt_thread_mdelay(800);
if(rt_pin_read(S2)==PIN_LOW) k=3;
while(rt_pin_read(S2)==PIN_LOW);
test_irda();
if(cs==0x0b) k=3;
} 