Bafômetro Digital com Arduino

Os cervejeiros de plantão sabem muito bem que aquele chopp ou cervejinha nas festas ou baladas é algo muito prazeroso e é sempre bom poder relaxar um pouco, afinal de ninguém é de ferro, mas direção e álcool são coisas que definitivamente não combinam e já faz tempo que é uma infração grave de trânsito, com punições severas aos infratores. Claro que nós do Portal do Arduino apoiamos esta causa, bebida e direção não combinam, e através desse projeto propomos uma ideia simples e divertida de abordar o tema, um bafômetro digital que indica numa escala de 0 á 10 seu nível de teor alcoólico.

Já pensou, no fim daquele happy hour você tira o dispositivo e começa a medir seus colegas? Tem aquele que encheu a cara e logo o medidor acusa nível 9 ou 10, e também aqueles que bebem socialmente nível 2 ou 3. A finalidade deste projeto é somente essa, mas logo avisamos que os resultados do dispositivo não têm nenhuma semelhança com o instrumento profissional utilizado em blitz policiais.

Montando o projeto

Para o desenvolvimento desse projeto será necessária uma placa Arduino Uno, onde ela será responsável por receber os sinais do Sensor de Gás MQ-3 Álcool e através do código e dos resultados obtidos, indicar no Display 7 Segmentos (Cátodo Comum) o nível respectivo de álcool presente no ar.

Sua rotina será a seguinte:

O dispositivo inicia com o aquecimento do sensor de gás e logo após fica aguardando o usuário pressionar o Push Button (Chave Táctil)  para realizar a leitura e posteriormente apresentar o resultado.

Componentes Utilizados:

A montagem do protótipo pode ser observada pela figura abaixo:

Inicialmente vamos ligar o sensor de gás ao Arduino uno, sua alimentação é de +5V podendo ser proveniente do próprio Arduino, utilizaremos a saída analógica do sensor de gás, pois nos interessa estas variações para obter o resultado desejado, de diferentes níveis de álcool no ar sendo apresentados.

O display de 7 segmentos necessita em cada LED interno um resistor para limitar sua corrente como podemos ver na figura acima, utilizamos o valor de 470 ohms.

Um resistor pull dowm foi aplicado ao push button para a entrada do Arduino não reconhecer valores flutuantes que não sejam 0 ou 1.

Abaixo também temos na prática a montagem do protótipo:

Montagem prática do projeto

O vídeo demonstrando o funcionamento desse projeto pode ser acessado pela página no Instagram:

https://www.instagram.com/laboratorio_dosfundos/

Desenvolvendo o código

O Código como pode ser observado abaixo, será carregado para o microcontrolador ATMEGA 328p do Arduino:

#define button 2 // define pino 2 com o nome button
int tempo=0; // cria a variavel tempo
int lidomaximo=0; // cria a variavel lidomaximo

void setup(){
pinMode(10,OUTPUT); pinMode(9,OUTPUT); pinMode(8,OUTPUT); pinMode(7,OUTPUT); // definindo os pinos como saida para o display
pinMode(6,OUTPUT); pinMode(5,OUTPUT); pinMode(4,OUTPUT); pinMode(3,OUTPUT);
pinMode(2,INPUT); // entrada de sinal do push button
Serial.begin(9600); // inicia a comunicação serial

 digitalWrite(4,HIGH);   delay(1000); digitalWrite(4,LOW);  // aquecimento do sensor
 digitalWrite(6,HIGH);  delay(1000); digitalWrite(6,LOW);
 digitalWrite(8,HIGH); delay(1000); digitalWrite(8,LOW);
 digitalWrite(4,HIGH);   delay(1000); digitalWrite(4,LOW);
 digitalWrite(6,HIGH);  delay(1000); digitalWrite(6,LOW);
 digitalWrite(8,HIGH); delay(1000); digitalWrite(8,LOW); 
 digitalWrite(4,HIGH);   delay(1000); digitalWrite(4,LOW);
 digitalWrite(6,HIGH);  delay(1000); digitalWrite(6,LOW);
 digitalWrite(8,HIGH); delay(1000); digitalWrite(8,LOW);
 digitalWrite(4,HIGH);   delay(1000); digitalWrite(4,LOW);
 digitalWrite(6,HIGH);  delay(1000); digitalWrite(6,LOW);
 digitalWrite(8,HIGH); delay(1000); digitalWrite(8,LOW);
}

void loop(){


  digitalWrite(10,HIGH);
  int leitura_button = digitalRead(button);
  if (leitura_button == 1){

    for(tempo=0;tempo<=31;tempo++){ // Leitura do sensor "31 amostras" 
      int sensor = analogRead(A0);
      digitalWrite(10,HIGH);
      Serial.println(lidomaximo);
      delay(100);
      digitalWrite(10,LOW);
      delay(100);
      if(sensor > lidomaximo) // guarda na variavel "lidomaximo" o valor máximo recebido pelo sensor
      {
        lidomaximo = sensor; 
      }

    }

//******************************************RESULTADO


      if (lidomaximo < 250) // ZERO
  {
    digitalWrite(8,HIGH);digitalWrite(7,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(3,HIGH);digitalWrite(4,HIGH);
    digitalWrite(5,HIGH);digitalWrite(9,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;

  }
  else if (2250 < lidomaximo && lidomaximo < 275) // UM
  {
    digitalWrite(9,HIGH); digitalWrite(5,HIGH); // pinos em HIGH para indicar o numeral no display
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW);// limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
  else if (275 < lidomaximo && lidomaximo < 300) // DOIS
  {
    digitalWrite(8,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(3,HIGH);
    digitalWrite(4,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (300 < lidomaximo && lidomaximo < 325) // TRES
  {
    digitalWrite(8,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(4,HIGH);
    digitalWrite(5,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (325 < lidomaximo && lidomaximo < 350) // QUATRO
  {
    digitalWrite(5,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(7,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (350 < lidomaximo && lidomaximo < 375) // CINCO
  {
    digitalWrite(8,HIGH); digitalWrite(4,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(7,HIGH);
    digitalWrite(5,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (400 < lidomaximo && lidomaximo < 450) // SEIS
  {
    digitalWrite(3,HIGH); digitalWrite(6,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(5,HIGH); digitalWrite(4,HIGH);
    digitalWrite(7,HIGH); digitalWrite(8,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (450 < lidomaximo && lidomaximo < 500) // SETE
  {
    digitalWrite(8,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(5,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
    else if (500 < lidomaximo && lidomaximo < 550) // OITO
  {
    digitalWrite(8,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(7,HIGH);
    digitalWrite(5,HIGH); digitalWrite(4,HIGH);
    digitalWrite(3,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
   else if (lidomaximo > 550) // NOVE
  {
    digitalWrite(8,HIGH); digitalWrite(9,HIGH); // pinos em HIGH para indicar o numeral no display
    digitalWrite(6,HIGH); digitalWrite(7,HIGH);
    digitalWrite(5,HIGH); digitalWrite(4,HIGH);
    delay(10000);
    digitalWrite(3,LOW); digitalWrite(4,LOW); // limpa o digito apresentado no display
    digitalWrite(5,LOW); digitalWrite(6,LOW);
    digitalWrite(7,LOW); digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    lidomaximo = 0;
  }
}}




Github Arduino Ômega
Acesso o código completo deste tutorial em nosso GitHub!

Mergulhando no projeto

Software

Inicialmente definimos e criamos algumas variáveis:

#define button 2
int tempo=0;
int lidomaximo=0;

Função Setup

Na função setup, definimos as portas para o display como saídas digitais e o push button como entrada.

Logo após, segue uma série de comandos para o display onde se repetem 4 vezes a fim de indicar o aquecimento do sensor de gás.

Função Loop

Após o aquecimento do sensor o programa entra na função loop aguardando o prescionamento do button:

int leitura_button = digitalRead(button);
if (leitura_button == 1){

Assim que o button é pressionado o programa entra no laço for onde ele coleta 30 amostras recebidas do sensor de gás:

for(tempo=0; tempo &lt;= 31; tempo++){ // Leitura do sensor "31 amostras"
int sensor = analogRead(A0);

Sempre o maior valor obtido destas leituras é armazenado na variável lidomaximo:

if(sensor < lidomaximo)
{
        lidomaximo = sensor;
 }

Após as 30 amostragens e o valor máximo obtido salvo na variável lidomaximo partimos para o resultado a ser apresentado no display. Os resultados são apresentados em uma escala de 0 á 10, onde 0 não apresenta álcool algum presente no ar e 10 nível máximo. Os valores calibrados neste projeto foram adequados para uma esponja com álcool em gel, mas podem ser reajustados conforme deseja.

Um numeral é apresentado no display por 10 segundos e após a variável lidomaximo é zerada e o dispositivo fica pronto para próxima aferição.

else if (2250 > lidomaximo && lidomaximo > 275)
 {
digitalWrite(9,HIGH); digitalWrite(5,HIGH);
 delay(10000);
 digitalWrite(3,LOW); digitalWrite(4,LOW);
digitalWrite(5,LOW); digitalWrite(6,LOW);
digitalWrite(7,LOW); digitalWrite(8,LOW);
digitalWrite(9,LOW);
lidomaximo = 0;
}

Hardware

Sensor de Gás MQ-3 Álcool

Este Sensor de Gás MQ-3 Álcool é um módulo capaz de detectar vapores de álcool e etanol, um sensor muito usado em projetos de bafômetro e de fácil conexão com microcontroladores como Arduino e Raspberry Pi.

Seu funcionamento é simples, quando a concentração de álcool fica acima do nível ajustado pelo potenciômetro, a saída DOUT fica em estado alto, se abaixo do nível, fica em estado baixo. Uma ótima opção para acionar um microcontrolador ou relés.

Quem deseja ter uma resolução melhor como a nossa deste projeto, basta usar a saída AOUT e conectar a um conversor AD, como a presente no Arduino e Raspberry Pi.

Pinagem:

– VCC: 5V

– GND: Terra

– DOUT: Saída Digital

– AOUT: Saída Analógica

Display 7 Segmentos (Cátodo Comum)

Display de 7 segmentos clássico dígitos na cor vermelha, muito utilizados em projetos eletrônicos como contadores e relógios. Configuração catodo comum e 1 digito.

Pinagem:

Conclusão

Com a montagem deste dispositivo podemos conhecer mais sensor de gás MQ-3, conhecendo seu modo de operação e implementando em nosso projeto. Agora aquele seu amigo que insiste em voltar dirigindo após umas bebidas pode pensar duas vezes na escolha e chamar um uber quando seu nível cravar em 10. LOL.  A mensagem que fica é de conscientização que bebida e direção não combinam.

Deixem suas sugestões e perguntas, compartilhe conhecimento!

Referências

Data Sheet Sensor de Gás MQ-3 Álcool

https://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf

Sobre Pedro Pereira 8 artigos
Engenheiro Eletricista, Técnico em Eletrônica e Entusiasta na área de Sistemas Embarcados. https://www.instagram.com/laboratorio_dosfundos/

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*