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.
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.
Componentes utilizados:
O esquema de montagem do nosso circuito é relativamente simples como podemos ver na figura abaixo:
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
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.
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.
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.
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.
Boa Danilo!
Valeu Daniel 😀