基于STM32的气体监测系统设计与实现
创作时间:
作者:
@小白创作中心
基于STM32的气体监测系统设计与实现
引用
CSDN
1.
https://blog.csdn.net/weixin_45715650/article/details/140732839
基于STM32的气体监测系统是一个功能丰富的环境监测解决方案,它结合了多种传感器、显示模块、报警装置和通讯模块,能够实时监测二氧化碳、可燃气体、有毒气体和气压等环境参数,并通过手机APP实现远程监控和控制。本文将详细介绍该系统的硬件组成、原理图设计、代码实现以及软件功能,适合有一定电子工程基础的读者学习和参考。
系统组成
基于STM32的气体监测系统主要由以下硬件组成:
- STM32F103C8T6单片机:作为核心控制器
- JW01传感器:用于检测二氧化碳浓度
- MQ-9传感器:用于检测可燃气体浓度
- MQ-135传感器:用于检测有毒气体浓度
- BMP180传感器:用于检测气压
- OLED模块:用于显示传感器数据
- 蜂鸣器:用于气体浓度超标时报警
- 风扇:用于通风
- ESP8266模块:用于WIFI通讯数据传输
原理图与PCB设计
使用立创EDA平台进行原理图设计,该平台适合新手入门,提供了丰富的封装库资源。设计完成后,可以在平台上直接生成PCB,并根据需要对器件进行布局和连线。
硬件代码实现
主函数(main.c)
int main(void) {
char buf[20];
unsigned short timeCount = 0;
unsigned char *dataPtr = NULL;
Timer_Init();
Adc_Init();
delay_init();
Usart2_Init(115200);
DHT11_Init();
LED_Init();
OLED_Init();
bmp180_init();
ESP8266_Init();
OLED_Clear();
delay_ms(500);
OLED_ShowCHinese(1, 1, 10);
OLED_ShowCHinese(1, 3, 11);
OLED_ShowCHinese(1, 5, 12);
OLED_ShowCHinese(1, 7, 13);
OLED_ShowString(1, 9, ":----ppm");
OLED_ShowCHinese(2, 1, 3);
OLED_ShowCHinese(2, 3, 4);
OLED_ShowCHinese(2, 5, 5);
OLED_ShowCHinese(2, 7, 6);
OLED_ShowString(2, 9, ":---ppm");
OLED_ShowCHinese(3, 1, 7);
OLED_ShowCHinese(3, 3, 8);
OLED_ShowCHinese(3, 5, 5);
OLED_ShowCHinese(3, 7, 6);
OLED_ShowString(3, 9, ":---ppm");
OLED_ShowCHinese(4, 1, 5);
OLED_ShowCHinese(4, 3, 9);
OLED_ShowString(4, 5, ":-------kpa");
while (OneNet_DevLink())
delay_ms(500);
OneNET_Subscribe();
MQ9_limit = MQ135_limit = 50;
while (1) {
if (++timeCount >= 50) {
Uart_Rece_Pares();
sprintf(buf, "%4d", co2);
OLED_ShowString(1, 10, buf);
MQ9 = (int)MQ9_GetPPM();
sprintf(buf, "%3d", MQ9);
OLED_ShowString(2, 10, buf);
MQ135 = (int)Get_Adc_Average(ADC_Channel_5, 10) * 330 / 4095;
sprintf(buf, "%3d", MQ135);
OLED_ShowString(3, 10, buf);
bmp180_measure();
delay_ms(500);
BMP180 = bmp180_getPressure();
sprintf(buf, "%.3f", BMP180);
OLED_ShowString(4, 6, buf);
if (mode == 0) {
if (MQ9 > MQ9_limit || MQ135 > MQ135_limit) {
Jd0_Set(GPIO_ON);
Beep_Set(GPIO_ON);
} else {
Beep_Set(GPIO_OFF);
Jd0_Set(GPIO_OFF);
}
} else {
}
OneNet_SendData();
timeCount = 0;
ESP8266_Clear();
}
dataPtr = ESP8266_GetIPD(0);
if (dataPtr != NULL) {
OneNet_RevPro(dataPtr);
}
}
}
JW01传感器模块检测二氧化碳浓度
float tvoc = 0; // TVOC浓度
float ch2o = 0; // CH2O浓度
u16 co2 = 0; // CO2浓度
void Uart_Rece_Pares(void) // 串口接收内容解析函数
{
if (gReceEndFlag == 1) // 如果接收完成
{
// 解析接收内容
if ((u8)(gReceFifo[0] + gReceFifo[1] + gReceFifo[2] + gReceFifo[3] + gReceFifo[4]) == gReceFifo[5])
{
// CO2浓度(单位是PPM)
co2 = (u16)(gReceFifo[1] * 256 + gReceFifo[2]);
}
// 清空接收数组
for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
{
gReceFifo[gClearCount] = ' ';
}
gReceEndFlag = 0; // 清除接收完成标志位
gReceCount = 0; // 清零接收计数变量
}
}
BMP180传感器模块监测气压
static void bmp180_iic_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BMP180_SDA_RCC_CLK | BMP180_SCL_RCC_CLK, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* SDA GPIO初始化设置 */
GPIO_InitStructure.GPIO_Pin = BMP180_SDA_GPIO_PIN;
GPIO_Init(BMP180_SDA_GPIO_PORT, &GPIO_InitStructure);
/* SCL GPIO初始化设置 */
GPIO_InitStructure.GPIO_Pin = BMP180_SCL_GPIO_PIN;
GPIO_Init(BMP180_SCL_GPIO_PORT, &GPIO_InitStructure);
BMP180_SCL(1); BMP180_SDA(1);
}
static void bmp180_sda_inout(uint8_t dir)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(BMP180_SDA_RCC_CLK, ENABLE);
if(dir) {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出 */
} else {
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/* 浮空输入 */
}
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = BMP180_SDA_GPIO_PIN;
GPIO_Init(BMP180_SDA_GPIO_PORT, &GPIO_InitStructure);
}
static void bmp180_iic_start(void)
{
bmp180_sda_inout(1); /* 配置sda线为输出模式 */
BMP180_SDA(1);
BMP180_SCL(1);
delay_us(4);
BMP180_SDA(0); /* 开始信号 CLK高电平时,SDA从高变低 */
delay_us(4);
BMP180_SCL(0); /* 钳住I2C总线,准备发送或接收数据 */
}
static void bmp180_iic_stop(void)
{
bmp180_sda_inout(1); /* 配置sda线为输出模式 */
BMP180_SCL(0);
BMP180_SDA(0); /* 停止信号 CLK高电平时,SDA从低变高 */
delay_us(4);
BMP180_SCL(1);
BMP180_SDA(1); /* 发送I2C总线结束信号 */
delay_us(4);
}
static uint8_t bmp180_iic_waitAck(void)
{
uint8_t ucErrTime = 0;
bmp180_sda_inout(0); /* SDA设置为输入模式 */
BMP180_SDA(1);
delay_us(1);
BMP180_SCL(1);
delay_us(1);
while(BMP180_READ_SDA) {
ucErrTime ++;
if(ucErrTime>250) {
bmp180_iic_stop();
return 1;
}
}
BMP180_SCL(0);
return 0;
}
软件部分
基于STM32的气体监测系统采用了STM32F103C8T6单片机作为核心控制器,结合多种传感器、显示模块、报警装置和通讯模块,实现了一个功能丰富的环境监测系统。App的设计主要围绕以下几个方面:
- 数据接收与展示:App通过WiFi与ESP8266模块通信,接收STM32单片机通过ESP8266模块发送的传感器数据,并在App界面上实时展示。
- 控制功能:App提供用户控制界面,允许用户远程控制风扇、蜂鸣器和LED的状态。
- 阈值设置:用户可以在App中设置可燃气体和有毒气体的浓度阈值,当监测到的浓度超过这些阈值时,系统自动触发报警和风扇通风。
- 用户交互:App设计注重用户友好性,提供清晰的界面布局和直观的操作方式。
使用场景
该产品的运用场景非常广泛,包括但不限于以下几个方面:
- 家庭环境:可用于家庭厨房、卧室等区域,监测二氧化碳、可燃气体和有毒气体的浓度,保障家庭成员的健康安全。
- 工业场所:在化工厂、油库、煤矿等工业场所,用于监测有害气体浓度,及时发现并处理潜在的安全隐患。
- 公共场所:在商场、学校、医院等公共场所,用于监测空气质量,为公众提供健康舒适的环境。
- 科研实验:在科研实验中,用于精确测量和记录各种气体的浓度变化,为实验提供可靠的数据支持。
热门推荐
解密中药材-铁皮石斛:揭示其对健康的5大秘密
时速120公里,深圳地铁20号线成全国首条全自动化线路
深圳地铁:20年建成595公里,智慧创新领跑全国
5线齐发!深圳地铁迈入“500公里时代”,智能服务全面升级
阿Q正传读后感:流浪农民的精神胜利与悲惨命运
法院驳回再审申请后,当事人如何申请检察院抗诉
买宝来的十大忠告
清香纯正VS酱香浓郁:两种高端白酒的口感对比
李帆副主任医师教你调节儿茶酚胺:饮食、运动和睡眠的科学指南
嗜铬细胞瘤:从症状到治疗的全面解析
灌香肠用猪的哪个部位的肉最好?
岭南文化发源地梧州:三江交汇塑造2200年古城新貌
梧州创新“三长联查”机制,实现生态保护与经济双赢
五行八字起名法:既承传统文化又讲科学依据
王道子五行八字起名法:平衡五行,凝聚文化祝福
从主角到配角:两部电影中的姜子牙
宝鸡石鼓山考古揭秘:姜子牙家族墓地与姬族联姻之谜
静态市盈率局限性凸显,专家建议采用多元估值体系
静态市盈率:评估股票价值的关键指标与应用技巧
玩雪泡汤品美食,哈密冬季旅游攻略
中国科学家发明植物蒸腾发电机,全球叶片或成绿色能源新选择
从银杏到枣树:中国传统庭院五树的吉祥寓意与价值
银杏不是杏:两种树木的分类与特征对比
英国邱园发布2090年景观演替计划,30%树木面临气候威胁
医保码让就医更便捷
白云山一日游打卡攻略:玉皇顶、白云寺、索道全攻略
白云山秋游正当时,不容错过的美景
补正气才能百病不侵!中医博士推荐8道养生茶饮
胆木浸膏糖浆会对哪些疾病有效所含的成分是什么
胆木浸膏糖浆的作用及功效是什么