Estacao Meteorologica

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar

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.

Equipe

Professores orientadores
Bolsista PIBIC/IFPR
  • Thiago Henrique Ribeiro
Alunos voluntários
  • Jade Mathias da Silva
  • José Antonio Kazienko Sallet
  • Frederik Nazario Moschkowich

Trabalhos relacionados

Estação Meteorológica Sparkfun

Referências: [1], [2]

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
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.
Anemômetro
Para um vento com velocidade de 2,4 km/h o fechamento da chave ocorre uma vez por segundo. A rotina de interrupção apenas implementa um contador de pulsos. No programa principal, para uma dada base de tempo (tempo), a velocidade é determinada pela expressão:
Vel = ( contadorPulsos / tempo ) * 2,4

--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 > 1000)
    {mmChuva = mmChuva - 1000;}
}

//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(mmChuva);
        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)

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

Materiais na Wiki

Arduíno

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