Mini Estação Meteorológica

Anos atrás nós tínhamos em casa uma peça de decoração no hall de entrada, que consistia em um termômetro, um higrômetro e um barômetro, todos de ponteiro, ou seja analógicos, até o dia em que a peça sofreu um acidente caindo no chão e quebrou a cúpula do barômetro, que com isso deixou de funcionar.

Substituída a nossa “estação meteorológica” por um simples termômetro de máxima e mínima nossa curiosidade cerca o clima ficou sem mais ser satisfeita.

Recentemente com a aquisição de algum material eletrônico, dentre eles o sensor de pressão atmosférica e temperatura, BMP180, juntei o restante de materiais e componentes para montar uma “estação meteorológica” com Arduino.

A princípio, bastou tomar um Arduino nano, uma protoboard de 830 pontos, mais um AM2302, um display 5110 e conversores de nível lógico, para termos o mínimo de funcionalidade que se assemelhe ao nosso antigo aparato funcional de decoração.

No entanto, para atingir o mínimo grau de estação meteorológica, o aparato deveria registrar dados relacionando-os com data e hora da tomada da medição. O que será objeto de uma segunda etapa de desenvolvimento do protótipo. E em complemento, numa terceira etapa recursos para armazenamento massivo dos dados. O que exigirá algum tipo de controle de interação para configurar, intervalo de coleta de dados, ajuste de relógio calendário e eventuais outras funcionalidades.

Etapa I – Instrumento de medição instantânea de grandezas climáticas básicas.

A seguir está o diagrama esquemático do equipamento base para as medições.

Diagrama Esquemático
Figura 1-Diagrama esquemático da mini estação meteorológica

O Sketch que implementa todo o necessário para realização das tarefas é apresentado a seguir:

/* =============================================================== 
   Projeto: Estação meteorológica 
      Data: 11/novembro/2020
     Autor: Francisco Jose Lopes

   Dispositivos e Conexões
   1 Display Nokia 5110  (CLK-D2 / Din-D6 / DC-D9 / CE-D8 / RST-RESET / Light-D5)
   2 DHT-22 / AM2302     (Dout-D7)
   3 BMP180              (SDA-A4 / SCL-A5)
     
   Conversões possíveis
   Pa = 0,000145038 PSI ou seja 6894,76 Pa = 1 PSI
   Pa = 0,00001 Bar ou seja 100000 Pa = 1 Bar ou 1000 mBar
   Pa = 0,0000098692 ATM ou seja 101325 Pa = 1 ATM
   Pa = 0,007500062 Torr ou seja 133,322 Pa = 1 Torr
   °C = (F - 32)5/9
   °C = +273,15K

   Função:
    Exibir três parâmetros de maneira singular:
      Temperatura em Celcius
      Umidade relativa em porcentagem
      e Pressão em miliBares
=============================================================== */
/* Bibliotecas utilizadas */
#include <Wire.h>             // Biblioteca do I2C
#include <Adafruit_BMP085.h>  // Biblioteca para o sensor de presão atmosférica
#include <DHT.h>              // Biblioteca para o sensor DHT
#include <Adafruit_GFX.h>     // Biblioteca gráfica para display
#include <Adafruit_PCD8544.h> // Biblioteca para o Display Nokia 5110

#define DHTPIN  7      // Dados do sensor de humidade (pino de leitura)
#define DHTTYP  DHT22  // Modelo de sensor (DHT22 / AM2302)
#define CLK   2        // Clock do display 5110
#define Din   6        // Data-in do display 5110
#define DC    9        // Data / Command do display 5110
#define CE    8        // Chip Enable do display 5110

/* ==== Instanciação de objetos ==== */
Adafruit_BMP085 bmp;      // Instância um objeto sensor de pressão
DHT dht(DHTPIN, DHTTYP);  // Instância um objeto sensor de humidade
Adafruit_PCD8544 display = Adafruit_PCD8544(CLK, Din, DC, CE, DUMMY);

/* ==== Setup da interface serial e periféricos ==== */
void setup() {
  Serial.begin(9600);     // Inicializa o canal de comunicação
  while (!Serial) {       // Espera pela conexão da porta serial (caso seja um Leonardo)
    delay(2);             // Aguarda 2 milisegundos para retentar
  }

  // Inicialização do sensor de umidade
  dht.begin();            // Função inicialização não tem retorno (void)

  // Inicialização do barômetro + termômetro
  if(! bmp.begin()) {
    // Se o sensor não responder "trava" o nosso aparato
    while (1);
  }

  // Inicialização do display
  display.begin();              // Inicialização do display
  display.setContrast(50);      // Definição de contraste
  display.clearDisplay();       // Apaga informação no display
  display.display();            // Atualiza o display
  display.setTextSize(1);       // Fonte de tamanho padrão (pq)
  display.setTextColor(BLACK);  // Texto preto fundo branco
  display.clearDisplay();       // Apaga informação no display
  display.display();            // Atualiza o display
}

/* ==== Laço principal de leitura e exibição de dados a cada 1 segundo ==== */
void loop() {

  display.setCursor(0,0);       // Escreve na coluna 0, linha 0
  //               12345678901234     <= nº coluna
  display.println("O tempo agora:");
  display.setCursor(12,15);     // Escreve na coluna 6, linha 25
  display.print(bmp.readTemperature());
  display.print(" C");
  display.setCursor(12,25);     // Escreve na coluna 6, linha 15
  display.print(dht.readHumidity());
  display.print(" %");
  display.setCursor(6,35);      // Escreve na coluna 6, linha 35
  display.print((bmp.readPressure()*0.007500062));
  display.print(" mmHg");
  display.display();            // Atualiza o display
  display.clearDisplay();       // Apaga informação no display
  delay(1000);
}

Na Figura 2 a seguir é mostrado o aspecto do protótipo montado para verificação de viabilidade mecânica.

Disposição de peças da montagem
Figura 2-Estudo de viabilidade física para o protótipo

As 63 fileiras de contatos são o suficiente para abrigar a montagem, sem sacrifícios maiores, uma vez que apenas um pino do cartão de adaptação do MicroSD teve de ser remontado com o Arduino Nano.

alimentação dos componentes
Figura 3-Malha de alimentação

Na Figura 3 é mostrada a malha de alimentação para o circuito, sendo reservadas duas linhas para o comum (GND), uma linha para 5V e outra para 3,3V, ambas alimentadas a partir do Arduino Nano.

A Figura 4 a seguir mostra a malha de conexões de sinais para a montagem final da “estação meteorológica”.

conexão de sinais
Figura 4-Malha de sinais do circuito

Uma vez montados os módulos planejados para a etapa final, pode ser efetuada a verificação da viabilidade eletrônica da montagem, testando-se cada módulo individualmente.

prova de funcionamento modular
Figura 5-Estudo de viabilidade mecânica e elétrica

Após testes modulares ficou comprovado que o buzzer não poderia ser utilizado, por indisponibilidade de saídas digitais para seu controle.

Assim a Figura 6, mais adiante, mostra os módulos da etapa I montados identificados e o protótipo operando.

No início do arquivo fonte há um comentário explicitando as conversões de unidades de medida de grandezas relacionadas a pressão e temperatura, uma vez que o BMP180 fornece sua medição em Pascais [Pa] e outras unidades são usuais entre leigos, tais como milibares e milímetros de coluna de mercúrio.

identificação das partes
Figura 6-Identificação dos elementos componentes

Nesta etapa as medidas são exibidas apenas em uma unidade cada, mas prevê-se tornar selecionável por menu as unidades de medida a serem utilizadas.

Bibliotecas

As bibliotecas incluídas têm as seguintes finalidades:

Wire.h e Adafruit_BMP085 para comunicação e tratamento do BMP180.

DHT.h para tratamento e leitura do sensor de umidade DHT-22

Adafruit_GFX.h e Adafriut_PCD8544.h para tratamento e utilização, inclusive gráfica, do display Nokia 5110

Inicialização

A inicialização opera quatro (04) tarefas de iniciação: Serial; DHT; BMP; Display (5110).

Inicialização de serial prepara a interface serial para operar a 9600 baud e prevendo o uso em Arduino Leonardo aguarda o objeto retornar um booleano confirmando se a interface serial está “aberta” após sua inicialização.

Inicialização de DHT configura o pino onde se fará a leitura do sensor (informado na instanciação do objeto DHJT), assim como ajusta temporizações de intervalo de leitura.

Inicialização do barômetro ajusta alguns parâmetros de operação do sensor e chama a função de inicialização da biblioteca wire. A seguir testa condições e lê dados de calibração do sensor, retornando TRUE caso corra bem. Por outro lado se não funcionar a contento entra em um loop infinito, levando ao travamento do programa.

Finalmente a inicialização manda um pulso de 500ms para o reset do display, chama a função de inicialização da SPI, configurando o Clock para o display e os pinos a serem usado na conexão do display entre outras tratativas.

Adicionalmente ajusta-se o contraste do display, define-se o tamanho do texto a ser exibido, o modo de cores (preto sobre branco / branco sobre preto), apaga-se qualquer exibição eventual nos buffers do display e atualiza-se o LCD.

Loop Principal

Adentrando no loop principal, a cada segundo (controlado pela função delay()), é efetuado o posicionamento do curso do display, escrita uma mensagem fixa, posiciona-se o curso no ponto de exibição da temperatura, exibe-se o valor da leitura de temperatura, a seguir posiciona-se o cursor no ponto de exibição da umidade relativa, exibe-se o valor da leitura de umidade, por fim posiciona-se o curso no ponto de exibição de pressão atmosférica e exibe-se a conversão da leitura de pressão em pascais para milímetros de mercúrio.

Antes de iniciar um novo ciclo de do laço principal apaga-se o display para que as escritas do novo ciclo, não se misturem às escritas do ciclo recém terminado.

Na Figura 7 temos o equipamento funcionando com a exibição das leituras tal como programado no sketch acima.

exibição das medições
Figura 7-Exibição das medidas efetuadas

Esta é a etapa I concluída, em breve será publicado o artigo descrevendo a etapa II que será a inclusão do RTC (Real Time Clock) para exibir também data e hora das leituras.

Conclusão

Esta implementação singularmente simples, torna operativa a exibição dinâmica de leituras cíclicas dos três parâmetros climáticos monitorados.

Com este baixo nível de complexidade funcional o software ocupa, sem esforços de otimização 47% da memória de programa (14498 bytes), e 55% da memória de dados (1075 bytes), o que indica alta probabilidade de necessidade de otimização do código, se não inclusive das bibliotecas para tornar viável a consecução das próximas etapas construtivas.

Em o protótipo chegando ao limite mais próximo do objetivo final completo (estação meteorológica com capacidade de datalogger) poder-se-á criar uma placa de circuito impresso para a montagem em condição de produto, bem como o projeto e impressão 3D de um gabinete para acomodar todo o aparato mais fonte de energia e/ou banco de baterias.

Referências

Sensor de Pressão

Bosch. Data Sheet BMP180 Digital pressure sensor. Disponível me <https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf> acessado em 15/nov./2020

BMP180 Digital Barometric Pressure Sensor Module Model: GY-68. Disponível em < https://www.katstores.com/sites/default/files/product-datasheets/2018-08/BMP180%20Pressure%20Sensor%20Datashet.pdf> acessado em 15/nov./2020

ePro Labs. Pressure Sensor-BMP 180. Módulo sensor GY-68 disponível em <https://wiki.eprolabs.com/index.php?title=Pressure_Sensor-BMP_180> acessado em 15/nov./2020

Sensor de umidade

Aosong Eletronics Co., Ltd. Digital output relative humidity & temperature sensor/module. Disponível em < https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf> acessado em 15/nov./2020

Aosong Eletronics Co., Ltd. Temperature and humidity module AM2302 Product Manual. Disponível em < https://img.filipeflop.com/files/download/Datasheet_DHT22_AM2302.pdf> acessado em 15/nov./2020

LIU, Thomas. Digital relative humidity & temperture sensor AM2302/DHT22. Disponível em < https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf> acessado em 15/nov./2020

Display Nokia 5110

Philips Semiconductors. PDC8544 48 x 84 pixels matrix LCD controller/driver. Disponível em < https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf> acessado em 15/nov./2020

Components 101. Nokia5110 LCD. Disponível em <https://components101.com/nokia-5110-lcd> acessado em 15/nov./2020

Arduino Nano

Mouser Electronics. Arduino Nano (v3.0). Disponível em <https://www.mouser.com/pdfdocs/Gravitech_Arduino_Nano3_0.pdf> acessado em 15/nov./2020


Anexo I – Identificação de pinos de conexão

Módulo GY-68 (BMP180) – pinagem

módulo BMP180 / GY-68
Figura 8-Módulo BMP180 / GY-68

Diagrama elétrico do módulo GY-68

esquema interno do módulo GY-68
Figura 9-Diagrama esquemático do módulo GY-68 (BMP180)

Módulo DHT22 / AM2302

módumo sensor de umidade DHT22
Figura 10-Módulo DHT22 / AM2302 sensor de umidade

Módulo display LCD Nikia 5110

display LCD Nokia 5110
Figura 11-Display LCD Nokia5110

Arduino Nano

pinagem do Arduino Nano
Figura 12-Pinagem do Arduino Nano

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.