⬤ Intermédio

💨 Sensor de Gás MQ-2

⏱️ 30 min 🧩 MQ-2 — A1 (analógico) · D7 (digital)

Exercícios

📌 Pinagem na placa de interface

MóduloConector InterfacePino ArduinoNotas
💨 MQ-2 — Analógico GAS_A A1 Concentração contínua 0–1023
💨 MQ-2 — Digital GAS_D D7 LOW = gás acima do limiar (ajustável com potenciómetro)

ℹ️ Como funciona o MQ-2?

🔬
Principio de funcionamento: O MQ-2 usa um elemento de óxido de estanho (SnO₂) que reduz a resistência quando exposto a gases combustíveis. A variação de resistência traduz-se numa tensão analógica lida pelo Arduino. Deteta: gás butano, propano, metano (gás natural), fumo e álcool.
⚠️
Tempo de aquecimento obrigatório: Após ligar a alimentação, o sensor precisa de 2–3 minutos para estabilizar. Durante esse período pode emitir leituras elevadas mesmo sem gás presente. Aguarda sempre antes de usar as leituras.

Valores de referência em condições normais de sala (sem gás):

100–300 Ar limpo
(valor analógico típico)
400–600 Concentração baixa
(atenção)
700+ Concentração elevada
(alarme)
💡
Calibração: Os limiares exactos variam com cada sensor, temperatura e humidade. Usa o Exercício 1 para observar os valores no teu ambiente antes de definir um limiar de alarme adequado.

Exercício 1 — Leitura analógica no Monitor Série

Lê continuamente o valor analógico do sensor e imprime no Monitor Série. Aproxima um isqueiro (sem acender!) ou acende um fósforo para observar a subida dos valores.

ex1_gas_leitura.ino
#define MQ2_ANA A1

void setup() {
  Serial.begin(9600);
  Serial.println("A aguardar aquecimento do sensor (30s)...");
  delay(30000);   // 30s de aquecimento mínimo
  Serial.println("Sensor pronto. A ler...");
}

void loop() {
  int gas = analogRead(MQ2_ANA);

  Serial.print("Gas: ");
  Serial.println(gas);

  delay(500);
}

Exercício 2 — Alarme simples com limiar digital

Usa a saída digital do MQ-2 (pino D7) cujo limiar é ajustado pelo potenciómetro no módulo. Quando o nível de gás ultrapassa o limiar, D7 vai a LOW — acende LED vermelho e toca buzzer.

ex2_gas_alarme_digital.ino
#define MQ2_DIG    7
#define LED_BRANCO 5
#define BUZZER     6

void setup() {
  pinMode(MQ2_DIG,    INPUT);
  pinMode(LED_BRANCO, OUTPUT);
  pinMode(BUZZER,     OUTPUT);
  Serial.begin(9600);
  delay(30000);   // Aquecimento obrigatório
  Serial.println("Sistema de alarme de gas ativo.");
}

void loop() {
  int alerta = digitalRead(MQ2_DIG);

  if (alerta == LOW) {   // LOW = gás acima do limiar
    digitalWrite(LED_BRANCO, HIGH);
    tone(BUZZER, 800);   // Som contínuo de alarme
    Serial.println("ALERTA: Gas detetado!");
  } else {
    digitalWrite(LED_BRANCO, LOW);
    noTone(BUZZER);
  }

  delay(200);
}

Exercício 3 — Alarme com três níveis (analógico)

Usa o pino analógico A1 para distinguir três níveis de concentração — ar limpo, atenção e perigo — com respostas progressivamente mais intensas.

⚠️ Lógica de Alarme por Níveis

A1 < 400 🟢 Ar limpo — LEDs apagados, buzzer silencioso
400–700 🟡 Atenção — LED branco pisca lentamente, buzzer 2 bips
A1 > 700 🔴 PERIGO — LED branco contínuo, buzzer alarme rápido, Serial.print urgente
ex3_gas_niveis.ino
#define MQ2_ANA    A1
#define LED_BRANCO  5
#define LED_AMARELO 6  // Nota: LED amarelo é D6 — repartilha com buzzer
#define BUZZER      6  // Usar apenas um de cada vez

#define LIMIAR_ATENCAO  400
#define LIMIAR_PERIGO   700

void setup() {
  pinMode(LED_BRANCO,  OUTPUT);
  Serial.begin(9600);
  Serial.println("A aquecer sensor MQ-2 (30s)...");
  delay(30000);
  Serial.println("Pronto. Monitorizar gas.");
}

void loop() {
  int gas = analogRead(MQ2_ANA);

  if (gas < LIMIAR_ATENCAO) {
    // Ar limpo
    digitalWrite(LED_BRANCO, LOW);
    noTone(BUZZER);
    Serial.println("OK — Ar limpo");

  } else if (gas < LIMIAR_PERIGO) {
    // Atenção: pisca LED e 2 bips
    digitalWrite(LED_BRANCO, HIGH);
    delay(300);
    digitalWrite(LED_BRANCO, LOW);
    tone(BUZZER, 600, 100);
    delay(200);
    tone(BUZZER, 600, 100);
    Serial.print("ATENCAO: Gas="); Serial.println(gas);

  } else {
    // PERIGO: LED ligado + buzzer alarme rápido
    digitalWrite(LED_BRANCO, HIGH);
    tone(BUZZER, 1000, 100);
    delay(120);
    tone(BUZZER, 800, 100);
    delay(120);
    Serial.print("!!! PERIGO: Gas="); Serial.println(gas);
  }
}

Exercício 4 — Alarme completo com buzzer e LCD

Integra o sensor MQ-2 com o display LCD 1602. Mostra o valor de gás na primeira linha e o estado do alarme na segunda. Toca buzzer e pisca LED em caso de perigo.

ex4_gas_alarme_lcd.ino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define MQ2_ANA    A1
#define LED_BRANCO  5
#define BUZZER      6  // Buzzer passivo

#define LIMIAR_PERIGO  600

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  pinMode(LED_BRANCO, OUTPUT);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0); lcd.print("Gas: A aquecer");
  lcd.setCursor(0, 1); lcd.print("Aguarda 30s...");
  delay(30000);
  lcd.clear();
}

void loop() {
  int gas = analogRead(MQ2_ANA);

  // Linha 1: valor de gás
  lcd.setCursor(0, 0);
  lcd.print("Gas: ");
  lcd.print(gas);
  lcd.print("     ");  // Limpa dígitos antigos

  if (gas > LIMIAR_PERIGO) {
    // ALARME
    lcd.setCursor(0, 1);
    lcd.print("!! GAS DETETADO !!");
    digitalWrite(LED_BRANCO, HIGH);
    tone(BUZZER, 1000, 200);
    delay(250);
    tone(BUZZER, 700, 200);
    delay(250);
  } else {
    // Normal
    lcd.setCursor(0, 1);
    lcd.print("Estado: OK      ");
    digitalWrite(LED_BRANCO, LOW);
    noTone(BUZZER);
    delay(500);
  }
}

🏆 Desafios