聚豐項目 > 基于CH32V103R 開發板的室內環境檢測
室內環境是我們與我們息息相關,因而對它的了解也就是一件十分必要的事情。并通過數據搭配物聯網家居來實時調節我們的生活環境,該作品以CH32V103R為處理核心,通過數字式傳感器的配合來獲取環境的溫度、光照強度、大氣壓等,除外通過A/D轉換器與模擬量傳感器的配合可檢測土壤濕度等狀態,只是所用的傳感器存在差異而已,在結構上不存在其他方面的變化。為了便于標記檢測的時間點,所用的是片內的RTC計時器。為了體現檢測儀器的便攜式特點,該作品可利用串口為數據傳送的中介,以支持2種形式的應用,即:借助無線透傳模塊以進行數據的無線傳輸;通過對數據進行協議的封裝,可上傳到電腦以實現界面的控件驅動顯示,如指針式表盤、刻度計及進度球等顯示形式。另外,還可控制MP3語音模塊來播報當前的功能處理等。
jf_40123188
分享jf_40123188
團隊成員
jf_40123188 工程師
CH32V103R開發板,作為整個系統的主控,其多線程,速度快,在物聯網的應用中具有得天獨厚的優勢。
MG995舵機,用于模擬窗簾的閉合。
esp8266(esp01s),作為wifi模塊,主要用于mqtt服務,是物聯網不可或缺的一環。
紅外傳感器,用于感受光照,當檢測到光照時,舵機將自動閉合(拉上窗簾)。
dht11,溫度濕度傳感器,用于獲取溫度和濕度。
繼電器,用于連接220v用電器的開關。
軟件部分使用了雙線程作為整個系統的架構
第一個線程為整個系統的主要部分,包括了mqtt的連接,訂閱,以及處理微信小程序發送的信息。
第二個線程為單片機向微信小程序發送信息的部分,定時獲取dht11的溫度濕度,并且把這些數據發送到微信小程序端。
數字式傳感器
為進行環境檢測,所有的數字式傳感器為光強傳感器BH1750和溫度氣壓傳感器BMP085,這2個器件均以I2C接口的方式工作。
這2個傳感器所占用的引腳為:
BH1750:
SCK--- PA6
SIN--- PB7
BMP085:
SCL--- PF0
SDA--- PB0
串行通訊
板上可供數據傳送的串口為UART1,其引腳功能為:
TX1--- PA4
RX1--- PA3
A/D轉換及傳感器
板上可直接使用A/D轉換的引腳為ADC0所對應的PA5,用它連接外部的模擬量傳感器以檢測外部環境的狀態,如土壤濕度、所含的氣體和氣味等。
數字式傳感器檢測
讀取光照強度檢測值的函數為:
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); }
讀取溫度與氣壓的函數為:
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; }
模擬量采集
實現模擬量采集的程序為:
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; }