Aprendendo Arduino — Parte 3B — construindo algo útil

sensuranuncamais

Previously, on Battlestar Galactica…

Nós vimos os princípios básicos de funcionamento dos semicondutores, e como algumas de suas características se revelaram úteis na fabricação de sensores de gases muito mais baratos e sensíveis que os tradicionais. Agora vamos ver como isso pode ser utilizado, em conjunto com o Arduino para construir algo… útil.

Eu tenho fobia e bujão de gás, acho incrível não termos explosões o tempo todo nas cidades. Cada vez que tenho que trocar o bujão é um parto, aquelas frações de segundo entre a válvula lacrar, enquanto o butano espirra pra fora, eu já começo a pensar Oh a Humanidade…

Descobrir se a válvula está bem conectada é outro parto. Tenho que depender da técnica neandertal de espuma de sabão. Na cozinha então… só fica a dica: se você tem gente com Alzheimer em casa, não se resfrie, vai precisar do nariz para detectar se eles abrem o gás, esquecem que vão fazer café e deixam pra lá.

Quem poderá me salvar disso? Arduino, claro, com ajuda de um módulo Sensor MQ-4.

mq-4

Como expliquei por alto no outro artigo, o uso é extremamente simples. Você tem um pino de saída digital que ninguém usa, positivo, negativo e saída analógica.

Essa saída analógica varia entre 0 volt e 5 volts, e representa concentrações de gases entre o mínimo detectável e o suficiente para saturar o detector (eu linkei a datasheet do sensor no texto anterior).

Os valores são convertidos pelo Arduino, que retorna um número entre 0 e 1.023. Se você se lembrar do primeiro artigo, vai converter 1.023 para binário e descobrir que é 1111111111. Isso significa que a conversão analógico pra digital do Arduino tem uma resolução de 10 bits.

Se você está entendendo resolução como resolução gráfica de imagens, a analogia é perfeita. A resolução de um sinal analógica significa em quantos pedaços discretos aquele sinal é representado. Usemos o bom e velho papel quadriculado. A resolução dele é de 10 quadrados por cm. Digamos que temos uma curva em uma área de 5 cm de altura por 6 cm de largura.

50bits

Se eu marcar com uma caneta cada quadradinho de 1 mm conseguirei uma aproximação muito boa da curva original:

resol01

Essa é uma amostragem com 50 bits de resolução. Para a nossa realidade isso é irreal. Trabalhamos com 10 bits, então o resultado é mais ou menos assim:

10bits

10 bits parece pouco, mas se usados como informação de cor dão 1.024 tons de cinza por pixel. Aquela fanfiqueira ficou rica com 50 tons de cinza e a sonda soviética Venera 9 transmitiu as primeira imagens da superfície de Vênus com apenas 6 bits, ou 63 tons de cinza.

c_venera09_processed

Vamos ver então nosso circuito inicial: usando só os componentes do kit de Arduino que comprei. Em um experimento inicial criaremos um circuito para transformar as informações do sensor em áudio.

Inicialmente pensei em fazer algo como um contador Geiger, mas pro áudio funcionar direito teria que usar interrupções e não é hora de falar disso ainda. A alternativa é tom contínuo, igual detectores de metal.

O resultado saiu melhor do que eu imaginava:


Carlos Cardoso — Exemplo de sensor MQ-2

Como funciona o circuito:

circuito1

A saída analógica do Sensor é ligada no pino A0 do Arduino.

Um LED verde é ligado em série com um resistor de 1 kΩ ao pino 9.

Um LED vermelho é ligado em série com um resistor de 1 kΩ ao pino 10.

O pólo positivo do buzzer é ligado ao pino 9 do Arduino.

Os negativos são ligados ao barramento negativo da protoboard, que é conectada ao negativo do Arduino.

Pino V+ do sensor é ligado ao pino 5 V do Arduino, pino negativo do sensor, ao negativo do Arduino.

Simples assim.

Agora, o programa

AVISO: o objetivo aqui é didática, não performance. Se você tem sugestões de como otimizar o código, rotinas em assembler e comandos esotéricos, mande mande um email e explicarei o que deve fazer com sua sugestão, mas pra adiantar, consiga bastante vaselina.

O programa é quase tão simples quanto o circuito:

//pinos básicos, autoexplicativo, espero.

const int buzz =8;
const int LEDSinal = 9;
const int LEDRed = 10;
uint16_t jorge;
int som = 0;
uint16_t sensor = 0;

void setup() {
pinMode(buzz,OUTPUT);
pinMode(LEDSinal,OUTPUT);
pinMode(LEDRed,OUTPUT);

//resetando botões
digitalWrite(LEDSinal,LOW);
digitalWrite(LEDRed,HIGH);

//delay de 30 segundos até o sensor aquecer.
//na fase de testes recomendo diminuir o delay.
delay(30000);
digitalWrite(LEDRed,LOW);

for (jorge = 0; jorge <3; jorge +=1) {
digitalWrite(LEDSinal, HIGH);
delay(10);
digitalWrite(LEDSinal, LOW);
delay(10);
}

}

void pisca() {
delay(20);
digitalWrite(LEDSinal,HIGH);
delay(20);
digitalWrite(LEDSinal,LOW);
}

void loop() {
delay(10);
sensor = analogRead(A0);

som = map(sensor ,10,50, 50,400);
tone(buzz,som,(1/(sensor * 10)));
pisca();
delay(50);

}

Vamos entender por partes:

const int buzz =8;
const int LEDSinal = 9;
const int LEDRed = 10;
uint16_t jorge;
int som = 0;
uint16_t sensor = 0;

Aqui nós definimos nossas variáveis principais e nossas constantes. Sempre que possível use constantes, elas são movidas pra memória FLASH e não comem sua preciosa RAM.

As três constantes buzz, LEDSinal e LEDRed funcionam como mnemônicos para facilitar a associação dos pinos com suas funções. Assim em vez de escrever um comando digitalWrite(9,HIGH) e depois ter que lembrar que diabos faz o pino 9, você escreve digitalWrite(LEDSignal,HIGH).

A variável jorge é um inteiro de 16 bits, unsigned, ou seja, sem sinal. Ele é sempre positivo. Como tem 16 bits, seu valor máximo é 1111111111111111 ou em binário 65.535. São só dois bytes, é mais seguro que usar um inteiro simples que se restringe a valores entre 0 e 255.

A variável som é um inteiro simples. Ele será a frequência gerada pelo Arduino. A função de áudio aceita valores entre 0 e 65.535 mas vamos trabalhar com com 256 variações, isso gera um resultado mais artificial e “robótico”.

sensor é uma variável de 16 bits, mas que só usaremos 10. Ela armazenará o resultado da leitura do pino A0, que recebe o sinal analógico do sensor MQ-4.

void setup() {
 pinMode(buzz,OUTPUT);
 pinMode(LEDSinal,OUTPUT);
 pinMode(LEDRed,OUTPUT);

Aqui nós definimos o que cada pino vai fazer. Todos os três são definidos como saída de dados. O pino A0 não é definido, pois por padrão ele é um pino analógico de entrada. Ele pode ser usado como um pino digital de Entrada/Saída, mas não é o caso.

//resetando botões
digitalWrite(LEDSinal,LOW);
digitalWrite(LEDRed,HIGH);

Aqui nosso circuito começa a funcionar. A primeira coisa visível que o Arduino faz é apagar o LED verde e acender o LED vermelho.

//delay de 30 segundos até o sensor aquecer.
//na fase de testes recomendo diminuir o delay.
delay(30000);
digitalWrite(LEDRed,LOW);

Uma característica dos sensores semicondutores de gases é que eles precisam de um período de aquecimento. Isso é feito para que a superfície leitora atinja uma temperatura controlada, pois a temperatura afeta o resultado da leitura. Um fio de tungstênio aquele mesmo o sensor, cuidado ao encostar na parte gradeada.

Nosso programa gera uma pausa de 30.000 milissegundos, ou 30 segundos. Após isso ele apaga o LED vermelho.

for (jorge = 0; jorge <3; jorge +=1) {
 digitalWrite(LEDSinal, HIGH);
 delay(10);
 digitalWrite(LEDSinal, LOW);
 delay(10);
 }
}

Neste ponto indicamos ao usuário que a calibragem foi feita e o sensor já está pronto para fazer leituras. Um loop de 3 iterações repete código que aciona o LED verde, pausa 10 milissegundos, apaga o LED, pausa outros 10 e o ciclo se repete até a 3ª vez.

void pisca() {
 delay(20);
 digitalWrite(LEDSinal,HIGH);
 delay(20);
 digitalWrite(LEDSinal,LOW);
}

Uma função para piscar o LED verde a cada 20 milissegundos. ao invés de repetir esse código sempre que precisar piscar o LED, é só chamar por pisca(); no código.

void loop() {
 delay(10);
 sensor = analogRead(A0);

Começa o loop principal do programa. E já começa com uma pausa. Necessária? Não, mas o sim ficou melhor com ela. Em seguida a linha

 sensor = analogRead(A0);

O que ela faz é atribuir à variável sensor o valor, entre 0 e 1023 correspondendo ao sinal no pino analógico A0.

som = map(sensor ,10,50, 50,400);
 tone(8,som,(1/(sensor * 10)));
 pisca();
 delay(50);

}

Essa linha aqui é o pulo do gato:

som = map(sensor ,10,50, 50,400);

O comando map do C do Arduino é uma espécie de regra de três. Digamos que você tenha um mapa com distância em km, e uma régua com centímetros. Você sabe que a distância entre Rio e São Paulo é de 357,65 km. No seu mapa isso dá, digamos, 11 cm. Qual a distância entre Rio e Belo Horizonte?

Usando a régua você achou 12,4 cm. E isso em km?

A função map te retornaria isso. Você usaria o comando:

distancia = map (12.4, 0,11,0, 357.65)

Essa função recebe dois conjuntos lineares de números e escala um valor no primeiro conjunto retornando o equivalente no segundo.

No nosso caso eu digo que o conjunto de valores do sensor vai de 10 a 50, é uma forma de concentrar as leituras nas baixas concentrações de gás, mas o map aceita valores fora da faixa e isso zoneou um pouco o programa. Os parâmetros seguintes dizem para retornar um valor entre 50 e 400, a faixa de frequência do som que eu quero. Baixa.

O próximo comando é o que faz barulho:

 tone(buzz,som,(1/(sensor * 10)));

Aqui eu mando ele emitir na porta buzz um tom de frequência som, com duração de 1/10 vezes o valor original do sinal analógico convertido.

O processamento então cessa por 50 milissegundos, e o loop se reinicia. É feio mas funciona.

Só tem um problema: é irritante. Esqueça tudo que fizemos, vamos pensar em outra interface.

Eu lembrei dos detectores de radiação eletromagnética que os caçadores usam em Supernatural. Será que dá pra traduzir os valores do sensor MQ-4 para um sequencial de LEDs?
Spoiler: dá.

vlcsnap-00006

Mas isso é assunto para o próximo artigo.

DISCLAIMER: parte dos componentes deste projeto foram fornecidos pelos Baú da Eletrônica, como o Sensor de Gás MQ-4. Outros eu comprei, como o Kit Arduíno Start.


Leia também:

Relacionados: , , , , ,

Autor: Carlos Cardoso

Entusiasta de tecnologia, tiete de Sagan e Clarke, micreiro, hobbysta de eletrônica pré-pic, analista de sistemas e contínuo high-tech. Cardoso escreve sobre informática desde antes da Internet, tendo publicado mais de 10 livros cobrindo de PDAs e Flash até Linux. Divide seu tempo entre escrever para o MeioBIt e promover seus últimos best-sellers O Buraco da Beatriz e Calcinhas no Espaço.

Compartilhar
  • Salles Magalhaes

    Eu tenho fobia e bujão de gás, acho incrível não termos explosões o tempo todo nas cidades. Cada vez que tenho que trocar o bujão é um parto, aquelas frações de segundo entre a válvula lacrar, enquanto o butano espirra pra fora, eu já começo a pensar “Oh a Humanidade…”

    –> Idem!! Acrescento panela de pressao a lista das minhas fobias.

    • pazev

      Graças a filmes de ação, até hj tenho cagaço de elevadores (que são movidos com plutônio, localizado no poço ou debaixo do piso) e fogões (que inerentemente explodirão se vc ligar uma lâmpada).

      • Claudio Roberto Cussuol

        Uma vez eu capotei com um carro. Um caminhão bateu na minha traseira, perdi o controle e fui parar no fundo de um barranco. Quando eu saí do carro, ele estava de rodas para cima e o tanque jorrando combustível. Nunca subi um morro tão rápido na minha vida.
        O subconsciente alimentado por centenas de filmes de ação já sabe:
        “Carro que rola de barranco, explode. SEMPRE”.

        • André K

          E, explodiu?

          • Claudio Roberto Cussuol

            Claro…
            que não.

          • Dou uma e se for bom dou mais

            É porque não era um Pinto… senão tinha explodido antes de ir pro barranco.

        • Lucas Timm

          Capotamento, I know the feeling. Fora o clichê de não conseguir soltar o cinto de segurança: Aham, acontece mesmo.

  • Salles Magalhaes

    Nao entendi a explicacao do papel quadriculado: 10 bits nao significaria que poderiamos ter 1024 quadrados na vertical (em vez de 10) mostrando o valor das amostras em cada instante de tempo?

    • pazev

      Acho que o Cardoso quis dizer níveis, mas saiu bits. Você está certo…

      Mas ainda assim mostra o conceito de quantização e o erro inerente: com 10 bits vc não tem algo perfeito, mas é mais que suficiente na maior parte das aplicações.

      PS.: sensacionais as fotos de Vênus!

    • Davi Marques

      Pois é! A explicação está perfeita, mas a troca de “níveis” por “bits” pode dificultar o entendimento de quem começou a se aventurar nisso agora!

  • Alvaro

    Gostei mais da interface com leds!! pelo visto então para uma próxima versão daria para implementar algo como um display de LCD, ou ate para uma versão ainda mais avançada… uma ethernet Shield mandando por email com o subject: Kabum! eheheheheh

    • Com leds fica muito melhor.

      • Leonardo

        com internet fica melhor! (segundo a internet e designers ¬¬)

        • Harlley Sathler

          Bluetooth! Tudo melhora com bluetooth! 😛

          • Claudio Roberto Cussuol

            E lasers….

          • советский медведь

            Já temos um detector de vazamento de gás com tela LCD, bluetooth, lasers e conectado a internet… Vocês realmente estão no caminho pra ser designers de verdade!

          • Só faltou o adesivo com o logo da Apple pra ficar completo…

          • Dou uma e se for bom dou mais

            Cara com minha mãe encaminhando para o Alzheimer eu seriamente gostaria de um detetor desses com buzina, leds, bluetooth, llaser e conectado a internet mandando mensagem por zapzap pra toda família.

          • советский медведь

            Porque não apenas ele ligado em uma chave que corta o gás? Mais eficiente do que ter que esperar alguém chegar lá pra ajuda-la.

          • Dou uma e se for bom dou mais

            E porque não tudo isso e mais uma chave?

      • tiago

        eu só trocaria os leds por um LED RBG para economizar alguns pinos, mas muito bom o projeto, eu não tinha pensado nessa utilidade.

      • Xultz

        Uma idéia prá impressionar, seria usar um relé no nível mais alto, que comandaria um daqueles sinalizadores vermelhos rotativos, junto com uma sirene

    • Olha, levando em conta a citação ao Alzheimer do início do texto, eu imagino um sensorizinho desses que seja capaz de mandar uma mensagem para um responsável ir limpar os escombros… digo, cuidar da situação.

      Deve ter algo comercial, claro. Mas implementar algo assim deve ser muito legal.

  • Jarbas Coqueiro

    Código devidamente otimizado 🙂

    const int buzz =8;
    const int LEDSinal = 9;
    const int LEDRed = 10;
    uint16_t jorge;
    int som = 0;
    uint16_t sensor = 0;
    void setup() {
    pinMode(buzz,OUTPUT);
    pinMode(LEDSinal,OUTPUT);
    pinMode(LEDRed,OUTPUT);
    digitalWrite(LEDSinal,LOW);
    digitalWrite(LEDRed,HIGH);
    delay(30000);
    digitalWrite(LEDRed,LOW);
    for (jorge = 0; jorge <3; jorge +=1) {
    digitalWrite(LEDSinal, HIGH);
    delay(10);
    digitalWrite(LEDSinal, LOW);
    delay(10);
    }
    }
    void pisca() {
    delay(20);
    digitalWrite(LEDSinal,HIGH);
    delay(20);
    digitalWrite(LEDSinal,LOW);
    }
    void loop() {
    delay(10);
    sensor = analogRead(A0);
    som = map(sensor ,10,50, 50,400);
    tone(buzz,som,(1/(sensor * 10)));
    pisca();
    delay(50);
    }

    • Claudio Roberto Cussuol

      Comprou a vaselina?

      • Jarbas Coqueiro

        Comprei uma caixa, irei otimizar todos os próximos códigos removendo os comentários

    • A parte jorge +=1 deveria ser jorge++ porque a sobrecarga no “+” roda mais rápido do que “+=1” onde é necessário interpretar o 1 e a soma com atribuição.

      • Xultz

        Em quase 100% dos casos, o compilador otimiza isso aí, ele usa o método que for mais otimizado. Eu não conheço o assembly do AVR, mas eu não acredito que ele tenha a instrução INC, provavelmente ele só tenha a instrução ADD, que geralmente é atômica, a instrução recebe uma constante (1) e o registrador a ser manipulado, e executa num único ciclo de clock.

    • Well Dias

      Se você trabalhasse na minha equipe, esse seu código seria reprovado já na primeira fase verificatória do repositório. 😀

  • Lucas Campelo

    Eu não sei onde avisar então vai ser aq. O botão “Mais…” da página inicial não está funcionando

    • E. Bicalho

      Segunda página em diante é exclusivo dos assinantes do MeioBit. Se quiser consumir após o período de lançamento (quando está na primeira página), terá que abrir a carteira! Hehe. :v

      ~it’s a joke.

      • ~it’s a joke.

        Ou não?

        • Matheus Vieira

          Eu pagaria por esse tipo de conteúdo (doar pro contraditorium conta?)

          • E. Bicalho

            Sorry, ainda que o Contraditorium seja um serviço Premium Ultra Plus com cobertura universal, são assinaturas distintas.

            ~it’s not a joke.
            Hehe

        • Isaac

          Cardoso, desculpe atravessar sua conversa aqui. Poderia me dizer qual programa utilizou para mostrar o circuito em desenho?
          Obrigado!

          • Fritzing? http://fritzing.org

            Eu uso ele…

          • Isaac

            Obrigado Wagner, já vou fazer download! =)

  • Essa série sobre o Arduino não pode ficar de fora das premiações do MeioBit no final do ano. Parabéns!
    Minha única contribuição é relembrar o dia em que fui visitar meu tio e fui chegando pela porta da cozinha, entrei e vi a seguinte cena:
    “Meu tio estava testando um botijão de gás, ainda sem ter colocado a válvula. Ele acendeu um isqueiro e aproximou do bico de gás e então levantou uma labareda. Imediatamente, ele começou a SOPRAR a chama. Na terceira soprada, a dentadura dele saiu boca afora, bateu no bujão e saiu rolando pelo assoalho.”
    Depois disso, não vi mais nada porque quando parei de correr, eu já estava dobrando a esquina da rua.

    • Morreu mas passa bem.

    • Oberaldo Gilmentoo

      Muitos acidentes começam com um ___ que despreza cuidados básicos de segurança, achando que “sabe o que está fazendo”.

  • Salles Magalhaes

    Sobre vezamento de gás: isso sempre me lembra o melhor episódio do Chapolin Colorado

  • Hemeterio

    Minha vó tem 99 (caray!), e ela está bem, mas obviamente ñ pode dar piruetas.

    Um dos momentos em que ela mesma e nós percebemos que a coisa já ñ dava mais foi quando ela acendeu o fogão pra fazer o mingau dela e esqueceu de erguer a tampa de vidro. Então ela colocou a panela em cima da tampa, com o fogo embaixo. Deixo pra vossa imaginação o que aconteceu em seguida. Ela era gatinha na época, só 93.

    Incrivel a gente ter essas coisas de butano em casa. Aqui so eletrico.

    • Oberaldo Gilmentoo

      bomba de fragmentação com vidro temperado?

  • @ccardoso:disqus “O pólo positivo do buzzer é ligado ao pino 9 do Arduino” É o pino 8. :*

  • Zalla

    CC, de onde vc tirou esse “jorge”?

    • Oberaldo Gilmentoo

      ele fez de propósito só para alguém perguntar

  • Tá certo não, essa explicação de onda por bits, Cardoso. Você tem 1024 níveis de gradação em 10 bits, não uma onda com 10 bits de altura. Seria até estranho representar uma onde que está no bit 0 e no bit 9 ao mesmo tempo. Isso daí seria certo se estivesse falando de um BITMAP monocromático O.o

  • Bad Vibes

    Afinal MQ-2 ou MQ-4??

    • Flávio Pedroza

      É sim.

      • Dou uma e se for bom dou mais

        Flávio via querer pizza ou sanduiche?
        “SIM”…
        Você acaba de comprovar que o meme existe.

  • Flávio Pedroza

    Muito legal! Tô com o dedo coçando pra um kit desses pra mim.

  • Ichigo

    Façam uma parceria com o Baú! Depois de ler os artigos gastei uns 350 paus lá, podia rolar um desconto futuro.

    • A RoboCore também é muito boa e barata. Pra grandes compras eu prefiro a Sparkfun ou importando direto da China mesmo.

      • Oberaldo Gilmentoo

        Os preços da China são incomparáveis. Só não pode ter pressa. Quanto menor o frete, mais demora. Compra e esquece.

  • Do bit Ao Byte . com . br

  • Marcus P

    Gostei da matéria. Parabéns!
    Compartilhando, meu primeiro Arduino foi uma bomba. Varios canos de PVC pintados de vermelho, amarrados por fita isolante, um display de 4 dígitos e um beep para fazer a contagem regressiva. Inútil e cheio de fios aparentes. Mas fez sucesso na família. Risos.

  • Putz, esse lance do Bujão/Botijão de gás me lembrou algo sinistro que aconteceu quando eu era garoto, ainda. Estava na casa da minha madrinha, e ela e minha mãe estavam assando bolos pro aniversário de um dos meus primos. E no meio do processo o gás acabou, então, normal, bora trocar. Só que deu xabú: a mangueira não encaixou direito e a válvula do bujão TRAVOU lá dentro, ficando aquele barulho de gás escapando direto, cheiro forte por todo o apartamento. Por sorte era um prédio pequeno, de dois andares, e o térreo tinha quintal. Ela levou lá para fora e foi correndo numa oficina mecânica da esquina da rua ver se alguém saberia como resolver, para não ter que esperar bombeiro chegar (vai que não dá tempo? Não sei se chegaram a ligar pros bombeiros, ainda assim).

    A solução foi a mais surreal que eu poderia imaginar: por orientação de outro mecânico da oficina, o matuto foi lá, monido de uma daquelas chaves de fenda gigantes e um martelo. Sim, é isso mesmo que vocês pensaram: ele usou o martelo e a chave para bater no pino travado, e ele se deslocou e voltou pro lugar, vedando tudo novamente. Apesar de criança, a primeira coisa que pensei foi “mas se essa porra faiscar vai ser um CABUM DAQUELES”. Só que realmente não teve faísca alguma, o gás parou de vazar e após algumas horas conseguiram encaixá-lo na mangueira do fogão, sem contratempos.

    Desde então esse sempre passou a ser o meu maior temor com bujões de gás, tanto que dei graças aos céus quando passei a morar em imóveis com gás encanado

  • elliot

    Isso eh brincadeira de crianca

  • Anderson Mendes

    Cara, já tive algumas aulas com Bombeiros durante um curso que fiz para um trabalho e o instrutor abria a válvula do botijão, acendia e mandava a gente apagar com o dedo. É tranquilo. Só explode se houver acúmulo de gás em um local.

Aproveite nossos cupons de desconto:

Cupom de desconto Locaweb, Cupom de desconto HP, Cupom de desconto Descomplica, Cupom de desconto Nuuvem, Cupom de desconto CVC, Cupom de desconto Asus, Cupom de desconto World Tennis