Manual

do

Maker

.

com

Sensor MQ-6 para gás, álcool e fumaça com Arduino

Sensor MQ-6 para gás, álcool e fumaça com Arduino

Sensor MQ-6 para gás

Existem diversos sensores específicos para cada tipo de gás e fumaça, mas esse sensor MQ-6 para gás parece ser o mais completo deles. E tive de verdade uma motivação para utilizá-lo. Certo dia eu estava cozinhando e cuidando de minha  filha, então entre as tarefas me desloquei para a cozinha para  ligar uma outra chama e tornei para a sala. Depois de algum tempo, comecei a sentir o cheiro do gás encanado e claro, me assustei bastante porque para chegar a sentir o cheiro do gás em outro ambiente, o vazamento deve estar realmente grande. Isso porque o gás é mais pesado que o ar e ele tende a descer. Já pensou no volume  de gás que  estava no ambiente? E por isso decidi que a cozinha é um ambiente que realmente merece um pouco dos cuidados  de um maker.

Características

Conforme o datasheet, esse sensor detecta gás GLP (Gás Liquefeito de Petróleo - o tradicional gás de cozinha), Propano, Isobutano e GNL (Gás Natural Liquefeito). Se fosse só isso já valeria a pena, mas esse danadinho tem uma baixa sensibilidade também para álcool e fumaça. Não é perfeito para sua cozinha?

Ele possui um trimpot para ajuste da sensibilidade, com concentrações entre 200ppm e 10.000ppm. É um sensor durável e de bastante confiabilidade, com tempo de resposta baixíssimo, o que permite coletar amostragens com maior frequência.

Sua tensão de funcionamento é 5V e sua resistência depende de uma determinada corrente, tendo um consumo de 150mA. Isso significa que sua alimentação não deve advir diretamente do Arduino; utilize uma fonte de celular ou qualquer outra fonte 5V que forneça uma corrente maior que a demandada.

Onde comprar?

Esse sensor você encontra nesse link da UsinaInfo, e pela segurança e confiabilidade, está quase de graça.

Pinout

A ligação com o dispositivo é bastante simples, bastando conectá-lo à fonte de alimentação, tendo o cuidado de colocar GND também  a um GND do Arduino. O pino A0 deve ser conectado a uma saída analógica do Arduino e o pino D0 pode ser utilizado em um pino digital do Arduino para receber eventos. Nesse caso, vamos utilizá-lo conectando-o a um pino de interrupção, de modo que não será necessário coletar amostragens periódicas enquanto não houver eventos, mas lembre-se que primordialmente você deverá ajustar a sensibilidade do dispositivo no trimpot.

mq6-pinout.webp

A imagem foi um Ctrl+Chups do google images.

Wiring

Infelizmente estou sem Arduino Nano agora. Eu prefiro ele sobre qualquer outro Arduino, principalmente pela base de expansão de GPIO, o que reduz o trabalho do wiring. Se desejar essa experiência (que pretendo retomar em breve), pegue o Arduino Nano e o expansor na UsinaInfo também e aproveite um frete só. Vamos aproveitar e gerar um alarme sonoro utilizando esse buzzer com som de sirene (exemplificado nesse outro artigo).

mq6_com_sirene-wiring.webp

A parte legal desse wiring é que realmente não precisaremos de nenhum resistor, mas muita atenção! Não faça a alimentação diretamente no Arduino porque o MQ-6 consome 150mA. Simplesmente coloque o 5V da fonte na protoboard ou diretamente no sensor MQ-6 para gás e o GND da fonte junto a um GND do Arduino, ambos conectados à protoboard. Pegue o GND para o sensor MQ-6 da protoboard.

Não é realmente necessário utilizar o pino analógico

Isso porque como se tem uma interrupção disponível, basta fazer um teste inicial vazando gás de propósito para testar o dispositivo e calibrá-lo no trimpot. Em minha humilde opinião, qualquer coisa acima de 0 deveria gerar alarme. No código de exemplo estou fazendo a leitura analógica para exemplificar, mas tudo o que preciso é do pino digital mesmo.

Código

A lógica aplicada é simples:

  • O pino digital é ligado à interrupção no pino 2.
  • Quando ocorrer um evento, o sensor emitirá um sinal então;
  • No loop() do Arduino deixamos um boolean a ser verificado.
  • Implementamos uma ISR para a interrupção, cuja tarefa será modificar o boolean de alarme.
  • Quando o loop reagir ao evento, ele tocará a sirene por 5 segundos e mudará o estado do boolean.
  • Se o evento ocorrer novamente, o processo se repete.

è fundamental que a ISR não fique presa. Sua tarefa é simplesmente disparar um evento e retomar sua rotina, por isso não deve ser implementado código na função de interrupção.

Erros

Coloquei 2 bugs no sketch. Será necessário diminuir o tempo do alarme e refazer o cálculo do ppm. Como estou escrevendo um artigo mais complexo (sobre outro tema), resolvi deixar mesmo só a parte de alarme aqui, mas vou deixar todas as variáveis que serão utilizadas futuramente, quando eu for instalar na minha cozinha.

Caso tenha dúvidas, dê uma olhada no datasheet do MQ6.

#define GAS_ALARM_PIN 2
#define MQ6_READ A0
#define BUZZER_PIN 8
#define LOOP_ALARM_TIMES 10
#define RESISTENCE 20.0
#define SAMPLES_A0 10
#define AIR_CLEAN 10.0
#define GLP 0
#define CH4 1

float GLP_CURVE[] ={2.99, 0, -0.4};
float CH4_CURVE[] ={3.3,  0, -0.38};

float sinVal  = 0.0;
float toneVal = 0.0;

bool  alert   = false;

void alarm(){
  for (int i=0;i<180;i++){
    sinVal  = sin(i*(3.1412/180));
    toneVal = 2000+(int(sinVal*100));
    tone(BUZZER_PIN,toneVal);
    delay(2);
  }
}

void mq6Read(){
  float result = 0;
  for (int i=0;i<SAMPLES_A0;i++){
    result += analogRead(MQ6_READ);
    delay(100);
  }
  result = result/SAMPLES_A0;
  Serial.println(result);
}


void isrAlarm(){
  alert = true;
}

void setup() {
  pinMode(GAS_ALARM_PIN,INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(GAS_ALARM_PIN),isrAlarm,FALLING);
  Serial.begin(9600);

}

void loop() {
  if (alert){
    alarm();
    alert = false;
    delay(50);
  }

}

 

Pra finalizar, o video, apenas mostrando que realmente está funcionando. Utilizei um isqueiro para fazer o teste, mas não faço ideia qual é o tipo de gás usado.

https://youtu.be/G8qbDQ9ZChU

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.