聚丰项目 > 触摸型环境状态波形显示记录仪

触摸型环境状态波形显示记录仪

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

jennyzhaojie jennyzhaojie

分享
0 喜欢这个项目
团队介绍

jennyzhaojie jennyzhaojie

团队成员

jennyzhaojie 工程师

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

image.png

图1 结构框图


该作品在硬件方面主要由6个部分组成,其涉及数据的采集、显示、波形绘制、设置、传输及记录等,其具体内容如下:

1)串口触摸

作品所选用的显示屏是一款TJC8048X370_011R,其显示分辨率为800*480像素,属电阻式触摸屏。

image.png

图2 串口触摸


2)温湿度传感器

进行温湿度检测的传感器为DHT22,它较之DHT11其精度更高、检测范围更宽。该器件是单总线器件,故对时序的要求比较高,它所连接的引脚为PA4。


3)光强传感器

BH1750是一种数字式的光照强度传感器,该传感器以I2C的方式工作 。

其引脚连接关系为:

SCL ---PA0

SDA ---PA1


4)气压传感器

BMP085是一种数字式的温度与大气压强传感器,该传感器以I2C的方式工作。

其引脚连接关系为:

SCL ---PA6

SDA ---PA7


5)MP3播放模块

MP3播放模块是一款即可以串口控制,也可用按键控制的器件,作品中是以它来播报系统所处的工作模式。

其引脚连接关系为:

RX ---PB10  

image.png

图3 MP3播放模块


6) U盘接口

其引脚连接关系为:

UD+     ----   PA12

UD-      ----   PA11




软件说明

在硬件设计的基础上,该项目的软件部分主要涉及各功能模块的函数设计。

软件的处理流程为:

image.png

处理流程图


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
#endif


DHT22读取数据的程序为:

// 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所示

image.png

图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所示

image.png

图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所示: 

image.png

图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所示:

image.png

图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所示。

image.png

图8主界面设计

image.png

图9 设置界面设计

演示效果

image.png

图10 主界面

image.png

图11 设置界面

image.png

图12 指令测试


视频:https://v.youku.com/v_show/id_XNTgyNjk3NjYzNg==.html




附件

(0.85 MB)下载

评论区(0 )