
基于梁山派的手持无线环境检测仪
简介
基于梁山派微控制器的无线手持环境检测仪
简介:基于梁山派微控制器的无线手持环境检测仪开源协议
:GPL 3.0
描述
简介
基于梁山派开发板,开发手持环境检测仪。
功能介绍
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。无需外部按键,可以即插即用。电路图如下:
电池电压为 BAT+,Type-C充电电压为VCCIN,VOUT为5V输出电压。
温湿度传感器
本案例采用的是AHT21温湿度传感器。AHT21作为新一代温湿度传感器,在尺寸与性能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚SMD封装,底面3x3mm ,高度0 . 8 mm。传感器输出经过标定的数字信号,标准 I2C 格式。电路设计如下:
气压传感器
本案例采用的是数字防水气压传感器 WF183D。WF183D是一颗经济型数字压力温度传感器内部包含一个MEMS压力传感器和一个高分辨率 24位△∑ADC及DSP。WF183D通过UART提供高精度已校准压力和温度数字输出,通讯连接非常简单。电路设计如下:
有害气体传感器
本案例采用的是AGS10TVOC传感器,AGS10是一款采用数字信号输出的MEMS TVOC传感器。配置了专用的数字模块采集技术和气体感应传感技术,确保了产品具有极高的可靠性与卓越的长期稳定性,同时具有低功耗、高灵敏度、快速响应、成本低、驱动电路简单等特点。
AGS10主要适用于侦测各类有机挥发性气体,如乙醇、氨气、硫化物、苯系蒸汽和其它有害气体,可应用在空气净化器、家用电器、新风机等设备。电路设计如下:
电量测量
因为GD32的IO口最大可以兼容5V,超过5V就会把IO口烧坏;而测量电压的外设ADC,它的参考电压在立创·梁山派开发板上是3.3V。所以如果使用ADC直接测量电池的电压,那么它无法测量3.3V以上的电压。采用的主板上的ADC,选取PA1管脚进行检测。电量测量的电路原理图如下:
屏幕显示
屏幕采用了SPI通讯的240*280像素的1.69寸IPS高清圆角屏幕。 1.69寸屏幕是一种常见的小尺寸显示屏,它指的是屏幕的对角线尺寸为1.69英寸(约4.29厘米)。尽管它相对较小,但在某些应用领域中仍然具有广泛的用途和功能。该屏幕因为单位像素密度更高(总像素/尺寸),所以显示画质更精细,并且控制IO少,外围电路也相对简单。电路设计如下:
无线通信模块
采用的是由安信可科技设计的Ai-WB2- 01S无线模块。Ai-WB2-01S是一款无线收发一体的2.4G 模块,2.4G模块是一种用于无线通信的模块,它能够在2.4GHz频段进行无线数据传输和接收。该模块通常由无线收发器和相关的控制电路组成,为用户提供方便的无线通信解决方案。他支持wifi和BLE,小巧且功能强大。设计原理图如下:
关键程序说明
温湿度驱动实现
因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设计说明
信号线的连接要包地设计且途中不能有其他线经过,否则会产生干扰。
三个传感器的焊盘拉大设计,可以更方便焊接。
设计图

BOM


评论