Estacao Meteorologica: mudanças entre as edições
Linha 145: | Linha 145: | ||
mmChuva = mmChuva + 0.2794; | mmChuva = mmChuva + 0.2794; | ||
if(mmChuva > | if(mmChuva > 999) | ||
{mmChuva = mmChuva - | {mmChuva = mmChuva - 999;} | ||
} | } | ||
Linha 289: | Linha 289: | ||
Tensao = analogRead(A0); //variavel tensao recebe valor digital do dispositivo de direcao de vento | Tensao = analogRead(A0); //variavel tensao recebe valor digital do dispositivo de direcao de vento | ||
Serial.print("Chuva acumalada (mm): "); | Serial.print("Chuva acumalada (mm): "); | ||
Serial.println( | Serial.println(mmChuv1000a); | ||
Serial.print("Velocidade do Vento (km/h): "); | Serial.print("Velocidade do Vento (km/h): "); | ||
Serial.println(velVento); | Serial.println(velVento); | ||
Linha 305: | Linha 305: | ||
</source> | </source> | ||
--Jade Mathias 17h47min de 2 de dezembro de 2015 (BRST) | --Jade Mathias 17h47min de 2 de dezembro de 2015 (BRST) | ||
1000 | |||
===Formato csv dos dados=== | ===Formato csv dos dados=== |
Edição das 19h31min de 17 de março de 2016
Estação hidrometeorológica automatizada com microcontrolador Arduíno
Objetivo
O objetivo deste projeto é construir uma estação hidrometeorológica automatizada no Campus Foz do Iguaçu, com o objetivo de dispor um banco de dados dinâmico de informações para uso em pesquisas e estudos sobre manejo da água, integrando as áreas de conhecimento de Informática, Eletrônica, Física, Hidrologia e Aquicultura.
- Projeto da Estação Hidrometeorológica, aprovado no programa PIBIC/CNPq IFPR 2016.
Equipe
- Professores orientadores
- Evandro Cantú
- Humberto Martins Beneduzzi
- Bolsista PIBIC/IFPR
- Thiago Henrique Ribeiro
- Alunos voluntários
- Jade Mathias da Silva
- José Antonio Kazienko Sallet
- Frederik Nazario Moschkowich
Estação Meteorológica Sparkfun
Sensor de Direção do Vento
O sensor de direção do vento é fisicamente composto por oito chaves, ligadas a resistores variados. Quando o vento muda de direção um imã fecha um ou dois contatos, permitindo a medição de 16 resistências diferentes.
Na ligação em hardware, um resistor de 10k ohms é utilizado como divisor de tensão, produzindo uma tensão de saída que pode ser medido por um conversor analógico-digital.
No Arduíno a tensão medida nas entradas analógicas (variando de 0V a 5V) é convertida internamente em um número digital de 10 bits (variando de 0 a 1023).
Para o sensor de direção do vento os 16 valores de resistência no divisor de tensão produzem as seguintes entradas no Arduino:
Direção (Graus) | Resistencia (Ohms) | Tensão (Entrada=5V Resistencia=10ohms) | Binário (Saída porta Analógica) | Saída Leitura em Binário de 10 bits (0 - 1023) | |
---|---|---|---|---|---|
Mínimo | Máximo | ||||
0 | 33k | 3,84 | 786 | 744 | 805 |
22,5 | 6,57k | 1,98 | 405 | 346 | 432 |
45 | 8,2k | 2,25 | 460 | 433 | 529 |
67,5 | 891 | 0,41 | 84 | 75 | 87 |
90 | 1k | 0,45 | 92 | 88 | 109 |
112,5 | 688 | 0,32 | 65 | 0 | 74 |
135 | 2,2k | 0,9 | 184 | 156 | 213 |
157,5 | 1,41k | 0,62 | 127 | 110 | 115 |
180 | 3,9k | 1,4 | 286 | 265 | 345 |
202,5 | 3,14k | 1,19 | 243 | 214 | 264 |
225 | 16k | 3,08 | 630 | 615 | 665 |
247,5 | 14,12k | 2,93 | 599 | 530 | 614 |
270 | 120k | 4,62 | 945 | 886 | 961 |
292,5 | 42,12k | 4,04 | 827 | 806 | 885 |
315 | 64,9k | 4,78 | 978 | 962 | 1023 |
337,5 | 21,88k | 3,43 | 702 | 666 | 743 |
--José Sallet 18h52min de 18 de novembro de 2015 (BRST)--
Pluviômetro
O pluviômetro é um tipo de balde de auto esvaziamento. A cada 0.2794 mm de chuva causa um fechamento de contato momentâneo que pode ser gravado com um contador digital ou acionar uma interrupção de microcontrolador (Arduíno).
O interruptor do pluviômetro é conectado com dois condutores centrais anexados em um cabo RJ11.
--Jade Mathias 16h17min de 17 de novembro de 2015 (BRST)
Anemômetro
O anemômetro mede a velocidade do vento, fechando um contato com a ajuda de um ímã. Para uma velocidade do vento de 2.4 km/h o interruptor fecha uma vez por segundo.
O interruptor anemômetro está ligado a dois condutores internos do cabo RJ11 compartilhada pelo anemômetro e cata-vento (pinos 2 e 3).
--Jade Mathias 18h28min de 18 de novembro de 2015 (BRST)
Hardware para chaves do pluviômetro e anemômetro
Circuito para conectar as chaves do pluviômetro e anemômetro nas entradas de Interrupção do Arduíno:
Interrupções
No Arduíno UNO serão utilizadas as interrupções 0 (pino 2) e 1 (pino 3).
A cada fechamento de contados ocasionado pelos sensores uma rotina de tratamento de interrupção será acionada.
- Pluviômetro
- A cada 0.2794 mm de chuva uma interrupção é gerada. A rotina de interrupção, portanto, apenas soma 0.2794 a uma variável que guarda a chuva acumulada em mm.
- O contador de chuva acumulada em mm será uma variável circular, de 0 a 999. Isto é, uma vez chegado a 999 mm a contagem da chuva acumulada volta a zero.
- Anemômetro
- Para um vento com velocidade de 2,4 km/h o fechamento da chave ocorre uma vez por segundo (1 Hz).
- A rotina de interrupção apenas implementa um contador de pulsos. No programa principal, para uma dada base de tempo a velocidade é determinada pela expressão:
Vel = ( contadorPulsos / baseTempo ) * 2,4
- Exemplo:
- Base de tempo = 10s
- Contador de pulsos = 10
- Exemplo:
Vel = (10 / 10 ) * 2,4 = 2,4 km/h
--Evandro.cantu (discussão) 18h17min de 18 de novembro de 2015 (BRST)
Código para Arduíno
//incluindo biblioteca do sensor de temperatura e pressão
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
#define ALTITUDE 180.0 // Altitude de Foz do Iguaçu, Parana, Brasil
#define BASETEMPO 10 // define o tempo de repeticao
int Tensao;
float mmChuva = 0;
int contVento = 0;
float velVento;
//rotina da interrupcao 1: pluviometro
void choveu(){
mmChuva = mmChuva + 0.2794;
if(mmChuva > 999)
{mmChuva = mmChuva - 999;}
}
//rotina da interrupcao 0: anemometro
void vento(){
contVento++;
}
void setup()
{
Serial.begin(9600); //define a frequencia
attachInterrupt(1, choveu, RISING); // interrupcao do pluviometro
attachInterrupt(0, vento, RISING); // interrupcao do anemometro
if (pressure.begin())
Serial.println("BMP180 iniciado com sucesso...");
else
{
Serial.println("BMP180 FALHOU...\n\n");
while(1); // nao executa programa.
}
}
//funcao que define e imprime a direcao do vento
String biruta(int Tensao)
{
String direcao;
if(Tensao >= 744 && Tensao <= 805){
Serial.println("Direcao do Vento: Leste");
direcao = "L";}
else if(Tensao >= 346 && Tensao <= 432){
Serial.println("Direcao do Vento: Leste-Norderste");
direcao = "LNE";}
else if(Tensao >= 433 && Tensao <= 529){
Serial.println("Direcao do Vento: Nordeste");
direcao = "NE";}
else if(Tensao >= 75 && Tensao <= 87){
Serial.println("Direcao do Vento: Norte-Nordeste");
direcao = "NNE";}
else if(Tensao >= 88 && Tensao <= 109){
Serial.println("Direcao do Vento: Norte");
direcao = "N";}
else if(Tensao >= 0 && Tensao <= 74){
Serial.println("Direcao do Vento: Norte-Noroeste");
direcao = "NNO";}
else if(Tensao >= 156 && Tensao <= 213){
Serial.println("Direcao do Vento: Noroeste");
direcao = "NO";}
else if(Tensao >= 110 && Tensao <= 155){
Serial.println("Direcao do Vento: Oeste-Noroeste");
direcao = "ONO";}
else if(Tensao >= 265 && Tensao <= 345){
Serial.println("Direcao do Vento: Oeste");
direcao = "O";}
else if(Tensao >= 214 && Tensao <= 264){
Serial.println("Direcao do Vento: Oeste-Sudoeste");
direcao = "OSO";}
else if(Tensao >= 615 && Tensao <= 665){
Serial.println("Direcao do Vento: Sudoeste");
direcao = "SO";}
else if(Tensao >= 530 && Tensao <= 614){
Serial.println("Direcao do Vento: Sul-Sudoeste");
direcao = "SSO";}
else if(Tensao >= 886 && Tensao <= 961){
Serial.println("Direcao do Vento: Sul");
direcao = "S";}
else if(Tensao >= 806 && Tensao <= 885){
Serial.println("Direcao do Vento: Sul-Sudeste");
direcao = "SSE";}
else if(Tensao >= 962 && Tensao <= 1023){
Serial.println("Direcao do Vento: Sudeste");
direcao = "SE";}
else if(Tensao >= 666 && Tensao <= 743){
Serial.println("Direcao do Vento: Leste-Sudeste");
direcao = "LSE";}
else
Serial.println("[ Fora de Leitura!!! ]");
return direcao;
}
//funcao que define altitude, pressao e temperatura
void altitudeEPressao()
{
char status;
double T,P,p0,a;
Serial.println();
Serial.print("Altitude: ");
Serial.print(ALTITUDE,0);
Serial.println(" metros, ");
status = pressure.startTemperature();
if (status != 0)
{
delay(status);
status = pressure.getTemperature(T);
if (status != 0)
{
Serial.print("Temperatura: ");
Serial.print(T,2);
Serial.println(" °C, ");
status = pressure.startPressure(3);
if (status != 0)
{
delay(status);
status = pressure.getPressure(P,T);
if (status != 0)
{
Serial.print("Pressao Absoluta: ");
Serial.print(P,2);
Serial.println(" mbar: ");
p0 = pressure.sealevel(P,ALTITUDE); // altitude em 180m - Foz do Iguaçu
Serial.print("Pressao Relativa(Nivel do Mar): ");
Serial.print(p0,2);
Serial.println(" mbar: ");
a = pressure.altitude(P,p0);
Serial.print("Altitude Computada: ");
Serial.print(a,0);
Serial.println(" metros: ");
}
else Serial.println("erro na recuperacao da medida da pressao \n");
}
else Serial.println("erro na inicilizacao da medida da pressao\n");
}
else Serial.println("erro na recuperacao da medida da temperatura\n");
}
else Serial.println("erro na inicilizacao da medida da temperatura\n");
}
//repeticao que imprime as informacoes do programa ao usuario
void loop()
{
velVento = (contVento / BASETEMPO) * 2.4;
Tensao = analogRead(A0); //variavel tensao recebe valor digital do dispositivo de direcao de vento
Serial.print("Chuva acumalada (mm): ");
Serial.println(mmChuv1000a);
Serial.print("Velocidade do Vento (km/h): ");
Serial.println(velVento);
biruta(Tensao);
altitudeEPressao();
contVento = 0;
Serial.println("");
// PARA MODIFICAR O DELAY MODIFICAR A VARIAVEL "BASETEMPO"
// NO CABECARIO DO PROGRAMA
delay(BASETEMPO*1000); //Tempo entre as leituras em ms
}
--Jade Mathias 17h47min de 2 de dezembro de 2015 (BRST) 1000
Formato csv dos dados
Id da estação; direçao do vento; chuva acumulada; velocidade do vento; temperatura; pressao atmosferica 1;N;0.5;13.3;32.8;990 1;S;0.7;17.2;30;1020 1;NO;0.4;12;19.7;980 1;NE;0.54;13.6;42.3;900
--Jade Mathias 17h59min de 9 de dezembro de 2015 (BRST)
Sensor de Pressão Barométrica BMP180
Sensor de Pressão Barométrica BMP180
Material técnico de referência
Trabalhos relacionados
- CARVALHO, L. R. M; AMORIM, H. S. Observando as marés atmosféricas: Uma aplicação da placa Arduino com sensores de pressão barométrica e temperatura, Revista Brasileira de Ensino de Física, v. 36, n. 3, 2014.
Materiais na Wiki
Tutoriais no Site Oficial do Arduíno
- Bibliotecas e exemplos
- Ethernet e Cartão SD [3]:
- Pressão Barométrica Web Server [4]
- Guardar dados de sensores no cartão SD [5]
- Ler e escrever dados em arquivos no cartão SD [6]
- Criar e remover arquivos no cartão SD [7]
Referências
- ↑ Weather Meters https://www.sparkfun.com/products/8942
- ↑ Manual Weather Sensor Assembly https://www.sparkfun.com/datasheets/Sensors/Weather/Weather%20Sensor%20Assembly..pdf
- ↑ https://www.arduino.cc/en/Tutorial/LibraryExamples
- ↑ https://www.arduino.cc/en/Tutorial/BarometricPressureWebServer
- ↑ https://www.arduino.cc/en/Tutorial/Datalogger
- ↑ https://www.arduino.cc/en/Tutorial/ReadWrite
- ↑ https://www.arduino.cc/en/Tutorial/Files