基于ESP8266的温湿度、可燃气监测系统

1.硬件准备

  • esp8266开发板
  • DHT11温湿度传感器
  • MQ气体传感器(本例使用MQ-5,推荐使用MQ-2)
  • 无源蜂鸣器
  • OLED显示屏
  • 面包板
  • 若干杜邦线

2.线路连接

DHT11 温湿度传感器
传感器开发板
VCC3.3V
GNDGND
OUTD4
MQ-5液化气传感器模块
传感器开发板
AOA0
DOD5
GNDGND
VCC3.3V
无源蜂鸣器

注:无源蜂鸣器翻转过来有正负极

传感器开发板
+D6
HXVCC
OLED显示屏
显示屏开发板
GNDGND
VDDVCC
SCK/SCLD1
SDAD2
实物连接好的图片

在这里插入图片描述

3.代码实现

#include <dht11.h>   // 引入DHT11库,温湿度传感器
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> //需要自行下载, OLED显示

#define DHT11PIN 2   // 温湿度传感器引脚,2对应D4
#define Sensor_DO 14
#define MQ5PIN A0

/*************定义类型****************/
dht11 DHT11;
Adafruit_SSD1306 oled(128, 64, &Wire,-1);   //实例化

/*************定义全局变量****************/
float sensorValue;   // MQ
float ad_co_f = 0;
int pinBuzzer = 12;
float temp = 0;  // 温度
float hum = 0;   // 湿度


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  OLED_Init();

  // MQ-5初始化
  pinMode(Sensor_DO, INPUT);
  // 蜂鸣器初始化
  pinMode(pinBuzzer, OUTPUT);
  // 等待
  delay(5000);

}

void loop() {
  // put your main code here, to run repeatedly:
  // 获取温湿度
  Serial.println("获取温湿度");
  DHT11.read(DHT11PIN);  // 更新传感器上的数据
  temp = getTemperature();
  hum = getHumidity();
  Serial.print("当前湿度(%): ");
  Serial.println(hum, 2);
  Serial.print("当前温度(℃):");
  Serial.println(temp, 2);
  // 获取MQ-5
  Serial.println("获取MQ-5数据");
  sensorValue = getSensorValue();
  ad_co_f = sensorValue * (3.3/1024);  
  // 显示到OLED
  Serial.println("显示到OLED屏");
  oled.clearDisplay();  // 清屏
  OLED_Show_Temperature(temp);
  OLED_Show_Humidity(hum);
  OLED_Show_MQ5(ad_co_f);
  oled.display();
  // 判断条件
  if(digitalRead(Sensor_DO) == LOW)
  {
    // 蜂鸣器响
    Serial.println("蜂鸣器响了");
    activateVoice();
  } else {
    // 蜂鸣器停
    Serial.println("蜂鸣器停了");
    deactivateVoice();
  }
  // 等待
  delay(1000);
}

// OLED显示函数
void OLED_Init()
{
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3c);
  oled.setTextColor(WHITE);
  oled.clearDisplay();   // 清屏
}

void OLED_Show_Temperature(float temp)
{
  // 显示温度
  oled.setTextSize(1.9);
  oled.setCursor(5, 1);
  oled.print("Temp:  ");
  oled.print(temp);
  oled.println("C");
}

void OLED_Show_Humidity(float hum)
{
  // 显示湿度
  oled.setTextSize(1.9);
  oled.setCursor(5, 12);
  oled.print("Humidity:");
  oled.print(hum);
  oled.println("%");
}

void OLED_Show_MQ5(float alarm)
{
  oled.setTextSize(1.9);
  oled.setCursor(5, 24);
  oled.print("CO alarm:  ");
  oled.println(alarm);
}

// DHT11温湿度传感器
double Fahrenheit(double celsius)
{
  return 1.8 * celsius + 32; //摄氏温度度转化为华氏温度
}
 
double Kelvin(double celsius)
{
  return celsius + 273.15; //摄氏温度转化为开氏温度
}

float getHumidity()
{
  return (float)DHT11.humidity;
}

float getTemperature()
{
  return (float)DHT11.temperature;
}

// 蜂鸣器函数
void activateVoice()
{
  tone(pinBuzzer, 300, 500);
}
void deactivateVoice()
{
  noTone(pinBuzzer);
}

// 获取MQ-5传感器参数
float getSensorValue()
{
  return analogRead(MQ5PIN);
}
效果

在这里插入图片描述

4.参考资料

  1. MQ2气体/烟雾传感器如何工作及其与Arduino接口,https://zhuanlan.zhihu.com/p/340072270
  2. ESP8266如此简单-入门之驱动蜂鸣器,https://www.bilibili.com/video/BV1zv4y137YN
  3. Arduino esp8266接OLED亮屏,https://blog.csdn.net/dddexter/article/details/116461972
  4. 基于arduino的oled显示屏的使用,https://blog.csdn.net/jiayan0428/article/details/105254403
  5. ESP8266驱动OLED显示屏(附源码),https://www.bilibili.com/video/BV1QM4y1W7kN
  6. 基于ESP8266芯片的实时温湿度传感器,https://blog.csdn.net/m0_57035925/article/details/121971844
  7. 基于esp8266、dht11、MQ2、oled的CO可燃气检测系统设计,https://www.bilibili.com/video/BV1AT4y1a7i4
  8. ESP8266传感器开发参考资料(太极创客),http://www.taichi-maker.com/homepage/iot-development/iot-dev-reference/esp8266-iot-dev-ref/esp8266-sensor-ref/
<think>我们正在开发一个基于Linux的环境监测系统,用于检测温湿度和烟雾。根据用户需求,我们需要在Linux系统上使用传感器和嵌入式开发技术来实现。 参考引用资料: [^1] 提到使用STM32F103开发板配合ESP8266和DHT11设计温湿度采集子系统,并将数据上传到阿里云。 [^2] 提到使用SHT20温湿度传感器,具有精度高、可靠性高等优点。 [^3] 提到软硬件开发平台,其中硬件包括温湿度传感器、光照传感器、可燃气传感器和CC2530开发板。 [^4] 提到在粤嵌gec6818开发板上实现智能家居,包括温湿度、烟雾等传感器,并涉及串口通信。 因此,我们可以设计一个系统,包括: 1. 传感器选择:温湿度传感器(如DHT11或SHT20)、烟雾传感器(如MQ-2)。 2. 微控制器(可选):如果传感器需要微控制器进行数据采集(如DHT11需要时序控制),则可以使用一个微控制器(如STM32)作为下位机采集数据,然后通过串口或网络(如ESP8266)发送给Linux系统。或者,如果Linux开发板本身有足够的GPIO和实时性,也可以直传感器(但需注意Linux的实时性可能不足)。 3. Linux开发板:作为上位机,运行Linux系统,收下位机发送的数据,或者直读取传感器数据(如果传感器支持Linux直,如通过I2C或SPI)。 4. 通信方式:串口(UART)是常见的选择,也可以使用网络(如WiFi模块ESP8266)将数据发送到Linux系统。 5. 软件部分:在Linux上编写程序读取串口数据或网络数据,解析传感器数据,并进行显示、存储或上传。 步骤: 第一步:硬件选型与连 - 温湿度传感器:DHT11(数字输出,单总线协议)或SHT20(I2C协议)。DHT11成本低,SHT20精度高。 - 烟雾传感器:MQ-2(模拟输出或数字输出,通常需要ADC转换)。如果使用微控制器,可以在下位机完成ADC转换,然后以数字方式传输。 - 微控制器(可选):如果使用下位机,可以选择STM32F103等,连传感器,采集数据,然后通过串口发送给Linux开发板。或者使用ESP8266模块,将数据通过WiFi发送。 - 如果Linux开发板(如树莓派、STM32MP157、粤嵌GEC6818等)有足够的GPIO和实时性,也可以直传感器(特别是I2C口的传感器如SHT20)。但注意DHT11需要严格的时序,在Linux用户空间通过GPIO操作可能不够实时,建议使用微控制器采集。 第二步:下位机固件开发(如果使用下位机) - 编写微控制器程序,读取DHT11(或SHT20)和MQ-2的数据。 - 将数据格式化为字符串,通过串口发送给Linux系统。例如:发送格式为"T:25.0,H:50.0,S:200\n",其中T表示温度,H表示湿度,S表示烟雾浓度。 第三步:Linux端软件设计 - 在Linux开发板上,编写程序读取串口数据(或网络数据)。 - 解析数据,并进行处理(如显示、存储、上传到服务器等)。 我们以使用下位机(STM32)采集数据,通过串口发送到Linux开发板为例。 下位机(STM32)部分: - 硬件连: DHT11 -> STM32的某个GPIO(单总线) MQ-2 -> STM32的ADC引脚 STM32的串口TX -> Linux开发板的串口RX - 软件:使用STM32 HAL库,编写程序周期性地读取传感器数据,并通过串口发送。 Linux部分: - 在Linux系统中,串口设备通常为`/dev/ttyS*`或`/dev/ttyUSB*`等。 - 使用C、Python等语言编写程序打开串口,读取数据并解析。 示例代码(Linux端使用C语言读取串口): 1. 打开串口设备 2. 配置串口参数(波特率、数据位、停止位等) 3. 循环读取数据 4. 解析数据 由于用户要求开发基于Linux的环境监测系统,我们重点在Linux端的开发。 下面给出一个简单的C语言示例,用于读取串口数据并解析: ```c #include <stdio.h> #include <string.h> #include <fcntl.h> #include <termios.h> #include <unistd.h> int main() { int fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); // 根据实际串口设备修改 if (fd < 0) { perror("Failed to open serial port"); return -1; } struct termios serial; memset(&serial, 0, sizeof(serial)); serial.c_cflag = B9600 | CS8 | CLOCAL | CREAD; // 波特率9600, 8位数据 serial.c_iflag = IGNPAR; serial.c_oflag = 0; serial.c_lflag = 0; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &serial); char buffer[256]; while (1) { int n = read(fd, buffer, sizeof(buffer) - 1); if (n > 0) { buffer[n] = '\0'; // 解析数据,例如格式为"T:25.0,H:50.0,S:200\n" float temp, humi; int smoke; if (sscanf(buffer, "T:%f,H:%f,S:%d", &temp, &humi, &smoke) == 3) { printf("Temperature: %.1f°C, Humidity: %.1f%%, Smoke: %d\n", temp, humi, smoke); } } usleep(100000); // 100ms } close(fd); return 0; } ``` 如果使用Python,可以使用pyserial库: ```python import serial ser = serial.Serial('/dev/ttyS1', 9600, timeout=1) while True: line = ser.readline().decode('utf-8').strip() if line: # 假设数据格式为"T:25.0,H:50.0,S:200" parts = line.split(',') if len(parts) == 3: temp = float(parts[0].split(':')[1]) humi = float(parts[1].split(':')[1]) smoke = int(parts[2].split(':')[1]) print(f"Temperature: {temp}°C, Humidity: {humi}%, Smoke: {smoke}") ``` 注意:实际数据格式需要与下位机发送的格式一致。 另外,如果用户希望将数据上传到云端,可以参考引用[1]中的方法,使用MQTT协议将数据发布到阿里云等平台。 总结: 1. 硬件连:使用下位机(如STM32)采集温湿度和烟雾数据,通过串口发送到Linux开发板。 2. Linux端:编写串口读取程序,解析数据。 3. 扩展:将数据上传到云端(如阿里云)或本地存储、显示等。 相关问题: 1. 如何选择适合的温湿度和烟雾传感器? 2. 如何在Linux系统中配置串口? 3. 如何将采集的数据上传到云端服务器? 4. 如果不使用下位机,如何在Linux开发板上直传感器? 5. 如何保证数据采集的实时性和准确性?</think>### 基于Linux的温湿度和烟雾检测系统开发指南 #### 一、系统架构设计 1. **硬件组成**: - 主控板:Linux开发板(如STM32MP157、GEC6818等)[^1][^4] - 温湿度传感器:DHT11(低成本)或SHT20(高精度)[^1][^2] - 烟雾传感器:MQ-2(可燃气体检测) - 通信模块:ESP8266(WiFi上云)或串口直连[^1] 2. **数据流**: ``` 传感器采集 → 嵌入式处理 → Linux系统 → 本地存储/云端传输 ``` #### 二、硬件连与驱动 1. **传感器口**: ```mermaid graph LR A[DHT11] --单总线--> B[MCU/开发板] C[MQ-2] --ADC引脚--> B D[SHT20] --I2C--> B ``` 2. **驱动开发步骤**: - **温湿度传感器**: ```c // DHT11读取示例(单总线协议) #include <wiringPi.h> void read_dht11(int pin) { // 1. 发送开始信号 pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); // 2. 切换为输入模式等待响应 pinMode(pin, INPUT); // ... 解析40位数据 } ``` - **烟雾传感器**: ```c // MQ-2 ADC读取(以GEC6818为例) int read_mq2() { int fd = open("/dev/adc", O_RDWR); ioctl(fd, ADC_SET_CHANNEL, 0); // 选择通道0 read(fd, &adc_val, sizeof(adc_val)); close(fd); return adc_val; // 原始ADC值 } ``` #### 三、Linux端应用开发 1. **数据采集框架**: ```python # Python多线程采集示例 import threading import time def temp_humidity_task(): while True: # 调用传感器驱动读取 data = read_dht11() # 发布到MQTT或存储 time.sleep(2) def smoke_task(): while True: smoke_val = read_mq2() # 报警逻辑:if smoke_val > threshold: alert() time.sleep(1) threading.Thread(target=temp_humidity_task).start() threading.Thread(target=smoke_task).start() ``` 2. **云端通信(MQTT示例)**: ```python # 使用paho-mqtt库[^1] import paho.mqtt.client as mqtt client = mqtt.Client() client.connect("iot.aliyun.com", 1883) def on_sensor_data(data): client.publish("env/temperature", data['temp']) client.publish("env/smoke", data['smoke']) ``` #### 四、数据处理与可视化 1. **本地存储方案**: - SQLite数据库存储历史数据 - CSV日志文件备份 2. **LVGL可视化(嵌入式GUI)**[^1]: ```c // 创建温湿度曲线图 lv_obj_t * chart = lv_chart_create(lv_scr_act()); lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100); lv_chart_series_t * ser_temp = lv_chart_add_series(chart, lv_palette_main(LV_PALETTE_RED), LV_CHART_AXIS_PRIMARY_Y); ``` #### 五、安全监控逻辑 1. **报警机制**: - 烟雾阈值触发蜂鸣器报警 - 温湿度超限发送手机通知 ```python # 烟雾报警伪代码 if smoke_value > SAFE_THRESHOLD: GPIO.output(BUZZER_PIN, HIGH) # 触发蜂鸣器 send_alert("SMOKE ALERT! Value: {}".format(smoke_value)) ``` ### 常见问题解决方案 1. **传感器读数不稳定**: - 添加硬件滤波电路 - 软件端采用滑动平均滤波算法: ```c #define FILTER_SIZE 5 int adc_filter(int new_val) { static int buffer[FILTER_SIZE]; static int idx = 0; buffer[idx++] = new_val; idx %= FILTER_SIZE; return (buffer[0]+buffer[1]+buffer[2]+buffer[3]+buffer[4])/FILTER_SIZE; } ``` 2. **Linux实时性不足**: - 使用PREEMPT_RT实时内核补丁 - 关键操作通过内核模块实现 ### 开发工具推荐 | 工具类型 | 推荐选项 | 用途 | |----------------|------------------------|-----------------------| | 开发环境 | Buildroot/Yocto | 定制Linux系统 | | 通信协议 | MQTT/CoAP | 云端数据传输 | | 可视化工具 | LVGL/SquareLine Studio | 嵌入式GUI开发[^1] | | 调试工具 | gdbserver/strace | 远程调试 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值