聚豐項目 > 觸摸型環(huán)境狀態(tài)波形顯示記錄儀
通常的環(huán)境狀態(tài)裝置,多是只顯示檢測的數(shù)值卻并不提供波形顯示及數(shù)據(jù)記錄功能,本作品便是彌補這方面的不足。該作品以CH32V103為處理核心,通過數(shù)字式傳感器來獲取環(huán)境的溫度、濕度、光照強度、大氣壓等,轉(zhuǎn)換器與模擬量傳感器的配合可檢測土壤濕度等狀態(tài),只是所用的傳感器存在差異而已,在結(jié)構(gòu)上不存在其他方面的變化。為了便于標(biāo)記檢測的時間點,所用的是片內(nèi)的RTC計時器。為了突出該作品的波形顯示性能,故所用的顯示器件為7寸觸摸型串口顯示屏。此外,為記錄檢測數(shù)據(jù),所采集的數(shù)據(jù)是以文件的形式存放到U盤內(nèi)。作品所用的計時器為片內(nèi)的RTC,并輔助數(shù)據(jù)的記錄。 在串口的使用方面,除了控制串口屏更新顯示外,還可控制MP3語音模塊來播報系統(tǒng)的工作狀態(tài)。
jennyzhaojie

jennyzhaojie
團隊成員
jennyzhaojie 工程師

圖1 結(jié)構(gòu)框圖
該作品在硬件方面主要由6個部分組成,其涉及數(shù)據(jù)的采集、顯示、波形繪制、設(shè)置、傳輸及記錄等,其具體內(nèi)容如下:
1)串口觸摸屏
作品所選用的顯示屏是一款TJC8048X370_011R,其顯示分辨率為800*480像素,屬電阻式觸摸屏。

圖2 串口觸摸屏
2)溫濕度傳感器
進行溫濕度檢測的傳感器為DHT22,它較之DHT11其精度更高、檢測范圍更寬。該器件是單總線器件,故對時序的要求比較高,它所連接的引腳為PA4。
3)光強傳感器
BH1750是一種數(shù)字式的光照強度傳感器,該傳感器以I2C的方式工作 。
其引腳連接關(guān)系為:
SCL ---PA0
SDA ---PA1
4)氣壓傳感器
BMP085是一種數(shù)字式的溫度與大氣壓強傳感器,該傳感器以I2C的方式工作。
其引腳連接關(guān)系為:
SCL ---PA6
SDA ---PA7
5)MP3播放模塊
MP3播放模塊是一款即可以串口控制,也可用按鍵控制的器件,作品中是以它來播報系統(tǒng)所處的工作模式。
其引腳連接關(guān)系為:
RX ---PB10

圖3 MP3播放模塊
6) U盤接口
其引腳連接關(guān)系為:
UD+ ---- PA12
UD- ---- PA11
在硬件設(shè)計的基礎(chǔ)上,該項目的軟件部分主要涉及各功能模塊的函數(shù)設(shè)計。
軟件的處理流程為:

處理流程圖
1)溫濕度檢測
對溫濕度檢測是以GPIO口模擬單總線的方式來進行的,并以函數(shù)庫的方式來使用。
DHT22.h的內(nèi)容為:
#ifndef __DHT22_H
#define __DHT22_H
// IO方向設(shè)置
#define DHT22_IO_IN() {GPIOA->CFGLR&=0XFFFF0FFF;GPIOA->CFGLR|=8<<16;}
#define DHT22_IO_OUT() {GPIOA->CFGLR&=0XFFFF0FFF;GPIOA->CFGLR|=3<<16;}
// IO操作函數(shù)
#define DHT22_DQ_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) // 數(shù)據(jù)端口 PA4
u8 DHT22_Init(void); // 初始化DHT22
u8 DHT22_Read_Data(u16 *temp,u16 *humi); // 讀取溫濕度
u8 DHT22_Read_Byte(void); // 讀出一個字節(jié)
u8 DHT22_Read_Bit(void); // 讀出一個位
u8 DHT22_Check(void); // 檢測是否存在DHT22
void DHT22_Rst(void); // 復(fù)位DHT22
#endifDHT22讀取數(shù)據(jù)的程序為:
// temp:溫度值(范圍:0~50°)
// humi:濕度值(范圍:20%~90%)
// 返回值:0,正常;1,讀取失敗
u8 DHT22_Read_Data(u16 *temp,u16 *humi)
{
u8 buf[5];
u8 i;
DHT22_Rst();
if(DHT22_Check()==0)
{
for(i=0;i<5;i++) // 讀取40位數(shù)據(jù)
{
buf[i]=DHT22_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0]*256+buf[1];
*temp=buf[2]*256+buf[3];
}
}
else
return 1;
return 0;
}實現(xiàn)溫濕度顯示的程序為:
if(DHT22_Init())
{
OLED_ShowString(0,0,"DHT22 NO!",16);
Delay_Ms(10);
}
else
{
OLED_ShowString(0,0,"DHT22 OK!",16);
OLED_ShowString(0,2,"T= . C H= . %",16);
while(1)
{
if(t%100==0) // 每100ms讀取一次
{
DHT22_Read_Data(&temperature,&humidity); //讀取溫濕度值
OLED_ShowNum(16,2,temperature/10,2,16);
OLED_ShowNum(80,2,humidity/10,2,16);
OLED_ShowNum(40,2,temperature%10,1,16);
OLED_ShowNum(104,2,humidity%10,1,16);
}
Delay_Ms(100);
t++;
}
}DHT22測試效果如圖4所示:

圖4 溫度檢測
2)光強檢測
測試光強檢測與顯示的程序為:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
Init_config();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH32V103 TEST",16);
OLED_ShowString(0,2,"OLED & BH1750",16);
BH1750_Init();
Delay_Ms(2000);
OLED_Clear();
OLED_ShowString(0,0,"Sunlight:(lx)",16);
while(1)
{
Get_Sunlight_Value();
Delay_Ms(500);
}
}BH1750測試的效果如圖5所示:

圖5 BH1750測試效果
3)氣壓檢測
測試氣壓檢測與顯示的程序為:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
Init_config();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH32V103 TEST",16);
OLED_ShowString(0,2,"OLED & BMP085",16);
BMP085_Init();
Init_BMP085();
Delay_Ms(2000);
OLED_Clear();
OLED_ShowString(0,0,"t= C",16);
OLED_ShowString(0,2,"p= KPa",16);
while(1)
{
bmp085Convert();
OLED_ShowNum(24,0,temperature/10,3,16);
OLED_ShowNum(24,2,pressure/100,5,16);
Delay_Ms(500);
}
}BMP085測試的效果如圖6所示:

圖6 BMP085測試效果
4)RTC計時
使用RTC進行計時的測試程序為:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
RTC_Init();
Init_config();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"CH32V103 TEST",16);
OLED_ShowString(0,2,"OLED & RTC",16);
Delay_Ms(2000);
OLED_Clear();
OLED_ShowString(10,0,"RTC TEST",16);
OLED_ShowString(10,2," : :",16);
while(1)
{
RTC_Get();
OLED_ShowNum(10,2,calendar.hour,2,16);
OLED_ShowNum(40,2,calendar.min,2,16);
OLED_ShowNum(70,2,calendar.sec,2,16);
Delay_Ms(1000);
}
}RTC計時效果如圖7所示:

圖7 RTC計時效果
5)MP3播放控制
生成按音樂文件順序播放指令的函數(shù)為:
void playn(uint16_t index)
{
int i;
uint8_t checksum = 0;
cmd3[5] = (uint8_t)(index >> 8);
cmd3[6] = (uint8_t)(index);
for (i=2; i<8; i++)
{
checksum += cmd3[i];
}
cmd3[8] = (uint8_t)~checksum;
}以播放第2個語音文件為例,其程序為:
playn(2);
for(i=0;i<10;i++)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, cmd3[i]);
}
6)界面設(shè)計
串口觸摸屏的界面設(shè)計采用工具軟件USART HMI,主界面的設(shè)計如圖8所示。此外,為進行參數(shù)的設(shè)置還設(shè)計了設(shè)置界面,見圖9所示。

圖8主界面設(shè)計

圖9 設(shè)置界面設(shè)計
(0.85 MB)下載