Bafômetro Digital

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:

Arduino Uno

Sensor de Gás MQ-3 Álcool

Display 7 Segmentos (Cátodo Comum)

8 Resistores 470 ohms

1 Resistor 10K ohms

1 Push Button (Chave Táctil)

 

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:

 

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;
}
}}

Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Venha compartilhar conhecimento com toda a comunidade maker!

 

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 <= 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) // UM
  {
   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

Avatar
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.


*