Estação Meteorológica Com Esp32.
by elismar silva in Circuits > Arduino
1138 Views, 4 Favorites, 0 Comments
Estação Meteoroló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
