Allarme rilevatore di gas/fumo ESP32 MQ-2
In questo progetto, il rilevamento di gas combustibili (GPL, metano, propano) e fumo viene effettuato tramite un modulo sensore di gas MQ-2; al rilevamento viene emesso un segnale acustico simile a una sirena tramite un cicalino passivo. L'uscita digitale di soglia (DO) del sensore viene collegata al GPIO 4 dell'ESP32; quando gas o fumo superano la soglia, DO passa a LOW e l'allarme si attiva. La sensibilità si regola tramite il potenziometro del modulo. Il cicalino è pilotato con `tone()`.

Video
Schema circuito

Codice sorgente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Allarme rilevatore di gas/fumo ESP32 MQ-2
4// ─────────────────────────────────────────
5// Legge l'uscita digitale a soglia (DO) del modulo MQ-2. Quando gas o fumo
6// superano la soglia, il LED di avviso si accende e il buzzer passivo
7// suona una sirena che alterna 800 e 1200 Hz ogni 0.2 s. Imposta la soglia
8// con il trimmer sul modulo (Arduino Core 3.0+).
9//
10// Pin:
11// GPIO 4 -> DO dell'MQ-2 (uscita a soglia digitale)
12// GPIO 18 -> Piedino + del buzzer
13// GPIO 5 -> LED rosso (con una resistenza da 220 ohm)
14// MQ-2 VCC -> VCC dell'MQ-2 -> 5V (VIN), GND -> GND
15
16// Definizione dei pin
17const int MQ2_DO_PIN = 4; // D0 dell'MQ-2 (uscita a soglia digitale)
18const int BUZZER_PIN = 18; // Buzzer passivo
19const int LED_PIN = 5; // LED di avviso + 220R
20
21// Tempo di riscaldamento (ms): il riscaldatore dell'MQ-2 richiede minuti. In Wokwi bastano 2000.
22const unsigned long WARMUP_MS = 60000;
23bool warmedUp = false; // Il riscaldamento è finito?
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 // Riscaldamento: la lettura di DO viene ignorata, il LED lampeggia piano senza bloccare
35 if (!warmedUp) {
36 if (millis() < WARMUP_MS) {
37 digitalWrite(LED_PIN, (millis() / 500) % 2); // 0.5 s acceso, 0.5 s spento
38 return;
39 }
40 warmedUp = true;
41 }
42
43 // D0 dell'MQ-2 è normalmente HIGH e va LOW sopra la soglia
44 int gasState = digitalRead(MQ2_DO_PIN);
45
46 if (gasState == LOW) {
47 // Allarme: il LED si accende, il buzzer suona una sirena a due toni
48 digitalWrite(LED_PIN, HIGH);
49 tone(BUZZER_PIN, 800); // Tono grave
50 delay(200);
51 tone(BUZZER_PIN, 1200); // Tono acuto
52 delay(200);
53 } else {
54 // A riposo: LED e buzzer spenti
55 digitalWrite(LED_PIN, LOW);
56 noTone(BUZZER_PIN);
57 delay(50);
58 }
59}
60FAQ
Quali gas rileva l'MQ-2?▾
L'MQ-2 è sensibile al GPL, al propano, al metano, all'idrogeno, ai vapori di alcol e al fumo. Non è in grado di distinguere il tipo di gas; rileva solo l'aumento della densità complessiva.
L'uscita analogica dell'MQ-2 può essere collegata direttamente all'ESP32?▾
L'MQ-2 è alimentato a 5 V e la sua uscita analogica può raggiungere i 5 V. Poiché l'ingresso ADC dell'ESP32 accetta al massimo 3,3 V, è necessario utilizzare un partitore di tensione (ad es. 10 kΩ + 20 kΩ).
Il sensore mostra un valore elevato al primo avvio, perché?▾
Il riscaldatore dei sensori MQ impiega alcuni minuti per stabilizzarsi; durante questo periodo i valori rilevati risultano elevati. Disattivare l'allarme per alcuni minuti dopo l'accensione consente di evitare falsi allarmi.
Come si crea l'effetto sirena?▾
Il buzzer passivo viene pilotato tramite la funzione tone() in modo da oscillare rapidamente tra due diverse frequenze (ad es. 800 Hz e 1200 Hz). Questa oscillazione riproduce il classico suono di un allarme.
