#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TM1637Display.h>
// OLED屏幕设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// TM1637数码管设置
#define CLK_PIN 4 // SCLK连接到IO4
#define DIO_PIN 5 // DIO连接到IO5
TM1637Display segmentDisplay(CLK_PIN, DIO_PIN);
// MQ2传感器引脚定义
#define MQ2_AOUT 15 // AOUT连接到IO15
#define MQ2_DOUT 16 // DOUT连接到IO16
// 计时变量
unsigned long seconds = 0;
bool timerRunning = true;
void setup() {
// 初始化I2C通信,设置OLED的SCL和SDA引脚
Wire.begin(7, 6); // SDA=7, SCL=6
// 初始化OLED屏幕
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;); // 初始化失败则循环等待
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 20);
display.print("HELLO");
display.display();
// 初始化数码管
segmentDisplay.setBrightness(7); // 设置亮度,0-7
segmentDisplay.clear();
// 初始化MQ2传感器引脚
pinMode(MQ2_DOUT, INPUT);
// 初始化定时器,每1秒触发一次中断
noInterrupts();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 设置比较值,使定时器每1秒触发一次
OCR1A = 15624; // 16MHz / 1024 prescaler = 15625Hz, 15625-1=15624
TCCR1B |= (1 << WGM12); // CTC模式
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024预分频
TIMSK1 |= (1 << OCIE1A); // 允许定时器比较中断
interrupts();
}
void loop() {
// 读取MQ2传感器数据
int gasValue = analogRead(MQ2_AOUT);
bool gasDetected = digitalRead(MQ2_DOUT);
// 更新OLED显示
display.clearDisplay();
// 显示HELLO
display.setTextSize(2);
display.setCursor(20, 0);
display.print("HELLO");
// 显示MQ2传感器数据
display.setTextSize(1);
display.setCursor(0, 30);
display.print("Gas Level: ");
display.print(gasValue);
display.setCursor(0, 45);
display.print("Gas Detect: ");
display.print(gasDetected ? "YES" : "NO");
display.display();
// 更新数码管显示
updateSegmentDisplay();
delay(200); // 短暂延迟,避免频繁刷新
}
// 更新数码管显示
void updateSegmentDisplay() {
// 显示格式为MM:SS
int minutes = seconds / 60;
int secs = seconds % 60;
// 组合成4位数字,前两位是分钟,后两位是秒
int number = minutes * 100 + secs;
// 显示数字,添加冒号分隔
segmentDisplay.showNumberDec(number, true, 4, 0);
}
// 定时器中断服务程序,每1秒增加一次秒数
ISR(TIMER1_COMPA_vect) {
if(timerRunning) {
seconds++;
}
}