Estação Meteorológica Com Esp32.

by elismar silva in Circuits > Arduino

1138 Views, 4 Favorites, 0 Comments

Estação Meteorológica Com Esp32.

DisplayOled.jpeg
Estação Metereológica com Esp32

"Crie uma estação meteorológica IoT com ESP32 e display OLED para exibir dados climáticos em tempo real. Veja o clima de um jeito novo!"

Supplies

ºEsp32

ºDisplay Oled 0.96

Código


/*

Pinos do ESP32:


 D21 para SDA (dados)





Projeto: Estação Meteorológica IoT com Visualização OLED e ESP32

Este projeto utiliza um ESP32 para criar uma estação meteorológica IoT, exibindo informações sobre temperatura e umidade em um display OLED. Além disso, o projeto obtém a hora atual através de sincronização NTP via WiFi.


Autor: Elismar Silva




Descrição:

A Estação Meteorológica IoT com Visualização OLED é um projeto que utiliza um microcontrolador ESP32 para coletar e exibir dados de temperatura e umidade. O display OLED mostra as informações de maneira clara e fácil de entender. Além disso, o projeto inclui sincronização de horário utilizando o protocolo NTP (Network Time Protocol) via conexão WiFi, garantindo que a hora exibida seja precisa.


Recursos do Projeto:

- Coleta de dados de temperatura e umidade.

- Exibição das informações em um display OLED.

- Sincronização de horário via NTP para garantir a precisão da hora.

- Utilização de conexão WiFi para obter dados de clima e sincronizar horário.

- Interface simples e intuitiva para visualização das informações.


Instruções de Uso:

1. Conecte os pinos do ESP32 conforme indicado acima.

2. Carregue o código fonte no ESP32 utilizando a Arduino IDE.

3. O display OLED exibirá as informações de temperatura, umidade e horário.

4. As informações de clima são obtidas através de uma API de previsão do tempo.

5. O horário é sincronizado automaticamente através do protocolo NTP.


Este projeto é uma demonstração do potencial do ESP32 como uma plataforma IoT para monitorar e exibir informações meteorológicas em tempo real. A visualização no display OLED torna as informações acessíveis e fáceis de ler.

*/













// Constantes para o display OLED

#define LARGURA_TELA 128

#define ALTURA_TELA 64


#define ENDERECO_TELA 0x3C

#define LARGURA_IMAGEM 30

#define ALTURA_IMAGEM 30


// Objeto para o display OLED

Adafruit_SSD1306 tela(LARGURA_TELA, ALTURA_TELA, &Wire, RESET_OLED);


// Configuração da rede

const char nomeRede[] = {"**********"}; //Login de sua rede

const char senhaRede[] = {"********"}; //Senha de sua rede


const char* chaveAPI = "************************"; // Você pode acessar a WeatherAPI através do seguinte link: WeatherAPI. 

// Faça login e terar sua chave.


// Nomes das cidades para os dados do clima

const char* cidade_DF = "Brasilia";

const char cidades[15][20] = {

 "Brasilia", "Sao Paulo", "Rio de Janeiro", "Belo Horizonte",


 "Porto Alegre", "Curitiba", "Palmas", "Goiania", "Cuiaba", "Recife"

}; // Voce podera substituir por outras cidades


// Constantes relacionadas ao horário




const int ajusteHorarioVerao_seg = 3600;



// Abreviações para os dias da semana e meses




// Variáveis globais para o horário

int horas, minutos, segundos;


//Variaveis para mostrar temperatura e umidade local

int temperatura_DF, umidade_DF;



 tela.begin(SSD1306_SWITCHCAPVCC, ENDERECO_TELA);



 // Aguardar a conexão com a rede WiFi



  Serial.println("Conectando ao WiFi...");

 }

 Serial.println("Conectado ao WiFi!");


 // Configurar o SNTP (Protocolo de Hora na Rede Simples)



 configTime(gmtOffset_seg, ajusteHorarioVerao_seg, ntpServidor1, ntpServidor2);



 Serial.printf("Conectando a %s ", nomeRede);


 // Aguardar a conexão com a rede WiFi




 }

 Serial.println(" CONECTADO");

}



 // Verificar a conexão com a rede WiFi




  // Obter dados do clima para Brasília

  fetchWeatherData(http, cidade_DF, temperatura_DF, umidade_DF);


  // Obter dados do clima para outras cidades


   int temperatura, umidade;

   fetchWeatherData(http, cidades[i], temperatura, umidade);


   // Armazenar dados para Brasília na primeira iteração


    temperatura_DF = temperatura;

    umidade_DF = umidade;

   }


   // Exibir dados do clima para todas as cidades (exceto Brasília)


    imprimirData(cidades[i], temperatura, umidade);


  }


  // Exibir dados do clima para Brasília

  imprimirData(cidade_DF, temperatura_DF, umidade_DF);


 }

}


// Função para obter dados do clima usando a API

void fetchWeatherData(HTTPClient& http, const char* cidade, int& temperatura, int& umidade) {








  deserializeJson(doc, dados);






 }

}


// Função para exibir dados do clima no display OLED

void imprimirData(const char* cidade, int temperatura, int umidade) {

 // Exibir dados no monitor serial

 Serial.print(cidade);


 Serial.print(temperatura);




 // Exibir dados no display OLED

 tela.clearDisplay();

 tela.setTextSize(1);

 tela.setTextColor(SSD1306_WHITE);

 tela.setCursor(0, 0);

 tela.print(cidade);


 tela.print(temperatura);



 // Exibir horário atual



  char timeStr[6]; // Buffer para o horário formatado (HH:MM)



  tela.setTextSize(2);

  tela.setTextColor(SSD1306_WHITE);

  tela.setCursor(0, 10);


  tela.print(timeStr);


  // Exibir data

  tela.setTextSize(1);

  tela.setTextColor(SSD1306_WHITE);

  tela.setCursor(0, 30);


  tela.print(diasDaSemanaAbrev[informacaoHorario.tm_wday]);


  tela.print(informacaoHorario.tm_mday);


  tela.print(mesesAbrev[informacaoHorario.tm_mon]);


  tela.print(informacaoHorario.tm_year + 1900);


  // Exibir temperatura e umidade

  tela.setTextSize(2);


  tela.setCursor(0, 45);

  tela.print(temperatura_DF);




  tela.setCursor(25, 43);





  tela.setCursor(30, 45);


  tela.print(umidade_DF);

  tela.println("%");

  tela.display();






  Serial.print(temperatura_DF);




  Serial.print(umidade_DF);





  Serial.println("Ainda não há horário disponível");

 }

}


// Função de retorno para sincronização de horário


 Serial.println("Horário ajustado pelo NTP!");



 // Obter horário local


  horas = informacaoHorario.tm_hour;

  minutos = informacaoHorario.tm_min;

  segundos = informacaoHorario.tm_sec;


  imprimirData("Brasilia", 0, 0); // Substituir pelos valores reais



Diagrama Esquemático

esquema.png