Arduino e sensor de chamas: lógica reversa e o operador de negação

O sensor de chamas retorna HIGH quando não há fogo, e LOW quando há – mas isso faz sentido, e o significado lógico dos valores HIGH e LOW do Arduino ajuda a lidar com o resultado.

Para um projeto de experimento futuro que tenho em mente, obtive um sensor infravermelho de chamas que parecia não ter nada de interessante a ser explicado, mas acabou trazendo a oportunidade de abordar alguns conceitos.

Esse tipo de sensor detecta chamas por meio de suas emissões infravermelhas. O meu modelo em particular (a placa vem identificada apenas como HL-01) afirma detectar a chama de um isqueiro a até 80cm de distância, e essa distância aumenta para chamas maiores.

É um módulo sensor de 3 pinos, sendo um para alimentação permanente (3,3 ou 5V), outro para o terra, e o terceiro para um sinal digital que informa o status de leitura. Muitos módulos similares possuem um quarto pino, referente a uma leitura analógica do mesmo sensor, que pode ser usada para estimar a distância ou intensidade da chama detectada.

O meu projeto (futuro) exigirá apenas que a chama do isqueiro seja detectada a 30cm de distância, então usei o potenciômetro da própria placa para regular a sensibilidade, reduzindo-a.

Invertendo a lógica de sensores de alarme

Como se trata de um sensor digital de chamas, o normal seria esperar que o seu pino digital retornasse HIGH quando uma chama estivesse presente, e LOW na ausência dela, certo?

Mas ele funciona ao contrário disso: na ausência de chama retorna HIGH, e ao detectá-la retorna LOW. Em uma observação rasteira, poderíamos dizer que ele se comporta como se fosse um sensor de ausência de chama, não é?

Só que existe uma boa razão para esse comportamento, que eu já havia encontrado na minha época de atividade com pesquisa e desenvolvimento para telecomunicações: sensores de alarme muitas vezes se mantêm em HIGH e caem para LOW na presença da condição detectada, porque assim a ausência de sinal por falha no próprio sensor1, ou em sua alimentação, também irão gerar o alarme, levando à necessária correção.

Faz sentido, não? Caso o pino de alimentação ou o terra do sensor percam suas conexões, o pino de sinal deixará de estar HIGH, e alguém terá que ir ver o que houve. Dependendo do grau de automação da resposta a esse incidente, outros sensores (por exemplo, um sensor de temperatura, ou um de alimentação elétrica) poderão ser consultados para verificar mais adequadamente a causa do evento.

Conhecendo o operador de negação

A conexão física desse módulo ao Arduino é bem simples, e dispensa a usual apresentação na forma de esquema: o pino VCC do sensor é conectado ao pino 5V do Arduino, o pino GND do Sensor é conectado ao GND do Arduino, e o pino D0 (sinal) do sensor é conectado a qualquer pino digital do Arduino – no meu caso, conectei ao pino 2.

O programa que opera esse sensor também é bem simples: basta ler o pino 2 e agir quando ele retornar o status LOW.

Isso poderia perfeitamente ser feito com uma instrução condicional comparativa, como esta:

if (digitalInput(2)==LOW) {
	digitalWrite(13,HIGH); // acende o led interno 
	// ou outra ação qualquer a realizar quando houver chama
}

Mas, sabendo que na versão atual do Arduino os valores LOW e HIGH são definidos como os 2 estados lógicos básicos (0 e 1, que também correspondem a falso e verdadeiro), hoje (e enquanto a biblioteca do Arduino não mudar para redefinir esses estados) podemos usar também o operador de negação, representado pelo caracter !.

O operador de negação inverte os estados lógicos, assim: !1 vira 0, !0 vira 1, !true vira false e (na versão atual do Arduino e nas anteriores) !HIGH vira LOW, e !LOW vira HIGH.

Assim, toda a sequência de if e digitalWrite acima pode ser substituída por uma operação direta: digitalWrite(13,!digitalRead(2)); – que significa: coloque no pino 13 (o do led interno) o estado inverso ao que for lido no pino 2.

O programa inteiro fica assim:

void setup() {
  pinMode(13,OUTPUT);
  pinMode(2, INPUT);
}

void loop() {
  digitalWrite(13,!digitalRead(2));
}

Vale observar: tratar diretamente assumindo os valores das constantes definidas nas bibliotecas do Arduino sempre expõe o programa ao risco de incompatibilidades com versões futuras. Nunca use a operação acima se você considerar plausível que seu programa poderá ser usado em outra versão do Arduino em que haja algum terceiro estado lógico possível para os pinos digitais, ou em que a definição dessas 2 constantes (HIGH e LOW) tenham sido mudadas por algum outro motivo.

 
  1.  Vale mencionar que também existe a possibilidade de o sensor falhar de uma maneira que mantenha permanentemente em HIGH, mas essa raramente é a hipótese mais provável.

Comentar

Dos leds ao Arduino, ESP8266 e mais

Aprenda eletrônica com as experiências de um geek veterano dos bits e bytes que nunca tinha soldado um led na vida, e resolveu narrar para você o que descobre enquanto explora esse universo – a partir da eletrônica básica, até chegar aos circuitos modernos.

Por Augusto Campos, autor do BR-Linux e Efetividade.net.

Recomendados

Livro recomendado


Artigos já disponíveis

Comunidade Arduino

O BR-Arduino é integrante da comunidade internacional de entusiastas do Arduino, mas não tem relação com os criadores e distribuidores do produto, nem com os detentores das marcas registradas.

Livros recomendados