嘉立创产业服务站群
发作品签到
专业版

基于梁山派的手持无线环境检测仪

工程标签

362
0
0
0

简介

基于梁山派微控制器的无线手持环境检测仪

简介:基于梁山派微控制器的无线手持环境检测仪

开源协议

GPL 3.0

创建时间:2023-10-14 09:40:19更新时间:2023-10-16 02:51:17

描述

简介

基于梁山派开发板,开发手持环境检测仪。

功能介绍

1、采集温湿度、大气压以及有害气体等参数
2、通过LVGL显示以上信息
3、通过NF-03无线模块将采集的信息发送到从机上并显示
4、通过LVGL实现人机交互界面

技术要求

1、温湿度传感器:用于检测温湿度数据;
2、气压传感器:用于检测大气压数据;
3、有害气体传感器:用于检测有害气体等 数据;
4、屏幕:用于实时显示采集到的设备;
5、无线通信:用于将数据发送至接收设备使用;
6、手持:小巧、使用电池,脱离供电线的困扰;

技术指标

1、测量温湿度、气压、有害气体等数据;
2、屏幕通过LVGL开源GUI库实时显示测量结果;
3、使用电池可以放电充电;
4、无线通信方式:将数据通过无线模块发送出去给接收设备使用。

原理图说明

电源设计

TP5400 为一款移动电源专用的单节锂离子电池充电器和恒定 5V 升压控制器,充电部分集高精度电压和充电电流调节器、预充、充电状态指示和充电截止等功能于一体, 可以输出最大 1A 充电电流。而升压电路采用CMOS 工艺制造的空载电流极低的 VFM 开关型 DC/DC 升压转换器。其具有极低的空载功耗(小于 10uA),且升压输出驱动电流能力能达到 1A。无需外部按键,可以即插即用。电路图如下:
image.png
电池电压为 BAT+,Type-C充电电压为VCCIN,VOUT为5V输出电压。

温湿度传感器

本案例采用的是AHT21温湿度传感器。AHT21作为新一代温湿度传感器,在尺寸与性能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚SMD封装,底面3x3mm ,高度0 . 8 mm。传感器输出经过标定的数字信号,标准 I2C 格式。电路设计如下:
image.png

气压传感器

本案例采用的是数字防水气压传感器 WF183D。WF183D是一颗经济型数字压力温度传感器内部包含一个MEMS压力传感器和一个高分辨率 24位△∑ADC及DSP。WF183D通过UART提供高精度已校准压力和温度数字输出,通讯连接非常简单。电路设计如下:
image.png

有害气体传感器

本案例采用的是AGS10TVOC传感器,AGS10是一款采用数字信号输出的MEMS TVOC传感器。配置了专用的数字模块采集技术和气体感应传感技术,确保了产品具有极高的可靠性与卓越的长期稳定性,同时具有低功耗、高灵敏度、快速响应、成本低、驱动电路简单等特点。
AGS10主要适用于侦测各类有机挥发性气体,如乙醇、氨气、硫化物、苯系蒸汽和其它有害气体,可应用在空气净化器、家用电器、新风机等设备。电路设计如下:
image.png

电量测量

因为GD32的IO口最大可以兼容5V,超过5V就会把IO口烧坏;而测量电压的外设ADC,它的参考电压在立创·梁山派开发板上是3.3V。所以如果使用ADC直接测量电池的电压,那么它无法测量3.3V以上的电压。采用的主板上的ADC,选取PA1管脚进行检测。电量测量的电路原理图如下:
image.png

屏幕显示

屏幕采用了SPI通讯的240*280像素的1.69寸IPS高清圆角屏幕。 1.69寸屏幕是一种常见的小尺寸显示屏,它指的是屏幕的对角线尺寸为1.69英寸(约4.29厘米)。尽管它相对较小,但在某些应用领域中仍然具有广泛的用途和功能。该屏幕因为单位像素密度更高(总像素/尺寸),所以显示画质更精细,并且控制IO少,外围电路也相对简单。电路设计如下:
image.png
image.png

无线通信模块

采用的是由安信可科技设计的Ai-WB2- 01S无线模块。Ai-WB2-01S是一款无线收发一体的2.4G 模块,2.4G模块是一种用于无线通信的模块,它能够在2.4GHz频段进行无线数据传输和接收。该模块通常由无线收发器和相关的控制电路组成,为用户提供方便的无线通信解决方案。他支持wifi和BLE,小巧且功能强大。设计原理图如下:
image.png

关键程序说明

温湿度驱动实现

因AHT20温湿度传感器采用的是标准的IIC接口,我们可以使用软件IIC或硬件IIC的方式与其通信。只要是通用输入输出(GPIO)的引脚就可以使用软件IIC,而硬件IIC需要使用到指定引脚才可使用。本案例采用的是软件IIC的方式,使用引脚PD3/PD6。由于代码较多,仅展示部分

//iic初始化
void aht21_gpio_init(void)
{
    //打开SDA与SCL的引脚时钟
    rcu_periph_clock_enable(RCU_AHT21_SCL);
    rcu_periph_clock_enable(RCU_AHT21_SDA);

    //设置SCL引脚模式为上拉输出
    gpio_mode_set(PORT_AHT21_SCL, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_AHT21_SCL);
    //设置引脚为开漏模式,翻转速度2MHz
    gpio_output_options_set(PORT_AHT21_SCL, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_AHT21_SCL);
    //设置引脚输出高电平SCL等待信号
    gpio_bit_write(PORT_AHT21_SCL, GPIO_AHT21_SCL, SET);

    //设置SDA引脚
    gpio_mode_set(PORT_AHT21_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_AHT21_SDA);
    gpio_output_options_set(PORT_AHT21_SDA, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_AHT21_SDA);
    gpio_bit_write(PORT_AHT21_SDA, GPIO_AHT21_SDA, SET);
}
/******************************************************************
 * 函 数 名 称:aht21_read_data
 * 函 数 说 明:读取温湿度
 * 函 数 形 参:无
* 函 数 返 回:1:未校准  2:读取超时  0:读取成功
 * 作       者:LCKFB
 * 备       注:无
******************************************************************/
char aht21_read_data(void)
{
    uint8_t data[6] = {0};
    uint32_t temp = 0;

    uint8_t aht21_status_byte = 0;
    uint8_t timeout = 0;
    //读取AHT21的状态
    aht21_status_byte = aht21_read_status();
    //如果未校准,则返回1
    if( (aht21_status_byte & (1<<3)) == 0 )
    {
        aht21_device_init();
        delay_1ms(50);
        return 1;
    }

    //发送采集命令
    aht21_send_gather_command();

    do
    {
        delay_1ms(1);
        timeout++;
        //读取AHT21的状态
        aht21_status_byte = aht21_read_status();
    }while( ( ( aht21_status_byte & (1<<7) ) != 0 ) && ( timeout >= 80 ) );
    //如果读取超时,则返回2
    if( timeout >= 80 ) return 2;

    IIC_Start();
    IIC_Send_Byte(0x71);
    if( I2C_WaitAck() == 1 ) printf("error -1\r\n");
	IIC_Read_Byte();//读取状态,不需要保存
	IIC_Send_Ack();	

    //读取6位数据
    data[0] = IIC_Read_Byte();
    IIC_Send_Ack();
    data[1] = IIC_Read_Byte();
    IIC_Send_Ack();
    data[2] = IIC_Read_Byte();
    IIC_Send_Ack();
    data[3] = IIC_Read_Byte();
    IIC_Send_Ack();
    data[4] = IIC_Read_Byte();
    IIC_Send_Ack();
    data[5] = IIC_Read_Byte();
    IIC_Send_Nack();

    IIC_Stop();

    //整合湿度数据
    temp = (data[0]<<12) | (data[1]<<4);
    temp = temp | (data[2]>>4);

    //换算湿度数据
    //2的20次方 = 1048576
    humidity = temp / 1048576.0 * 100.0;

    //整合湿度数据
    temp = ( (data[2]&0x0f)<< 16 ) | (data[3]<<8);
    temp = temp | data[4];
    //换算湿度数据
    //2的20次方 = 1048576
    temperature = temp / 1048576.0 * 200.0 - 50;

    return 0;
}

有害气体传感器驱动实现

//数据读取
uint32_t ags10_read(void)
{
    uint8_t timeout = 0;
    uint8_t data[5] = {0};
    uint32_t TVOC_data = 0;

    AGS10_IIC_Start();
    AGS10_IIC_Send_Byte(0X34);
    if( AGS10_I2C_WaitAck() == 1 ) return 1;
    AGS10_IIC_Send_Byte(0X00);
    if( AGS10_I2C_WaitAck() == 1 ) return 2;
    AGS10_IIC_Stop();

    do{
        delay_1ms(1);
        timeout++;
        AGS10_IIC_Start();
        AGS10_IIC_Send_Byte(0X35);
    }while( (AGS10_I2C_WaitAck() == 1) && (timeout >= 50) );

    //如果超时
    if( timeout >= 50 ) return 3;

    data[0] = AGS10_IIC_Read_Byte();
    AGS10_IIC_Send_Ack();
    data[1] = AGS10_IIC_Read_Byte();
    AGS10_IIC_Send_Ack();
    data[2] = AGS10_IIC_Read_Byte();
    AGS10_IIC_Send_Ack();
    data[3] = AGS10_IIC_Read_Byte();
    AGS10_IIC_Send_Ack();
    data[4] = AGS10_IIC_Read_Byte();
    AGS10_IIC_Send_Nack();

    AGS10_IIC_Stop();

    if( Calc_CRC8(data,4) != data[4] )
    {
//        printf("Check failed\r\n");
        return 4;
    }
    TVOC_data = (data[1]<<16) | (data[2]<<8) | data[3] ;
    return TVOC_data;
}

PCB设计说明

信号线的连接要包地设计且途中不能有其他线经过,否则会产生干扰。
image.png
三个传感器的焊盘拉大设计,可以更方便焊接。
image.png

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
55d932d0be3b8be023a5dea495d20909.mp4
2
2
jie_project.7z
9
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航