#include <LiquidCrystal_I2C.h>
// MQ2传感器引脚定义
#define MQ2pin 8
// LCD配置
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// 创建LCD对象
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// 变量定义
int sensorValue; // 存储传感器数字值
int analogValue; // 存储传感器模拟值(如果使用模拟输入)
int pollutionIndex; // 污染指数
const int wtimes = 20; // wtimes(秒)
void setup() {
// 初始化串口
Serial.begin(9600);
// 初始化LCD
lcd.init();
lcd.backlight(); // 打开背光
lcd.clear(); // 清屏
// 设置传感器引脚模式
pinMode(MQ2pin, INPUT);
Serial.println("MQ2传感器预热中...");
// 预热倒计时显示
lcd.setCursor(0, 0);
lcd.print("MQ2 Warming up");
for (int i = wtimes; i > 0; i--) {
lcd.setCursor(0, 1);
lcd.print("Time: ");
lcd.print(i);
lcd.print("s");
lcd.print(" "); // 清除剩余字符
delay(1000); // 每秒更新一次
}
// 清除LCD
lcd.clear();
Serial.println("预热完成!");
}
void loop() {
// 读取传感器数字值
sensorValue = digitalRead(MQ2pin);
// 如果使用模拟引脚,可以读取模拟值来计算污染指数
// 这里假设使用模拟引脚A0作为示例(实际使用时需要修改接线)
analogValue = analogRead(A0);
// 计算污染指数(根据模拟值映射到0-100)
pollutionIndex = map(analogValue, 0, 1023, 0, 100);
// 串口输出信息
Serial.print("Digital Output: ");
Serial.print(sensorValue);
Serial.print(" | Analog Value: ");
Serial.print(analogValue);
Serial.print(" | Pollution Index: ");
Serial.print(pollutionIndex);
Serial.print("%");
// 烟雾检测状态
if (sensorValue) {
Serial.println(" | Smoke: -");
} else {
Serial.println(" | Smoke: Detected!");
}
// LCD显示
lcd.clear();
// 第一行显示传感器状态
lcd.setCursor(0, 0);
lcd.print("Sensor: ");
lcd.print(sensorValue);
// 显示烟雾检测状态
lcd.setCursor(10, 0);
if (sensorValue) {
lcd.print("Safe");
} else {
lcd.print("ALERT!");
}
// 第二行显示污染指数
lcd.setCursor(0, 1);
lcd.print("Pollution: ");
lcd.print(pollutionIndex);
lcd.print("%");
// 根据污染指数显示状态
lcd.setCursor(12, 1);
if (pollutionIndex < 30) {
lcd.print("Good");
} else if (pollutionIndex < 60) {
lcd.print("Mid");
} else {
lcd.print("Bad");
}
// 延时1秒
delay(1000);
}