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.
Para este projeto, foram usados:
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.
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.
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.
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:
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:
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.