【mcuclub】MQ系列气体传感器

一、实物图

 

二、原理图

编号 名称 功能
1 VCC 电源正
2 GND 电源地
3 DO 数字量输出引脚
4 AO 模拟量输出引脚

三、简介

MQ系列气体传感器是常用的监测气体浓度的传感器,不同型号的传感器会对某种或某几种气体较为敏感,这类传感器灵敏度高、响应快、稳定性好、寿命长、驱动电路简单,广泛适用于家庭气体泄漏报警器、工业可燃气体报警器以及便携式气体检测仪器。

工作原理:

MQ系列气体传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与某种气体接触时,如果晶粒间界处的势垒收到某种气体的调至而变化,就会引起表面导电率的变化。利用这一

编写一个完整的嵌入式系统的代码需要考虑多个模块的协同工作。以下是一个简化版的代码示例,展示了如何使用STM32F103C8T6微控制器通过ESP8266 Wi-7和PM2.5传感器的数据上传到上位机,并在超过安全阈值时触发蜂鸣器报警和启动净化装置。 ### 硬件连接 - **STM32F103C8T6**: - PA1: 接 MQ-7 一氧化碳传感器 AO 端 - PA2: 接 ESP8266 Wi-Fi 模块 RX 端 - PA3: 接 ESP8266 Wi-Fi 模块 TX 端 - PA6: 接 GP2Y1014AU0F 粉尘传感器 AO 端 - PA8: 接 DHT11 温湿度传感器 DATA 端 - PB0: 接 MQ-138 甲醛传感器 AO 端 - PB1: 接有源蜂鸣器报警模块 I/O 端 - PB15: 接风扇驱动模块 IN 端 - VCC: 接电源模块 3.3V - GND: 接电源模块 GND ### 代码示例 ```c #include "stm32f10x.h" #include <stdio.h> #include <string.h> #include "dht11.h" #include "mq138.h" #include "mq7.h" #include "gp2y1014au0f.h" #include "oled.h" #include "esp8266.h" // 定义安全阈值 #define TEMP_THRESHOLD 30 #define HUMIDITY_THRESHOLD 70 #define FORMALDEHYDE_THRESHOLD 0.1 #define CO_THRESHOLD 50 #define PM25_THRESHOLD 50 // 初始化GPIO void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; // 使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置PA1, PA2, PA3, PA6, PA8, PB0, PB1, PB15 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_8; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_15; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStruct); } // 初始化USART1用于ESP8266通信 void USART1_Config(void) { USART_InitTypeDef USART_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; // 使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置USART1_TX (PA9) and USART1_RX (PA10) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置USART1 USART_InitStruct.USART_BaudRate = 115200; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); // 使能USART1 USART_Cmd(USART1, ENABLE); } // 读取传感器数据 void read_sensors(float *temp, float *humidity, float *formaldehyde, float *co, float *pm25) { *temp = dht11_read_temperature(); *humidity = dht11_read_humidity(); *formaldehyde = mq138_read_concentration(); *co = mq7_read_concentration(); *pm25 = gp2y1014au0f_read_pm25(); } // 发送数据到上位机 void send_data_to_server(float temp, float humidity, float formaldehyde, float co, float pm25) { char data[100]; sprintf(data, "Temp: %.2f, Humidity: %.2f, Formaldehyde: %.2f, CO: %.2f, PM2.5: %.2f", temp, humidity, formaldehyde, co, pm25); esp8266_send_data(data); } // 报警和启动净化装置 void alarm_and_purify(float temp, float humidity, float formaldehyde, float co, float pm25) { if (*temp > TEMP_THRESHOLD || *humidity > HUMIDITY_THRESHOLD || *formaldehyde > FORMALDEHYDE_THRESHOLD || *co > CO_THRESHOLD || *pm25 > PM25_THRESHOLD) { // 触发蜂鸣器报警 GPIO_SetBits(GPIOB, GPIO_Pin_1); // 启动净化装置 GPIO_SetBits(GPIOB, GPIO_Pin_15); } else { // 关闭蜂鸣器和净化装置 GPIO_ResetBits(GPIOB, GPIO_Pin_1); GPIO_ResetBits(GPIOB, GPIO_Pin_15); } } int main(void) { // 初始化系统 GPIO_Config(); USART1_Config(); dht11_init(); mq138_init(); mq7_init(); gp2y1014au0f_init(); oled_init(); while (1) { // 读取传感器数据 float temp, humidity, formaldehyde, co, pm25; read_sensors(&temp, &humidity, &formaldehyde, &co, &pm25); // 在OLED显示屏上显示数据 oled_clear(); oled_show_string(0, 0, "Temp:", 1); oled_show_string(0, 1, temp, 1); oled_show_string(0, 2, "Humidity:", 1); oled_show_string(0, 3, humidity, 1); oled_show_string(0, 4, "Formaldehyde:", 1); oled_show_string(0, 5, formaldehyde, 1); oled_show_string(0, 6, "CO:", 1); oled_show_string(0, 7, co, 1); oled_show_string(0, 8, "PM2.5:", 1); oled_show_string(0, 9, pm25, 1); oled_refresh(); // 发送数据到上位机 send_data_to_server(temp, humidity, formaldehyde, co, pm25); // 判断是否超过安全阈值 alarm_and_purify(&temp, &humidity, &formaldehyde, &co, &pm25); // 延时 Delay(1000); } } ``` ### 说明 1. **GPIO配置**: 配置了各个传感器和模块的GPIO引脚。 2. **USART1配置**: 配置了USART1用于ESP8266的通信。 3. **读取传感器数据**: 使用自定义的函数从各个传感器读取数据。 4. **发送数据到服务器**: 将读取的数据通过ESP8266发送到上位机。 5. **报警和启动净化装置**: 如果任何一个参数超过安全阈值,触发蜂鸣器报警并启动净化装置。 6. **OLED显示**: 将读取的数据显示在OLED屏幕上。 请注意,这只是一个简化版的示例,实际项目中可能需要更多的错误处理和优化。每个传感器的具体读取函数(如`dht11_read_temperature()`)需要根据具体的传感器库来实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机俱乐部--官方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值