聚豐項(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)下載