Estacao Meteorologica: mudanças entre as edições

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


===Tutoriais no Site Oficial do Arduíno===
===Tutoriais no Site Oficial do Arduíno===
;Bibliotecas e exemplos: Ethernet e Cartão SD <ref> https://www.arduino.cc/en/Tutorial/LibraryExamples </ref>:
;Bibliotecas e exemplos: [https://www.arduino.cc/en/Tutorial/LibraryExamples Ethernet e Cartão SD]:
*Pressão Barométrica Web Server <ref> https://www.arduino.cc/en/Tutorial/BarometricPressureWebServer </ref>
*[https://www.arduino.cc/en/Tutorial/BarometricPressureWebServer Pressão Barométrica Web Server]
*Guardar dados de sensores no cartão SD <ref> https://www.arduino.cc/en/Tutorial/Datalogger </ref>
*[https://www.arduino.cc/en/Tutorial/Datalogger Guardar dados de sensores no cartão SD]
*Ler e escrever dados em arquivos no cartão SD <ref> https://www.arduino.cc/en/Tutorial/ReadWrite </ref>
*[https://www.arduino.cc/en/Tutorial/ReadWrite Ler e escrever dados em arquivos no cartão SD]
*Criar e remover arquivos no cartão SD <ref> https://www.arduino.cc/en/Tutorial/Files </ref>
*[https://www.arduino.cc/en/Tutorial/Files Criar e remover arquivos no cartão SD]


==Referências==
==Referências==

Edição das 01h06min de 18 de abril 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.

Equipe

Professores orientadores
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

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 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)

Pluviômetro no Arduíno
A cada 0.2794 mm de chuva uma interrupção é gerada. A rotina de interrupção, portanto, apenas deverá soma 0.2794 a uma variável que guarda a chuva acumulada em mm.
O contador de chuva acumulada em mm foi construído com uma variável circular, de 0 a 999. Isto é, uma vez chegado a 999 mm a contagem da chuva acumulada volta a zero.
Interrupções no Arduíno
No Arduíno UNO as interrupções externas são acionadas pelo comando AttachInterrupt e são acionadas pelo pino 2 (interrupção 0) e/ou pino 3 (interrupção 1).
No Arduíno as interrupções externas podem ser acionadas de diferentes modos:
  • LOW: Quando o pino está baixo;
  • CHANGE: Quando o valor do pino muda;
  • RISING: Quando o valor do pino sobe de baixo para alto;
  • FALLING: Quando o valor do pino desce de alto para baixo;
  • HIGH: Quando o pino está alto.
A cada fechamento de contados ocasionado pelos sensores uma rotina de tratamento de interrupção será acionada.
Conforme ilustrado no tópico abaixo sobre o hardware para a chave do pluviômetro, será utilizado a borda de subida do pino (RISING) para acionar a interrupção e contar a chuva acumulada.

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)

Anemômetro no Arduíno
A largura dos pulsos gerados pelo anemômetro serão medidos pelo Arduíno através da função pulseln(). O tempo da largura de pulso retornado pela função pulseln() é medido em microsegundos, portando a velocidade do vento será determinada pela expressão:
velocidadeVento = 2,4 * 106 / larguraPulso 
Conforme o hardware do anemômetro mostrado abaixo, a largura dos pulsos do anemômetro será medida durante o tempo que estiver em nível lógico baixo (LOW), entre dois fechamentos de contato.


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:

Sensor de Pressão Barométrica BMP180

Sensor de Pressão Barométrica BMP180

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)

Material técnico de referência

Trabalhos relacionados

Materiais na Wiki

Arduíno

Tutoriais no Site Oficial do Arduíno

Bibliotecas e exemplos
Ethernet e Cartão SD:

Referências