聚丰项目 > 触摸型环境状态波形显示记录仪
通常的环境状态装置,多是只显示检测的数值却并不提供波形显示及数据记录功能,本作品便是弥补这方面的不足。该作品以CH32V103为处理核心,通过数字式传感器来获取环境的温度、湿度、光照强度、大气压等,转换器与模拟量传感器的配合可检测土壤湿度等状态,只是所用的传感器存在差异而已,在结构上不存在其他方面的变化。为了便于标记检测的时间点,所用的是片内的RTC计时器。为了突出该作品的波形显示性能,故所用的显示器件为7寸触摸型串口显示屏。此外,为记录检测数据,所采集的数据是以文件的形式存放到U盘内。作品所用的计时器为片内的RTC,并辅助数据的记录。 在串口的使用方面,除了控制串口屏更新显示外,还可控制MP3语音模块来播报系统的工作状态。
jennyzhaojie

jennyzhaojie
团队成员
jennyzhaojie 工程师

图1 结构框图
该作品在硬件方面主要由6个部分组成,其涉及数据的采集、显示、波形绘制、设置、传输及记录等,其具体内容如下:
1)串口触摸屏
作品所选用的显示屏是一款TJC8048X370_011R,其显示分辨率为800*480像素,属电阻式触摸屏。

图2 串口触摸屏
2)温湿度传感器
进行温湿度检测的传感器为DHT22,它较之DHT11其精度更高、检测范围更宽。该器件是单总线器件,故对时序的要求比较高,它所连接的引脚为PA4。
3)光强传感器
BH1750是一种数字式的光照强度传感器,该传感器以I2C的方式工作 。
其引脚连接关系为:
SCL ---PA0
SDA ---PA1
4)气压传感器
BMP085是一种数字式的温度与大气压强传感器,该传感器以I2C的方式工作。
其引脚连接关系为:
SCL ---PA6
SDA ---PA7
5)MP3播放模块
MP3播放模块是一款即可以串口控制,也可用按键控制的器件,作品中是以它来播报系统所处的工作模式。
其引脚连接关系为:
RX ---PB10

图3 MP3播放模块
6) U盘接口
其引脚连接关系为:
UD+ ---- PA12
UD- ---- PA11
在硬件设计的基础上,该项目的软件部分主要涉及各功能模块的函数设计。
软件的处理流程为:

处理流程图
1)温湿度检测
对温湿度检测是以GPIO口模拟单总线的方式来进行的,并以函数库的方式来使用。
DHT22.h的内容为:
#ifndef __DHT22_H
#define __DHT22_H
// IO方向设置
#define DHT22_IO_IN() {GPIOA->CFGLR&=0XFFFF0FFF;GPIOA->CFGLR|=8<<16;}
#define DHT22_IO_OUT() {GPIOA->CFGLR&=0XFFFF0FFF;GPIOA->CFGLR|=3<<16;}
// IO操作函数
#define DHT22_DQ_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) // 数据端口 PA4
u8 DHT22_Init(void); // 初始化DHT22
u8 DHT22_Read_Data(u16 *temp,u16 *humi); // 读取温湿度
u8 DHT22_Read_Byte(void); // 读出一个字节
u8 DHT22_Read_Bit(void); // 读出一个位
u8 DHT22_Check(void); // 检测是否存在DHT22
void DHT22_Rst(void); // 复位DHT22
#endifDHT22读取数据的程序为:
// 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位数据
{
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;
}实现温湿度显示的程序为:
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播放控制
生成按音乐文件顺序播放指令的函数为:
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)界面设计
串口触摸屏的界面设计采用工具软件USART HMI,主界面的设计如图8所示。此外,为进行参数的设置还设计了设置界面,见图9所示。

图8主界面设计

图9 设置界面设计
(0.85 MB)下载