下位机DHT11、MQ-138、MQ-7、PM2.5收集数据通过WIFI模块上传到上位机的OLED显示屏,并且超过安全阈值会使蜂鸣器发生报警同时通过继电器打开净化装置 编写该系统代码
时间: 2024-12-18 19:36:31 浏览: 12
基于单片机MQ4-MQ7气体-DHT11温湿度-PM2.5-蓝牙传输.rar
5星 · 资源好评率100%
编写一个完整的嵌入式系统的代码需要考虑多个模块的协同工作。以下是一个简化版的代码示例,展示了如何使用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()`)需要根据具体的传感器库来实现。
阅读全文