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

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) { 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
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
Deixe uma resposta