Vídeo deste Projeto no nosso canal do YouTube:
Nos dias de hoje, onde já não sabemos o que esperar do S. Pedro: dias de chuva que terminam com um sol radiante, ou até manhãs convidativas para dar um mergulho, mas que acabam por se tornar em céus escuros; torna-se importante estarmos informados sobre como vai estar o tempo na nossa cidade, preparando-nos previamente antes de sair de casa. Neste artigo, vamos criar uma estação meteorológica bastante simples, sem necessidade de quaisquer sensores!
- Material Necessário
Para este projeto, vamos precisar dos seguintes materiais:
| Imagem | Produto | Comprar |
|---|---|---|
![]() |
LilyGo TTGO V1.4 ESP32 | |
![]() |
2 Breadboard’s 830 Pinos | |
![]() |
LCD 16×2 I2C | |
![]() |
Jumpers Macho-Fêmea |
- Montagem do Circuito
No que toca à montagem, vamos apenas utilizar a comunicação I2C entre o LCD e a ESP32, ligando o pino SCL ao pino 22 da ESP e o pino SDA ao pino 21 da mesma placa.

- API WorldTimeAPI (Documentação)
Esta será a API responsável por nos fornecer os dados de hora e data. Para o GET request, apenas é preciso aceder ao link com a seguinte composição:
http://worldtimeapi.org/api/timezone/America/Argentina/Salta
no nosso caso:
http://worldtimeapi.org/api/timezone/Europe/Lisbon
- API OpenWeatherMapAPI (Documentação)
Esta API será responsável por fornecer as informações do estado do tempo. Esta, porém, não é tão direta como a anterior, pelo que é preciso registar na plataforma e obter uma chave única, utilizada posteriormente no código.
- Arduino IDE
Para terminar, basta abrirmos o Arduino IDE, e compilarmos o código do projeto. Para isso, vamos instalar as seguintes livrarias:
-
- Livraria LiquidCrystal_I2C -> Para o LCD
- Livraria WiFi.h -> Previamente instalada com as placas ESP32
- Livraria HttpClient.h -> Para efetuar os pedidos GET aos servidores
- Livraria Arduino_JSON.h -> Para descodificar o payload recebido pelos servidores
Código
/*Código para o Projeto: Estação Meteorológica com ESP32
- Material necessário:
-> Placa ESP32 LilyGo TTGO V1.4
-> 2 Breadboards
-> LCD I2C 16x2
-> Jumper Macho-Fêmea
Todo o material pode ser adquirido a partir do artigo do nosso blog deste projeto!
*****************************************************LIGAÇÕES******************************************************
Vamos utilizar apenas a comunicação I2C entre o LCD e a ESP32, ligando o pino SCL ao pino 22 da ESP e o pino SDA ao pino 21
da mesma placa.
*******************************************************************************************************************
Para mais informações sobre o projeto:
www.electrofun.pt/blog/uma-estacao-meteorologica-sem-quaisquer-sensores-so-aqui
Electrofun@2022 ---> www.electrofun.pt
*/
#include
#include
#include
#include
LiquidCrystal_I2C lcd(0x27, 20, 4);
const char* SSID_WIFI = ""; //Inserir a SSID da sua rede local
const char* PASSWORD_WIFI = ""; //Inserir a password da sua rede local
String openWeatherMapAPIKey = ""; //Inserir a chave da API da meteorologia
String codigoPaisTempo = "PT";
String cidadeTempo = "Gaia";
String estadoTempo, dataTimeString, temperaturaString, temperaturaArredString;
String dayNow, monthNow, yearNow, hourNow, minuteNow, secondNow;
void setup() {
Serial.begin(115200);
WiFi.begin(SSID_WIFI, PASSWORD_WIFI);
Serial.print("A ligar à rede Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Conexão bem sucedida. IP: ");
Serial.println(WiFi.localIP());
lcd.begin();
lcd.backlight();
}
void loop() {
atualizarDadosTempo();
atualizarLCD();
delay(500);
}
void atualizarDadosTempo() {
String updateWeatherPath = "http://api.openweathermap.org/data/2.5/weather?q=" + cidadeTempo + "," + codigoPaisTempo + "&lang=pt&units=metric&APPID=" + openWeatherMapAPIKey;
String dataTimePath = "http://worldtimeapi.org/api/timezone/Europe/Lisbon";
if (WiFi.status() == WL_CONNECTED) {
String weatherRequest = httpGETRequest(updateWeatherPath.c_str());
String dataTimeRequest = httpGETRequest(dataTimePath.c_str());
JSONVar weatherContentJSON = JSON.parse(weatherRequest);
JSONVar dataTimeContentJSON = JSON.parse(dataTimeRequest);
if (JSON.typeof(weatherContentJSON) == "undefined" || JSON.typeof(dataTimeContentJSON) == "undefined") {
Serial.println("Não foi possível descodificar o JSON!");
return;
}
temperaturaString = JSON.stringify(weatherContentJSON["main"]["temp"]);
temperaturaArredString = temperaturaString.substring(0, 4);
String weatherContentString = JSON.stringify(weatherContentJSON["weather"]);
Serial.println(temperaturaString);
int indexDescription = weatherContentString.indexOf("description");
int indexIcon = weatherContentString.indexOf("icon");
estadoTempo = weatherContentString.substring(indexDescription + 14, indexIcon - 3);
Serial.println(estadoTempo);
dataTimeString = JSON.stringify(dataTimeContentJSON["datetime"]);
int indexT = dataTimeString.indexOf("T");
String dataTimeNow = dataTimeString.substring(1, indexT);
dayNow = dataTimeNow.substring(8, 12);
monthNow = dataTimeNow.substring(5, 7);
yearNow = dataTimeNow.substring(0, 4);
String timeNow = dataTimeString.substring(indexT + 1, indexT + 9);
hourNow = timeNow.substring(0, 2);
minuteNow = timeNow.substring(3, 5);
secondNow = timeNow.substring(6, 8);
}
else {
Serial.println("WiFi Desconectado");
}
}
void atualizarLCD() {
lcd.setCursor(1, 0);
lcd.print("Est. Meteorologica");
lcd.setCursor(7, 1);
lcd.print(hourNow);
lcd.setCursor(9, 1);
lcd.print(":");
lcd.setCursor(10, 1);
lcd.print(minuteNow);
lcd.setCursor(0, 2);
lcd.print("Temp. Ext.: ");
lcd.print(temperaturaArredString);
lcd.print(char(223));
lcd.print("C");
lcd.setCursor(0, 3);
estadoTempo.replace("é", "e");
estadoTempo[0] = toupper(estadoTempo[0]);
lcd.print(estadoTempo);
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
http.begin(client, serverName);
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode > 0) {
payload = http.getString();
}
else {
Serial.println("Não foi possível efetuar o GET Request");
Serial.print("URL do Servidor: ");
Serial.println(serverName);
Serial.print("Código de Erro: ");
Serial.println(httpResponseCode);
}
http.end();
return payload;
}
Basta apenas definirmos a placa ESP32 para upload e testar!
Não se esqueçam de ver o nosso vídeo sobre este artigo no nosso canal do YouTube:
Para mais projetos, percorram o nosso blog, onde podem encontrar vários artigos interessantes relacionados com eletrónica, robótica e muito mais! Visitem também o nosso site, onde encontram tudo para eletrónica e robótica!







