Estação meteorológica com Arduino – desenvolvendo um nó sensor básico de uma estação meteorológica

O monitoramento de variáveis, tais como: umidade, temperatura e pressão de um determinado ambiente são fundamentais para os mais diversos tipos de setores do mundo moderno. Entretanto, realizar esta tarefa de forma manual pode ser extremamente lenta em termos de aferição e facilmente suscetível a erros. Com isso, o desenvolvimento de plataformas capazes de realizar o monitoramento destas variáveis com uma baixa taxa de erro e em intervalos fixos, possibilitam com que empresas e pesquisadores possam tomar decisões a respeito do que fazer dentro de um determinado ambiente. Sabendo de tudo isso, neste tutorial iremos aprender a como desenvolver um nó sensor básico (uma mini estação meteorológica com Arduino), capaz de aferir a temperatura, umidade e a possibilidade de chuva de um determinado ambiente, utilizando um Arduino pro mini, um sensor de temperatura DHT11 e também um sensor de chuva.

Exemplo de mini estação meteorológica.

Montagem do projeto

Para realizar a montagem deste projeto, iremos precisar basicamente do nosso Arduino Pro mini, que será responsável por ler as informações dos sensores conectados, e também dos dois sensores que serão responsáveis por nos fornecer as variáveis de temperatura, umidade e a informação se está chovendo ou não.

Use o cupom BEM vindo e ganha 10% off para desenvolver o seu projeto!

Componentes utilizados:

 
 

 

 
 

 

 
 

 

 
 

 

 
 

 

 
 

 

 

O esquema de montagem do nosso circuito é relativamente simples como podemos ver na figura abaixo:

Montagem do sistema

Basicamente, iremos conectar os nossos sensores na alimentação através dos pinos VCC e GND do Arduino, e iremos utilizar o pino digital 3 para estabelecer uma comunicação com o sensor DHT11 e utilizaremos o pino A0 para realizar a leitura do sinal digital gerado pelo sensor de chuva.

Tenha sempre cuidado ao realizar a ligação dos módulos, qualquer tipo de erro devido a uma conexão incorreta pode causar danos tanto ao seu microcontrolador quanto aos sensores utilizados

Montagem do projeto

Desenvolvimento do código

Agora que nós já montamos o nosso sistema de monitoramento, iremos partir agora para a parte do onde desenvolvemos o código responsável por realizar a leitura destes dados e também responsável por enviar estes dados para o usuário através da porta de comunicação serial. O código logo abaixo ilustra todo o procedimento de coleta e envio dos dados via porta serial

#include "DHT.h" // Biblioteca utilizada para comunicação com sensor de temperatura
#define PINODHT 2 // Em qual pino o sensor está conectado
#define PINOUMIDADE A1 // Pino onde conectamos o sensor de umidade
#define DHTTYPE DHT11 // DHT 11
#define TEMPOLEITURA 5000 // Tempo de leitura definido em millissegundos

DHT dht(PINODHT, DHTTYPE); // Instância do sensor dht

float temperaturaCelsius; // Variável responsável por armazenar a temperatura
int umidade; // Variável responsável por armazenar a umidade
unsigned long tempoAnterior; // Variável responsável por controlar a leitura do sensor, sem a utilização de delay

bool lerTemperatura(){ // Função responsável pela leitura do sensor
umidade = dht.readHumidity(); // Leitura da temperatura
temperaturaCelsius = dht.readTemperature(); // Leitura da umidade
if (isnan(umidade) || isnan(temperaturaCelsius)) { // Se o valor retornado pela leitura da temperatura e da umidade não for um número, significa que houve um erro ao ler do sensor
return false; // Retornamos falso caso a leitura não tenha sido feita com sucesso
}
else{
return true; // Retornamos verdadeiro caso a leitura tenha sido feita com sucesso
}
}

bool detectarChuva(){ // Função responsável por detectar se está chovendo ou não
int umidade = analogRead(PINOUMIDADE); // Leitura do pino analógico onde o sensor de chuva está conectado
if (umidade > 500){ // Se a umidade lida for maior que 500 podemos considerar que não foi detectado respingos de água sobre a superficie do sensor, logo não está chovendo
return false; // Retornamos falso caso o sensor não detecte a possibilidade de chuva
}
else{ // Caso contrário significa que já pode estar chovendo
return true; // Retornamos verdadeiro caso o sensor detecte a possibilidade de chuva
}
}

void setup() {
Serial.begin(9600); // Inicialização da comunicação serial
dht.begin(); // Inicialização do sensor de temperatura
}

void loop() {
unsigned long tempoAtual = millis(); // Armazenamos o tempo atual do microcontrolador, através da função millis

if (tempoAtual - tempoAnterior >= TEMPOLEITURA){ // se a diferença entre o tempo atual, do microcontrolador menos o ultimo tempo lido, for maior ou igual ao tempo de leitura, significa que devemos executar o bloco if
tempoAnterior = tempoAtual; // registramos o último tempo lido antes do bloco ser executado
bool statusLeitura = lerTemperatura(); // Função criada para ler o sensor de temperatura
if (statusLeitura==false){ // Se a função retornar false significa que houve um erro na leitura do sensor, logo não iremos mostrar as variáveis lidas
Serial.println("Falha na leitura do sensor DHT11"); // Print da mensagem de erro ao ler o sensor
}
else{ // Caso contrário mostramos as variáveis de temperatura e umidade lidas
Serial.print("Temperatura: ");
Serial.println(temperaturaCelsius);
Serial.print("Umidade: ");
Serial.println(umidade);
}
bool statusChuva = detectarChuva(); // Função detecta chuva informa se foi detectada chuva ou não
if (statusChuva == true){ // Caso o sensor detecte a possibildade de chuva a mensagem está chovendo será exibida
Serial.println("Está chovendo");
}
else{ // caso contrário a menasgem não está chovendo será exibida
Serial.println("Não está chovendo");
}
}
}

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! Vamos compartilhar conhecimento!

Mergulhando no projeto

Agora que já montamos e temos o nosso código base, iremos entender como cada parte do nosso sistema funciona :).

Bibliotecas necessárias

Para estabelecer uma comunicação entre o nosso sensor e o Arduino, iremos utilizar a biblioteca DHT Sensor Library, que pode ser encontrada diretamente no Gerenciador de Biblioteca.

Também será necessária a instalação da biblioteca Adafruit Unified Sensor que também pode ser encontrada no Gerenciador de Biblioteca da própria IDE do Arduino.

 

Variáveis definidas

– Defines

  • PINODHT: Define responsável por definir em qual pino o sensor DHT deverá estar conectado.
  • PINOUMIDADE: Define responsável por definir em qual pino o sensor de chuva deverá estar conectado.
  • DHTTYPE: Define responsável por definir qual tipo de sensor iremos utilizar em nosso projeto (DHT11/DHT22).
  • TEMPOLEITURA: Define responsável por definir qual o tempo entre as leituras dos nossos sensores.

– Objetos criados

  • dht: objeto responsável pela comunicação entre o nosso sensor DHT11 e o Arduino

– Variáveis criadas

  • temperaturaCelsius: variável reponsável por armazenar a temperatura lida do sensor.
  • umidade: variável responsável por armazenar a umidade lida do sensor.
  • tempoAnterior: variável reponsável por controlar as leituras feitas sem a utilização do delay.

Função setup

Dentro da função loop iremos inicializar a comunicação serial, através do comando serial.begin(9600) e iremos também inicializar a comunicação com o sensor dht através do comando dht.begin().

Função loop

– Controle de leituras sem utilização do delay

A função loop por sua vez, será responsável por realizar todo o processo de leitura dos sensores e apresentação ao usuário através da porta serial de comunicação. Para fazer isso, iremos primeiramente criar um bloco de código capaz de realizar leituras dos sensores, sem a necessidade do comando delay. Essa necessidade surge do fato de que o delay bloqueia a execução de toda a parte do código que está logo abaixo pelo intervalo de tempo definido em seu argumento e isso faz com que outras tarefas não possam ser executadas enquanto o tempo definido não acabar. Para solucionar este problema, iremos utilizar o contador de tempo do próprio Arduino, que deverá seguir a seguinte lógica:

  • Armazenamos o tempo atual do nosso Arduino.
  • Se o tempo atual, menos o tempo anterior lido for maior ou igual ao intervalo de tempo de cada leitura, devemos realizar a leitura  dos sensores.
  • Caso contrário não executamos a leitura  do nosso sensor e o código pode continuar sua execução sem o delay bloqueando seu uso.

– Leitura das variáveis de temperatura

Dentro da função loop, também iremos realizar a leitura dos nossos sensores de temperatura e umidade, as funções lerTemperatura() e detectarChuva() irão respectivamente ler estas variáveis e informar a função main se a leitura foi feita com sucesso através do seu retorno, que pode ser true caso os dados tenham sido lidos com sucesso, e false caso contrário.

– Apresentando os dados lidos

A apresentação dos dados para o usuário também será feita dentro da função loop, onde as variáveis statusLeitura e statusChuva serão responsáveis por definir o tipo de mensagem que será mostrada ao usuário.

Leitura dos sensores feita corretamente.

Função ler temperatura

A função ler temperatura por sua vez, será responsável por obter os dados de temperatura do sensor. Porém, devido a problemas de comunicação ou até mesmo por uma possível falha do sensor, ele pode não responder corretamente em algumas das vezes, por isso a função sempre após uma leitura, verifica se os dados lidos são válidos através da função isnan(), caso o valor retornado não seja um número, a função retorna o resultado false. O que significa que a leitura ocorreu com falha. Caso contrário, os dados serão escritos nas variáveis temperaturaCelsius e umidade.

Função detectar chuva

A função detectar chuva, irá realizar uma leitura analógica do pino onde o sensor de chuva está conectado. O funcionamento deste sensor segue a seguinte lógica:

  • Sempre que sua superfície estiver seca, um valor analógico maior que 500 será enviado para o seu pino A0
  • No momento em que algum liquido for detectado sob sua superfície, esse valor sofrerá uma variação que deverá reduzir seu valor para um número menor que 500

Sabendo disso, a função irá verificar se o valor lido do sensor é maior ou menor que 500. Caso seja menor a função retornará o valor true, informando que está de fato chovendo. Caso contrário ela retornará o valor false, informando que não está chovendo.

Hardware

Sensor DHT11

O módulo DHT11 é composto por dois sensores responsáveis por obter a temperatura e umidade relativa do ar. Seu uso é bastante difundido no mundo maker devido a sua facilidade de uso, baixo custo e alta confiabilidade nos dados fornecidos. Sua alimentação pode ser feita com até 5.5 Volts e além disso ele possui um consumo de no máximo 200 uA, o que o torna ideal para projetos de baixo consumo de energia.

Módulo DHT 11 encapsulado em placa

Sensor de chuva

O sensor de chuva por sua vez é composto por uma superfície metálica, que é capaz de detectar a presença de água em sua superfície através do circuito LM193, um circuito comparador capaz de gerar um sinal analógico inversamente proporcional quando detectada a presença de líquidos na superfície da superfície metálica do módulo.

Sensor de chuva

Conclusão

Neste tutorial, aprendemos a como construir um pequeno nó sensor, capaz de ler informações de . Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.

Referências

LM193 Datasheet

DHT11 Datasheet

Sobre Danilo Almeida 5 artigos
Bacharel em Ciência da computação, pela Universidade Federal de Viçosa - Campus Florestal, e atualmente mestrando em Ciência da computação na área de arquitetura de computadores, é um entusiasta na área de sistemas embarcados e robótica, buscando sempre aprimorar e compartilhar o conhecimento obtido através de bastante estudo e noites sem dormir :) .

2 Comentários

Deixe uma resposta

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


*