聚豐項(xiàng)目 > 多功能環(huán)境狀態(tài)檢測記錄儀
環(huán)境是我們重要的生存條件,因而對它的了解也就是一件十分必要的事情。該作品以AB32VG1為處理核心,通過數(shù)字式傳感器的配合來獲取環(huán)境的溫度、光照強(qiáng)度、大氣壓等,除外通過A/D轉(zhuǎn)換器與模擬量傳感器的配合可檢測土壤濕度等狀態(tài),只是所用的傳感器存在差異而已,在結(jié)構(gòu)上不存在其他方面的變化。
jinglixixi
分享jinglixixi
團(tuán)隊(duì)成員
李靜 實(shí)驗(yàn)師
該作品在硬件方面以AB32VG1為處理核心,并配以相應(yīng)的功能模塊來實(shí)現(xiàn)設(shè)計(jì)要求,所涉及到的內(nèi)容包括數(shù)據(jù)的采集、檢測、顯示、設(shè)置、傳輸及記錄等。
為了便于標(biāo)記檢測的時(shí)間點(diǎn),所用的是片內(nèi)的RTC計(jì)時(shí)器。為了體現(xiàn)檢測儀器的便攜式特點(diǎn),所用的顯示器件為0.96寸的彩色OLED屏,并實(shí)現(xiàn)圖標(biāo)化的界面顯示。作為一個(gè)數(shù)據(jù)記錄儀,其采集的數(shù)據(jù)是以文件的形式存放到TF卡中,以便于數(shù)據(jù)的提取和交換。為了便于對RTC計(jì)時(shí)器進(jìn)行時(shí)間的設(shè)置和校正,是以板載的紅外接收器與外部的紅外遙控器相配合來完成數(shù)值的輸入。
此外,為了更廣泛地突出數(shù)據(jù)共享的性能,該作品可利用串口為數(shù)據(jù)傳送的中介,以支持3種形式的應(yīng)用,即:借助無線透傳模塊以進(jìn)行數(shù)據(jù)的無線傳輸;與串口觸摸屏相連接以實(shí)現(xiàn)數(shù)據(jù)及波形的實(shí)時(shí)刷新;通過對數(shù)據(jù)進(jìn)行協(xié)議的封裝,可上傳到電腦以實(shí)現(xiàn)界面的控件驅(qū)動顯示,如指針式表盤、刻度計(jì)及進(jìn)度球等顯示形式。另外,還可控制MP3語音模塊來播報(bào)當(dāng)前的功能處理等。
圖1 功能框圖
1.器件引腳分配
1)OLED顯示屏
該作品所選用的顯示屏是一款0.96寸的彩色OLED屏,它以SPI接口的方式來工作。驅(qū)動該顯示屏有2種方式,一種是采用硬件的方式,另一種則是以軟件的方式,這里上用的是軟件的方式。該顯示屏的顯示分辨率為80*160像素,在顯示數(shù)據(jù)的同時(shí)也能夠相應(yīng)的圖標(biāo)來美化界面。
圖2 OLED顯示屏
該顯示屏與開發(fā)板的連接關(guān)系為:
SCL--- PE3
SDA--- PE2
RES--- PA0
DC --- PA2
CS --- PA1
BLK--- PE4
所使用的引腳由Arduino擴(kuò)展接口引出,見圖3所示。
圖3 所用 Arduino接口
2)TF卡
所用的TF卡接口是開發(fā)板自身所配備的,其接口如圖4所示。
圖4 TF卡接口
該接口所占用的引腳資源為:
SD_CMD--- PB0
SD_CLK--- PB1
SD_DAT--- PB2
SD_DET--- PE5
在作品中主要是通過在讀取圖片數(shù)據(jù)來繪制圖案,從而可以有效地減少對程序存儲空間的消耗;在存儲方面,則是通過TF卡將檢測數(shù)據(jù)寫入文件中進(jìn)行保存,其形式如圖5所示。
圖5文件格式
3)IR接收
為減少引腳的占用,設(shè)置數(shù)據(jù)是以紅外遙控器的方式,板載的IR接收器接口如圖6所示,其占用的引腳為PE6,需短接來使用。
圖6 紅外接收接口
該接收器同遙控器相配合,可完成RTC校時(shí)處理及功能切換。
4)數(shù)字式傳感器
為進(jìn)行環(huán)境檢測,所有的數(shù)字式傳感器為光強(qiáng)傳感器BH1750和溫度氣壓傳感器BMP085,這2個(gè)器件均以I2C接口的方式工作。
這2個(gè)傳感器所占用的引腳為:
BH1750:
SCK--- PA6
SIN--- PE7
BMP085:
SCL--- PF0
SDA--- PE0
5)串口顯示屏
TOPWAY智能TFT顯示模塊是一款可通過串口和RJ45網(wǎng)口控制的電容觸摸屏,其顯示分辨率為1024x600,通過串口可使其顯示檢測值并繪制出波形曲線。
6)MP3語音播放模塊
MP3音頻模塊是一種可以串口進(jìn)行控制的器件,用該模塊可提高語音播放的并行性。
圖7 MP3引腳功能
7)串行通訊
板上可供數(shù)據(jù)傳送的串口為UART1,其引腳功能為:
TX1--- PA4
RX1--- PA3
8)A/D轉(zhuǎn)換及傳感器
板上可直接使用A/D轉(zhuǎn)換的引腳為ADC0所對應(yīng)的PA5,用它連接外部的模擬量傳感器以檢測外部環(huán)境的狀態(tài),如土壤濕度、所含的氣體和氣味等。
圖8土壤濕度傳感器
圖9土壤濕度傳感器、MP3語音模塊及紅外遙控器的使用
圖10 智能顯示模塊的使用
軟件的程序處理流程為:
圖11處理流程
圖12功能狀態(tài)切換流程
圖13 RTC設(shè)置與校時(shí)流程圖
圍繞著硬件的設(shè)計(jì),在軟件方面也配以相應(yīng)的函數(shù)來實(shí)現(xiàn)對應(yīng)的功能。
1)OLED 屏顯示
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color) { u8 temp; u8 pos,t; u16 x0=x; if(x>LCD_W-16||y>LCD_H-16) return; num=num-' '; LCD_Address_Set(x,y,x+8-1,y+16-1); if(!mode) { for(pos=0;pos<16;pos++) { temp=asc2_1608[(u16)num*16+pos]; for(t=0;t<8;t++) { if(temp&0x01)LCD_WR_DATA(color); else LCD_WR_DATA(BACK_COLOR); temp>>=1; x++; } x=x0; y++; } } else { for(pos=0;pos<16;pos++) { temp=asc2_1608[(u16)num*16+pos]; for(t=0;t<8;t++) { if(temp&0x01)LCD_DrawPoint(x+t,y+pos,color); temp>>=1; } } } } void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color) { while(*p!='\0') { if(x>LCD_W-16){x=0;y+=16;} if(y>LCD_H-16){y=x=0;LCD_Clear(RED);} LCD_ShowChar(x,y,*p,0,color); x+=8; p++; } }
為顯示漢字,需提取相應(yīng)的字模,作品所用的字模由工具軟件PCtoLCD2002提取。
為顯示圖片,所用的圖片制備工具為Image2Lcd。
2)RTC計(jì)時(shí)
使用片內(nèi)RTC顯示計(jì)時(shí)值得格式為:
Sun Sep 12 21:24:36 2021
為便于觀察,實(shí)現(xiàn)RTC電子時(shí)鐘顯示效果的程序?yàn)椋?/span>
void LCD_ShowStringk(u16 x,u16 y,const u8 *p,u16 color) { int j=0; x=84; y=56; while(j<24) { if(j==4) { y=20; x=84; } if(j==11) { y=40; x=84; } if(j==20) { y=4; x=84; } LCD_ShowChar(x,y,*p,0,color); x+=8; p++; j++; } }
3)紅外遙控
在使用電視遙控器的情況下,以遙控器設(shè)置RTC的程序?yàn)椋?/span>
LCD_ShowString(4,4,"2000-00-00",WHITE); i=0; f=0; while(f<3) { test_irda(); if(cs<11) { if(cs==0x0a) { LCD_ShowString(20,60,"OK",YELLOW); if(f==0) yy=2000+i; if(f==1) mm=i; if(f==2) dd=i; i=0; f++; } else { i=(i%10)*10+cs; LCD_ShowNum(20+f*24,4,i,2,WHITE); LCD_ShowString(20,60," ",YELLOW); } cs=12; rt_thread_mdelay(100); } } ret = set_date(yy, mm, dd);
4)數(shù)字式傳感器檢測
讀取光照強(qiáng)度檢測值的函數(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; }
5)模擬量采集
實(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; }
6)TF卡讀寫
當(dāng)前TF卡的圖片文件,實(shí)現(xiàn)圖片再現(xiàn)的顯示函數(shù)為:
void LCD_Picturea(void) { int i; LCD_Address_Set(0,0,79,79); for(i=0;i<6400;i++) { LCD_WR_DATA8(gImage_cgq[i*2]); LCD_WR_DATA8(gImage_cgq[i*2+1]); } }
7)串口通訊
在串口通信方面所用的是UART1,其接口如圖14所示。
圖14 串口引腳
通過對數(shù)據(jù)的協(xié)議封裝,可驅(qū)動MicroLab界面內(nèi)的控件。
圖15 驅(qū)動控件
實(shí)現(xiàn)控件驅(qū)動的程序?yàn)椋?/span>
while(1) { xy(1,0,75); //濕度 rt_thread_mdelay(50); x=vol*100/33; xy(2,0,80); //電壓 rt_thread_mdelay(50); x=temperature/10; xy(0,0,x); //溫度 rt_thread_mdelay(50); x=82; xy(0,1,x); //濕度 rt_thread_mdelay(50); x=sd; xy(3,0,x); //光強(qiáng) rt_thread_mdelay(1000); x=pressure/100; xy(3,1,x); //氣壓 rt_thread_mdelay(1000); Get_Sunlight_Value(0); value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); vol = value * REFER_VOLTAGE /CONVERT_BITS; bmp085Convert(); }
另外,使用串口可控制MP3語音模塊對當(dāng)前所執(zhí)行的功能進(jìn)行語音提示。
此外,還可利用串口來控制智能顯示模塊來顯示檢測值及漢字?jǐn)?shù)據(jù)波形。
圖16 智能顯示模塊界面
圖17 智能顯示模塊控制
圖18主界面
圖19 RTC校時(shí)
圖20 電子時(shí)鐘
圖21 環(huán)境檢測
圖22 模擬量檢測
圖23 數(shù)據(jù)記錄
圖24 串口屏數(shù)據(jù)傳輸
圖25 語音提示
圖26 無線數(shù)據(jù)透傳
視頻:
(10.36 MB)下載