聚丰项目 > 多功能环境状态检测记录仪
环境是我们重要的生存条件,因而对它的了解也就是一件十分必要的事情。该作品以AB32VG1为处理核心,通过数字式传感器的配合来获取环境的温度、光照强度、大气压等,除外通过A/D转换器与模拟量传感器的配合可检测土壤湿度等状态,只是所用的传感器存在差异而已,在结构上不存在其他方面的变化。
jinglixixi
分享jinglixixi
团队成员
李静 实验师
该作品在硬件方面以AB32VG1为处理核心,并配以相应的功能模块来实现设计要求,所涉及到的内容包括数据的采集、检测、显示、设置、传输及记录等。
为了便于标记检测的时间点,所用的是片内的RTC计时器。为了体现检测仪器的便携式特点,所用的显示器件为0.96寸的彩色OLED屏,并实现图标化的界面显示。作为一个数据记录仪,其采集的数据是以文件的形式存放到TF卡中,以便于数据的提取和交换。为了便于对RTC计时器进行时间的设置和校正,是以板载的红外接收器与外部的红外遥控器相配合来完成数值的输入。
此外,为了更广泛地突出数据共享的性能,该作品可利用串口为数据传送的中介,以支持3种形式的应用,即:借助无线透传模块以进行数据的无线传输;与串口触摸屏相连接以实现数据及波形的实时刷新;通过对数据进行协议的封装,可上传到电脑以实现界面的控件驱动显示,如指针式表盘、刻度计及进度球等显示形式。另外,还可控制MP3语音模块来播报当前的功能处理等。
图1 功能框图
1.器件引脚分配
1)OLED显示屏
该作品所选用的显示屏是一款0.96寸的彩色OLED屏,它以SPI接口的方式来工作。驱动该显示屏有2种方式,一种是采用硬件的方式,另一种则是以软件的方式,这里上用的是软件的方式。该显示屏的显示分辨率为80*160像素,在显示数据的同时也能够相应的图标来美化界面。
图2 OLED显示屏
该显示屏与开发板的连接关系为:
SCL--- PE3
SDA--- PE2
RES--- PA0
DC --- PA2
CS --- PA1
BLK--- PE4
所使用的引脚由Arduino扩展接口引出,见图3所示。
图3 所用 Arduino接口
2)TF卡
所用的TF卡接口是开发板自身所配备的,其接口如图4所示。
图4 TF卡接口
该接口所占用的引脚资源为:
SD_CMD--- PB0
SD_CLK--- PB1
SD_DAT--- PB2
SD_DET--- PE5
在作品中主要是通过在读取图片数据来绘制图案,从而可以有效地减少对程序存储空间的消耗;在存储方面,则是通过TF卡将检测数据写入文件中进行保存,其形式如图5所示。
图5文件格式
3)IR接收
为减少引脚的占用,设置数据是以红外遥控器的方式,板载的IR接收器接口如图6所示,其占用的引脚为PE6,需短接来使用。
图6 红外接收接口
该接收器同遥控器相配合,可完成RTC校时处理及功能切换。
4)数字式传感器
为进行环境检测,所有的数字式传感器为光强传感器BH1750和温度气压传感器BMP085,这2个器件均以I2C接口的方式工作。
这2个传感器所占用的引脚为:
BH1750:
SCK--- PA6
SIN--- PE7
BMP085:
SCL--- PF0
SDA--- PE0
5)串口显示屏
TOPWAY智能TFT显示模块是一款可通过串口和RJ45网口控制的电容触摸屏,其显示分辨率为1024x600,通过串口可使其显示检测值并绘制出波形曲线。
6)MP3语音播放模块
MP3音频模块是一种可以串口进行控制的器件,用该模块可提高语音播放的并行性。
图7 MP3引脚功能
7)串行通讯
板上可供数据传送的串口为UART1,其引脚功能为:
TX1--- PA4
RX1--- PA3
8)A/D转换及传感器
板上可直接使用A/D转换的引脚为ADC0所对应的PA5,用它连接外部的模拟量传感器以检测外部环境的状态,如土壤湿度、所含的气体和气味等。
图8土壤湿度传感器
图9土壤湿度传感器、MP3语音模块及红外遥控器的使用
图10 智能显示模块的使用
软件的程序处理流程为:
图11处理流程
图12功能状态切换流程
图13 RTC设置与校时流程图
围绕着硬件的设计,在软件方面也配以相应的函数来实现对应的功能。
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++; } }
为显示汉字,需提取相应的字模,作品所用的字模由工具软件PCtoLCD2002提取。
为显示图片,所用的图片制备工具为Image2Lcd。
2)RTC计时
使用片内RTC显示计时值得格式为:
Sun Sep 12 21:24:36 2021
为便于观察,实现RTC电子时钟显示效果的程序为:
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)红外遥控
在使用电视遥控器的情况下,以遥控器设置RTC的程序为:
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)数字式传感器检测
读取光照强度检测值的函数为:
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; }
5)模拟量采集
实现模拟量采集的程序为:
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卡读写
当前TF卡的图片文件,实现图片再现的显示函数为:
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 串口引脚
通过对数据的协议封装,可驱动MicroLab界面内的控件。
图15 驱动控件
实现控件驱动的程序为:
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); //光强 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语音模块对当前所执行的功能进行语音提示。
此外,还可利用串口来控制智能显示模块来显示检测值及汉字数据波形。
图16 智能显示模块界面
图17 智能显示模块控制
图18主界面
图19 RTC校时
图20 电子时钟
图21 环境检测
图22 模拟量检测
图23 数据记录
图24 串口屏数据传输
图25 语音提示
图26 无线数据透传
视频:
(10.36 MB)下载