Índice:
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:
- 1 ESP32;
- 1 display OLED I2C SSD1306 128×64;
- jumpers;
- cabo USB;
- WiFi com acesso à internet.
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
- Abra a Arduino IDE;
- Vá em:
Sketch → Incluir Biblioteca → Gerenciar Bibliotecas - 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.
