Alarme detector de gás e fumaça com ESP32 e MQ-2
Neste projeto, um módulo sensor de gás MQ-2 detecta gases combustíveis (LPG, metano e propano) e fumaça, acionando um alarme tipo sirene em um buzzer passivo. A saída digital de limiar (DO) do sensor é conectada ao GPIO 4 do ESP32. Quando a concentração de gás ou fumaça ultrapassa o limiar, DO passa para LOW e o alarme é acionado. A sensibilidade é ajustada pelo potenciômetro do módulo. O buzzer passivo é acionado com `tone()` para criar um efeito de sirene que alterna entre duas frequências.

Vídeo
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 MQ-2 Gas/Smoke Detector Alarm
4// ─────────────────────────────────────────
5// Reads the digital threshold output (DO) of the MQ-2 module. When gas or
6// smoke passes the threshold, the warning LED turns on and the passive
7// buzzer plays a siren switching between 800 and 1200 Hz every 0.2 s. Set
8// the threshold with the trimpot on the module (Arduino Core 3.0+).
9//
10// Pins:
11// GPIO 4 -> MQ-2 DO (digital threshold output)
12// GPIO 18 -> Buzzer + leg
13// GPIO 5 -> Red LED (with a 220 ohm resistor)
14// MQ-2 VCC -> MQ-2 VCC -> 5V (VIN), GND -> GND
15
16// Pin definitions
17const int MQ2_DO_PIN = 4; // MQ-2 D0 (digital threshold out)
18const int BUZZER_PIN = 18; // Passive buzzer
19const int LED_PIN = 5; // Warning LED + 220R
20
21// Warm-up time (ms): the MQ-2 heater needs minutes to warm up. In Wokwi 2000 is enough.
22const unsigned long WARMUP_MS = 60000;
23bool warmedUp = false; // Is the warm-up over
24
25void setup() {
26 pinMode(MQ2_DO_PIN, INPUT);
27 pinMode(BUZZER_PIN, OUTPUT);
28 pinMode(LED_PIN, OUTPUT);
29 digitalWrite(BUZZER_PIN, LOW);
30 digitalWrite(LED_PIN, LOW);
31}
32
33void loop() {
34 // Warm-up: the DO reading is ignored, the LED blinks slowly without blocking
35 if (!warmedUp) {
36 if (millis() < WARMUP_MS) {
37 digitalWrite(LED_PIN, (millis() / 500) % 2); // 0.5 s on, 0.5 s off
38 return;
39 }
40 warmedUp = true;
41 }
42
43 // MQ-2 D0 is normally HIGH and goes LOW above the threshold
44 int gasState = digitalRead(MQ2_DO_PIN);
45
46 if (gasState == LOW) {
47 // Alarm: the LED turns on, the buzzer plays a two-tone siren
48 digitalWrite(LED_PIN, HIGH);
49 tone(BUZZER_PIN, 800); // Low tone
50 delay(200);
51 tone(BUZZER_PIN, 1200); // High tone
52 delay(200);
53 } else {
54 // Idle: LED and buzzer off
55 digitalWrite(LED_PIN, LOW);
56 noTone(BUZZER_PIN);
57 delay(50);
58 }
59}
60
Perguntas frequentes
Quais gases o MQ-2 detecta?▾
O MQ-2 é sensível a LPG, propano, metano, hidrogênio, vapor de álcool e fumaça. Ele não distingue os gases; apenas detecta um aumento na concentração total.
A saída analógica do MQ-2 pode ser conectada diretamente ao ESP32?▾
O MQ-2 é alimentado com 5 V, e sua saída analógica pode chegar a 5 V. Como a entrada ADC do ESP32 aceita no máximo 3,3 V, é necessário usar um divisor de tensão (por exemplo, 10 kΩ + 20 kΩ).
Por que o sensor mostra uma leitura alta logo ao ligar?▾
O aquecedor dos sensores MQ leva alguns minutos para se estabilizar; nesse período, as leituras ficam altas. Desativar o alarme por alguns minutos após ligar evita alarmes falsos.
Como o efeito de sirene é criado?▾
O buzzer passivo é acionado com `tone()` para alternar rapidamente entre duas frequências diferentes (por exemplo, 800 Hz e 1.200 Hz). Essa alternância imita o som clássico de um alarme.
