mq2
烟雾检测示例

示例功能:MQ2是一种基于二氧化锡半导体材料的气体传感器,通过检测环境中可燃气体(如液化气、丙烷、烟雾)浓度变化引起电导率变化,输出模拟电压信号。浓度越高,输出电压越大。如下示例用于检测烟雾变化的模拟值连接(A)和数字值(连接D), 使用模拟接口A时,直接使用analogRead函数读取该接口中的模拟值,烟雾越大,模拟值越大 在使用数字接口D时,MQ2模块中的电位器可以用来调整阈值,超过阈值时数字接口D中输出0,指示灯亮,没超过阈值时谁接口输出1,对应指示灯灭。 硬件接线:MQ2传感器——GPIO14、GPIO15

// MQ2传感器读取示例
const int digitalPin = 14; // 数字信号
const int analogPin = 15; // 模拟信号
void setup() {
Serial.begin(9600); // 初始化串口通信
pinMode(digitalPin, INPUT); // 设置数字引脚为输入模式
}
void loop() {
// 读取模拟值(0-1023)
int analogValue = analogRead(analogPin);
// 读取数字值(0或1)
int digitalValue = digitalRead(digitalPin);
// 串口打印结果
Serial.print("Analog: ");
Serial.print(analogValue);
Serial.print(" | Digital: ");
Serial.println(digitalValue); // 换行
delay(500); // 延时500ms避免数据刷屏
}
注意事项: 预热时间:MQ2需预热1-2分钟以稳定输出,否则数据不准确8。 环境干扰:避免将传感器置于高湿度或强通风环境中。 拓展:做一个烟雾报警器,烟雾值在达到设定的阈值时候,蜂鸣器报警。 硬件接线:MQ2A-GPIO15 MQ2D-GPIO14 蜂鸣器——GPIO3 LED-GPIO8
// 定义引脚
const int analogPin = 15; // 模拟引脚
const int digitalPin = 14; // 数字引脚
// 报警阈值(根据实际环境调整)
const int threshold = 40; // 模拟值阈值(范围0~1023)
// 报警设备
const int ledPin = 8; // 板载LED
const int buzzerPin = 3; // 蜂鸣器引脚
void setup() {
Serial.begin(9600);
pinMode(digitalPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 读取传感器值
int analogValue = analogRead(analogPin); // 获取模拟值
int digitalValue = digitalRead(digitalPin); // 获取数字状态
// 串口输出数据
Serial.print("Analog Value: ");
Serial.print(analogValue);
Serial.print(" | Digital State: ");
Serial.println(digitalValue);
// 触发报警逻辑
if (analogValue > threshold || digitalValue == LOW) {
triggerAlarm();
} else {
digitalWrite(ledPin, LOW);
noTone(buzzerPin);
}
delay(1000); // 每秒检测一次
}
// 报警触发函数
void triggerAlarm() {
digitalWrite(ledPin, HIGH); // 打开LED
tone(buzzerPin, 1000); // 蜂鸣器鸣叫(频率1kHz)
delay(500); // 持续鸣叫时间
noTone(buzzerPin); // 停止鸣叫
delay(500); // 间隔时间
}
#include <Adafruit_GFX.h> // 核心图形库
#include <Adafruit_ST7789.h> // ST7789硬件特定的库
#include <SPI.h> // SPI库
// ST7789 屏幕控制引脚定义
#define TFT_CS 44 // 选择信号引脚
#define TFT_RST -1 // 复位引脚
#define TFT_DC 43 // 数据/命令选择引脚
#define TFT_MOSI 47 // 数据输出
#define TFT_SCLK 21 // 时钟输出
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
// 电位器连接的 ADC 引脚
const int potPin = 13;
// 上次的 ADC 数值
int lastAdcValue = -1;
// 变化阈值,只有当 ADC 数值变化超过该阈值时才更新屏幕
const int threshold = 10; // 阈值设定为 10(可以根据需要调整)
void setup() {
Serial.begin(115200);
// 初始化 ST7789 屏幕
tft.init(240, 240); // 初始化 240x240 分辨率的 ST7789 屏幕
tft.setRotation(2); // 设置屏幕旋转角度为 2(90度)
// 清空屏幕并设置背景颜色
tft.fillScreen(ST77XX_BLACK);
// 启用 UTF8 支持并设置字体
tft.setTextColor(ST77XX_WHITE); // 设置文本颜色为白色
tft.setTextSize(2); // 设置字体大小
// 设置 ADC 读取分辨率为 12 位(ESP32 默认为 12 位)
analogReadResolution(12);
// 显示连接的 ADC 引脚信息
tft.setTextColor(ST77XX_CYAN); // 设置字体颜色为青色
tft.setTextSize(2); // 设置字体大小
tft.setCursor(10, 10); // 设置光标位置
tft.println("ADC Pin: GPIO13");
}
void clearLine(int yPos, int length) {
tft.setCursor(10, yPos);
for (int i = 0; i < length; i++) {
tft.print(" "); // 打印空格清除上一行的文本
}
}
void loop() {
// 从电位器引脚读取 ADC 数值,范围 0~4095
int adcValue = analogRead(potPin);
// 如果 ADC 数值与上次值变化超过阈值,则更新显示
if (abs(adcValue - lastAdcValue) > threshold) {
// 将 ADC 数值转换为电压值:0~4095 对应 0~3.3V
float voltage = adcValue * (3.3 / 4095.0);
// 将 ADC 数值映射到 0~270 度范围
float angle = (adcValue * 270.0) / 4095.0;
// 清空并更新显示 ADC 范围
tft.fillRect(0, 40, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_YELLOW); // 设置字体颜色为黄色
tft.setCursor(10, 40); // 设置光标位置
tft.print("ADC Range: 0 - 4095");
// 清空并更新显示 ADC 数值
tft.fillRect(0, 60, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_WHITE); // 设置字体颜色为白色
tft.setCursor(10, 60); // 设置光标位置
tft.print("ADC Value: ");
tft.println(adcValue);
// 清空并更新显示电压范围
tft.fillRect(0, 90, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_GREEN); // 设置字体颜色为绿色
tft.setCursor(10, 90); // 设置光标位置
tft.print("Volt Range: 0-3.3V");
// 清空并更新显示电压值
tft.fillRect(0, 110, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_WHITE); // 设置字体颜色为白色
tft.setCursor(10, 110); // 设置光标位置
tft.print("Voltage: ");
tft.print(voltage, 2); // 保留两位小数
tft.println(" V");
// 清空并更新显示角度范围
tft.fillRect(0, 140, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_MAGENTA); // 设置字体颜色为品红色
tft.setCursor(10, 140); // 设置光标位置
tft.print("Angle Range: 0-270");
// 清空并更新显示角度值
tft.fillRect(0, 160, 240, 20, ST77XX_BLACK); // 清空上一行显示的内容
tft.setTextColor(ST77XX_WHITE); // 设置字体颜色为白色
tft.setCursor(10, 160); // 设置光标位置
tft.print("Angle: ");
tft.print(angle, 1); // 保留一位小数
tft.println(" deg");
// 保存当前 ADC 数值,以便下次与其比较
lastAdcValue = adcValue;
}
// 延时 200 毫秒,便于观察数值变化
delay(200);
}