image e1780406816245 Saravati

Como criar uma estação meteorológica com ESP32 e display OLED

O sistema será capaz de mostrar no display:

temperatura atual; umidade do ar; informações climáticas em tempo real.

Tudo isso utilizando um ESP32 conectado à internet.

Além de ser um projeto visualmente muito interessante, ele também introduz conceitos
importantes de:

  • Internet das Coisas (IoT);
  • consumo de APIs;
  • tratamento de dados JSON;
  • comunicação I2C;
  • programação embarcada.

Como funciona o projeto

O ESP32 se conecta ao WiFi e acessa um serviço online de clima chamado Open-Meteo. Esse serviço fornece informações climáticas em formato JSON. O ESP32 recebe os dados pela internet, interpreta as informações e mostra tudo em um display OLED.

O fluxo do projeto funciona assim:

ESP32

WiFi

Internet

Open-Meteo

JSON

Display OLED

Materiais necessários

Para montar o projeto você precisará de:

Vantagens deste projeto

Esse projeto possui diversas vantagens:

não precisa de sensor físico;
não precisa de API KEY;
atualiza automaticamente;
utiliza dados climáticos reais;

Além disso, é um excelente projeto para aprender:

  • IoT;
  • requisições HTTP;
  • APIs;
  • JSON;
  • displays OLED.

Pinagem do display OLED

Ligações OLED → ESP32

OLED ESP32
VCC 3.3V
GND GND
SDA GPIO 21
SCL GPIO 22

No ESP32 os pinos I2C padrão normalmente são:

SDA = GPIO21
SCL = GPIO22

Bibliotecas necessárias

No Arduino IDE instale as seguintes bibliotecas: Bibliotecas obrigatórias
Adafruit SSD1306
Adafruit GFX
ArduinoJson

Como instalar as bibliotecas

  1. Abra a Arduino IDE;
  2. Vá em:
    Sketch → Incluir Biblioteca → Gerenciar Bibliotecas
  3. Pesquise e instale:
    Adafruit SSD1306
    Adafruit GFX
    ArduinoJson

Código completo da estação meteorológica

Copie e cole o código abaixo na Arduino IDE:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_SDA 21
#define OLED_SCL 22
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// WIFI
const char* ssid = "SEU_WIFI";
const char* password = "SUA_SENHA";
// Coordenadas de Caxias do Sul
String latitude = "-29.1681";
String longitude = "-51.1794";
void mostrarOLED(float temp, int umidade) {

display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Caxias do Sul");
display.setTextSize(2);
display.setCursor(0, 18);
display.print(temp, 1);
display.println(" C");
display.setTextSize(1);
display.setCursor(0, 50);
display.print("Umidade: ");
display.print(umidade);
display.println("%");
display.display();
}
void setup() {
Serial.begin(115200);
Wire.begin(OLED_SDA, OLED_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED nao encontrado!");
while (true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Conectando WiFi...");
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("\nWiFi conectado!");
display.clearDisplay();
display.setCursor(0, 0);
display.println("WiFi conectado!");
display.display();
delay(1000);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url =
"https://api.open-meteo.com/v1/forecast?latitude="
+ latitude +
"&longitude="
+ longitude +
"&current=temperature_2m,relative_humidity_2m";
Serial.println(url);
http.begin(url);
int httpCode = http.GET();
Serial.print("HTTP Code: ");
Serial.println(httpCode);
if (httpCode == 200) {
String payload = http.getString();
Serial.println(payload);
DynamicJsonDocument doc(4096);
deserializeJson(doc, payload);
float temperatura =
doc["current"]["temperature_2m"];
int umidade =
doc["current"]["relative_humidity_2m"];

Serial.print("Temperatura: ");
Serial.println(temperatura);
Serial.print("Umidade: ");
Serial.println(umidade);
mostrarOLED(temperatura, umidade);
} else {
Serial.println("Erro API");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Erro API");
display.setCursor(0, 20);
display.print("Codigo: ");
display.println(httpCode);
display.display();
}
http.end();
}
delay(60000);
} 

Explicação do código

Inclusão das bibliotecas

include <WiFi.h>

include <HTTPClient.h>

include <ArduinoJson.h>

Essas bibliotecas são responsáveis por:

conexão WiFi;
requisições HTTP;
leitura do JSON recebido pela internet.

Bibliotecas do OLED

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

Responsáveis pela comunicação e controle do display OLED.

Configuração do display

#define SCREEN_WIDTH 128

#define SCREEN_HEIGHT 64

Define a resolução do display OLED.

Conexão WiFi

WiFi.begin(ssid, password);
O ESP32 conecta na rede WiFi.

URL da API

https://api.open-meteo.com/
O ESP32 acessa a internet e busca os dados climáticos.

Leitura do JSON

deserializeJson(doc, payload);
Aqui o ESP32 interpreta o JSON recebido.

Captura da temperatura

float temperatura =
doc[“current”][“temperature_2m”];

Obtém a temperatura atual.

Captura da umidade

int umidade =
doc[“current”][“relative_humidity_2m”];

Obtém a umidade atual.

Resultado final

O display OLED mostrará algo semelhante a:

Caxias do Sul
18.5 C
Umidade: 84%

Atualizando automaticamente a cada minuto.

Possíveis problemas e soluções

OLED não liga
Troque: 0x3C
por: 0x3D

ESP32 não conecta no WiFi confira:

  • nome da rede;
  • senha;
  • sinal WiFi.

Erro na API

Verifique se o ESP32 está conectado à internet.

Melhorias possíveis

Você pode evoluir esse projeto adicionando:

  • relógio em tempo real;
  • previsão do tempo;
  • ícones climáticos;
  • temperatura máxima e mínima;
  • sensor físico local;
  • caixa impressa em 3D;
  • dashboard web;
  • integração com aplicativo.

Conclusão

Neste projeto criamos uma estação meteorológica inteligente utilizando ESP32 e display OLED. Com poucos componentes e acesso à internet, conseguimos criar um sistema moderno capaz de exibir dados climáticos em tempo real.

Esse projeto é um excelente exemplo de aplicação prática de:

  • IoT;
  • sistemas embarcados;
  • APIs;
  • comunicação WiFi;
  • displays OLED.

Além de ser extremamente didático, ele possui grande potencial para evoluir para produtos
mais avançados e aplicações profissionais.

Saiba mais sobre a parceria Saravati e Sara Educação

Este “Guia de Montagem” é uma colaboração especial entre a Saravati e a Sara Educação, criado pelo Professor Felipe Rosa. Nosso objetivo é enriquecer a comunidade de entusiastas da eletrônica, IoT e automação com recursos educacionais de alta qualidade. Através dessa parceria, buscamos inspirar e capacitar criadores em seus projetos, disponibilizando esses guias em nosso blog e nas redes sociais.

@saravatirobotica no Instagram e Tiktok

@sara.educacao no Instagram e Tiktok