Danilo R. Vieira | Oceanógrafo

Aqui estão algumas das coisas que eu aprendi, descobri ou fiz (por obrigação ou por diversão). Espero que encontre algo que seja útil para você.

Estação meteorológica com Arduino Ethernet

Conteúdo

Resuldados

Estes são os dados das últimas 24 horas (infelizmente o DHT 22 não fornece mais dados confiáveis de umidade relativa e eles foram removidos do gráfico):

As tempestades no meio de outubro/2016 destruiram uma boa parte do equipamento. Em maio/2018, novos sensores forem instalados, mas dessa vez, medindo apenas temperatura e pressão. Os dados abaixo podem estar errados, veja os dados corretos na página da estação.

Na página da estação você pode ver os dados com mais detalhes.

Além dos gráficos e websites mencionados, há planos para mostrar os dados em uma tela OLED, como mostra a foto abaixo. No momento, a tela está em fase de testes e será acrescentada em breve.

O hardware

Para este projeto, foram usados:

Arduino Ethernet
É semelhante ao Arduino UNO, mas possui uma porta Ethernet e entrada para cartão SD integradas, sem necessidade de shield.
DHT22
Um sensor de temperatura e umidade relativa. No caso, foi usada a versão AM2302, própria para uso externo, pois possui uma proteção extra. Esse sensor utiliza 2 pinos para alimentação e 1 pino para envio de dados.
BMP180
Sensor principalmente de pressão e fornece também temperatura. Utiliza dois pinos para alimentação e dois pinos para transmissão de dados por I2C.
DHT11
As mesmas variáveis e funcionamento do DHT22, mas usado para umidade interna. Apresenta menor acurácia e resolução que o DHT22 e também trabalha em uma faixa menor de umidade.

Anemômetro e pluviômetro
Tanto o anemômetro quanto o pluviômetro funcionam com reed switches, aqueles interruptores magnéticos. No anemômetro, o sensor que mede a velocidade do vento, a cada volta completa um imã passa sobre o reed swith e fecha o circuito. Assim, o Arduino consegue saber quantas voltas foram dadas e então calcula a velocidade do vento. A direção do vento é dada por um conjunto de resistores: dependendo da direção do vento, a seta gira e fecha o circuito passando por um resistor diferente. Sabendo que saem 5 volts do arduino, basta medir a tensão que chega após passar pelo sensor e então descobrir qual resistor estava ativo e correlacionar com a direção do vento. No pluviômetro, o sensor que mede a quantidade de chuva, um imã passa sobre o interruptor a cada 0,2794 milímetros (ou litros por metro quadrado) de chuva. Infelizmente o pluviômetro acusava chuva quando não estava chovendo e foi desligado.

O Arduino solicita medidas aos sensores de temperatura, umidade e pressão a cada 30 segundos. No caso do anemômetro e pluviômetro, a cada 30 segundos é feito o cálculo que converte a quantidade de fechamentos dos reed switches em velocidade do vento e quantidade de chuva. Em seguida, o Arduino envia as medidas ao servidor, onde os dados são distribuídos para o WeatherUnderground e a página da estação. O Arduino também armazena os resultados em um cartão SD como backup. Para que o backup contenha o horário correto, o Arduino consulta um servidor NTP (Network Time Protocol) uma vez por dia para poder calcular o horário pela função millis(). [essa parte do cartão e do NTP foi removida do código, mas o texto foi mantido para dar ideias aos leitores]

Você pode conferir o código que roda no Arduino no GitHub e pode ver o esquemático abaixo (clique para ver maior). Note que os dados do pluviômetro e anemômetro chegam pelo conector J2, mas esses componentes não aparecem no esquemático.

Diagrama esquemático da estação meteorológica

Como pode ser visto na foto e no esquemático, também há 2 LEDs RGB e 1 LED monocromático indicadores de status ligados a um shift register (para economizar pinos do Arduino, lembrando que cada LED RGB usa um pino para cada cor, num total de 3 pinos).

Após um longo período de testes, chegou a hora de dar um passo a diante e usar uma solução um pouco mais permanente e bem mais organizada: uma PCB. A partir do esquemático a cima, fiz o desenho no EAGLE (abaixo) e encomendei as PCBs no site DirtyPCBs.com. A montagem final pode ser vista na foto no topo da página.

PCB da estação meteorológica

Envio dos dados

O Arduino envia os dados ao servidor utilizando uma requisição do tipo GET, aquela em que os parâmetros fazem parte do endereço do site. Assim, o Arduino monta um endereço usando as medidas obtidas e envia uma solicitação ao servidor deste tipo (o link abaixo não funciona, é só um exemplo, falta um parâmetro de senha):

http://www.danilorvieira.com/estacao/add/?T=24.0&H=69.9&P=930.91&I=26.83&Hi=36&Ti=28

O código Arduino responsável pela solicitação é o seguinte (foram omitidos os códigos para acender e apagar os LEDs de status e também os demais procedimentos de incialização):

#include <Ethernet.h>

byte mac[] = {0x90, 0xA3, 0xDF, 0x2E, 0xDB, 0xB5}; // MAC address ficitício
IPAddress ip(192, 168, 1, 110);
EthernetClient client;
unsigned long lastConnectionTime = 0;
const byte server[] = {00, 00, 00, 00}; // IP fictício

void setup() {
        // ...
        // Inicia a porta ethernet
        Ethernet.begin(mac, ip);
        // ...
}

void httpRequest(double T, double H, double P, double H_int, double T_int2) {
    // se a conexão for bem sucedida
    if (client.connect(server, 80)) {
        client.print("GET /estacao/add/?&T=");
        client.print(T, 1);
        client.print("&H=");
        client.print(H, 1);
        client.print("&P=");
        client.print(P, 2);
        client.print("&I=");
        client.print(TempInterna, 2);
        client.print("&Hi=");
        client.print(H_int, 0);
        client.print("&Ti=");
        client.print(T_int2, 0);
        client.println(" HTTP/1.1");

        client.println("Host: www.danilorvieira.com");
        client.println("User-Agent: arduino-ethernet");
        client.println("Connection: close");
        client.println();

        lastConnectionTime = millis();
    } else {
        client.stop();
    }
}

O servidor recebe esta solicitação e encaminha a um aplicativo Django que interpreta as variáveis presentes no endereço solicitado e armazena as medições em um banco de dados MySQL. Quando solicitado, o aplicativo gera os gráficos em SVG usando a matplotlib ou um JSON que é usado pelo HighCharts para plotar as séries temporais.

Lista de partes

Comentários sobre os resultados

Os dados obtidos de uma estação como esta podem apresentar resultados interessantes quando analizados. No início deste artigo, vemos os resultados em gráficos simples para as últimas 24 horas, mas podemos fazer gráficos mais interessantes. Um exemplo é colocar os dias no eixo das abcissas (horizontal) e as horas no eixo das ordenadas (vertical) e então plotar a temperatura. Fazendo isso, obtemos o gráfico abaixo:

Gráfico de temperatura

Com um gráfico desses, podemos ver quais dias foram mais quentes, quais dias tiveram as manhãs mais frias e várias outras coisas. No gráfico, é bastante fácil ver dias mais quentes e mais frios, mas não é claro quando passou uma frente fria. Sabendo que uma frente fria é um centro de baixa pressão, talvez elas apareçam em um gráfico de pressão atmosférica. Abaixo está um gráfico similar ao anterior, mas para a pressão:

Gráfico de pressão atmosférica

Agora fica um pouco mais claro quando passou uma frente fria (a que mais chama atenção ocorreu entre 4 e 6 de fevereiro).

Este é só o começo da exploração dos dados da estação. Em breve chegarão sensores novos e apresentarei análizes mais interessantes.