Tutorial ESP32 43/55 - Estação Meteorológica IoT Internet | Kit de Aprendizado IoT ESP32 da SunFounder
Neste tutorial, construiremos uma estação meteorológica conectada à Internet usando o ESP32 e sua placa de extensão de câmera da SunFounder. Este projeto permite que o ESP32 recupere dados meteorológicos em tempo real, incluindo temperatura e umidade, e os exiba em uma tela LCD. Esta aplicação não apenas demonstra as capacidades do ESP32, mas também mostra como buscar e analisar dados de uma API externa.

À medida que avançamos pelo tutorial, vamos conectar os componentes, configurar o código e garantir que tudo funcione perfeitamente em conjunto. O resultado final será uma estação meteorológica totalmente funcional que atualiza suas medições a cada 10 segundos, fornecendo uma exibição clara e concisa das condições meteorológicas atuais (no vídeo em 00:30).
Hardware Explicado
Os principais componentes utilizados neste projeto incluem o microcontrolador ESP32, um display LCD e a fiação necessária. O ESP32 é equipado com Wi-Fi e Bluetooth integrados, permitindo que se conecte à Internet e recupere dados. O display LCD mostrará as informações atuais do tempo, incluindo temperatura e umidade.
O LCD que estamos usando é um display de caracteres 16x2, o que significa que pode mostrar duas linhas de 16 caracteres cada. Isso será suficiente para a saída das informações meteorológicas. O ESP32 se comunicará com o LCD via I2C, o que simplifica a fiação usando apenas duas linhas de dados.
Detalhes da Ficha Técnica
| Fabricante | Espressif |
|---|---|
| Número da peça | ESP32-WROOM-32 |
| Tensão lógica/IO | 3,3 V |
| Tensão de alimentação | 3,0-3,6 V |
| Corrente de saída (por canal) | 12 mA máx |
| Corrente de pico (por canal) | 40 mA |
| Orientação sobre frequência PWM | 1 kHz |
| Limiares de lógica de entrada | 0,3 V (baixo), 0,7 V (alto) |
| Queda de tensão / RDS(on)/ saturação | 0,5 V |
| Limites térmicos | -40 a 85 °C |
| Pacote | QFN48 |
| Notas / variantes | Inclui múltiplas variantes para diferentes aplicações. |
- Certifique-se de que o ESP32 está alimentado com uma fonte estável de 3,3 V.
- Use um terreno comum para todos os componentes para evitar problemas de comunicação.
- Verifique o endereço I2C do LCD usando um scanner I2C.
- Monitore o status da conexão Wi-Fi para evitar desconexões durante a recuperação de dados.
- Lidar com erros de análise JSON para robustez na recuperação de dados.
Instruções de Fiação

Para conectar os componentes, comece ligando o LCD ao ESP32. O LCD usará a interface I2C, então conecte o pino SDA do LCD ao GPIO21 no ESP32 e o pino SCL ao GPIO22. Certifique-se de conectar os pinos de energia e terra do LCD aos pinos de 5V e GND no ESP32, respectivamente.
Em seguida, certifique-se de que o ESP32 esteja alimentado corretamente usando a bateria de lítio incluída ou uma conexão USB. A bateria oferece portabilidade, enquanto a conexão USB é útil para programação e depuração. Por fim, verifique se todas as conexões estão seguras para evitar problemas de fiação solta que possam interromper a funcionalidade.
Exemplos de Código & Tutorial
Na fase de configuração do nosso programa, inicializamos a comunicação serial e conectamos à rede Wi-Fi usando o SSID e a senha fornecidos. O trecho de código a seguir lida com a conexão Wi-Fi:
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());Este código garante que o ESP32 se conecte à rede Wi-Fi especificada antes de prosseguir com qualquer coleta de dados. Se a conexão falhar, ele tentará reconectar continuamente.
Em seguida, precisamos enviar uma solicitação HTTP GET para recuperar dados meteorológicos. Isso é realizado usando o seguinte trecho de código:
String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());Aqui, construímos a URL para a solicitação da API, que inclui a cidade, o código do país e nossa chave da API.httpGETRequesta função é então chamada para buscar os dados meteorológicos.
Finalmente, analisamos a resposta JSON e exibimos os dados relevantes no LCD:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" char
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");Este trecho de código atualiza o display LCD com a hora atual, condição meteorológica, temperatura e umidade. Ele limpa o display anterior e posiciona o cursor nas posições apropriadas para cada linha.
Demonstração / O que Esperar
Após a fiação e programação bem-sucedidas, sua estação meteorológica se conectará ao Wi-Fi e começará a buscar dados meteorológicos a cada 10 segundos. Você verá a temperatura atual, a umidade e as condições meteorológicas exibidas na tela LCD. Se o ESP32 não conseguir se conectar ao Wi-Fi, ele imprimirá uma mensagem de erro no monitor serial.
Fique atento aos limites de chamadas da API para evitar ser bloqueado pelo serviço OpenWeatherMap. Se você encontrar qualquer problema com a recuperação de dados, verifique sua chave da API e assegure-se de que sua cidade e o código do país estejam especificados corretamente (no vídeo às 15:45).
Marcadores de Vídeo
- 00:00 Início
- 2:00 introdução ao projeto
- 5:04 Conta do OpenWeather
- 6:11 Fiação
- 8:05 Código do Arduino explicado
- 14:13 JASON Elementos no código
- 20:23 Selecionando a placa ESP32 e a porta COM no Arduino IDE
- 22:05 Demonstração da Estação Meteorológica no LCD1602
- 23:45 Demonstração da Estação Meteorológica no LCD2004
/*
* Rui Santos
* Detalhes completos do projeto em https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/
*
* A permissão é concedida, gratuitamente, a qualquer pessoa que obter uma cópia
* deste software e arquivos de documentação associados.
*
* O aviso de copyright acima e este aviso de permissão devem ser incluídos em todas
* as cópias ou porções substanciais do Software.
*/
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>
// Substitua as próximas variáveis pela sua combinação de SSID/Senha.
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Seu nome de domínio com caminho de URL ou endereço IP com caminho.
String openWeatherMapApiKey = "openWeatherMapApiKey";
// Substitua pelo código do seu país e cidade.
// Multibank o código do país em https://openweathermap.org/find
String city = "CITY";
String countryCode = "COUNTRY CODE";
// O TEMPO PREDEFINIDO É DE 10 SEGUNDOS PARA FINS DE TESTE
// Para uma aplicação final, verifique os limites de chamadas da API por hora/minuto para evitar ser bloqueado/proibido.
unsigned long lastTime = 0;
// Temporizador definido para 10 minutos (600000)
// unsigned long timerDelay = 600000;
// Defina o timer para 10 segundos (10000)
unsigned long timerDelay = 10000;
String jsonBuffer;
// defina o número de colunas e linhas do LCD
int lcdColumns = 16;
int lcdRows = 2;
// defina o endereço do LCD, número de colunas e linhas
// SDA -> GPIO21, SCL -> GPIO22
// o endereço do lcd é 0x27, execute um esboço de scanner I2C
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
// Hora do servidor NTP
const char* ntpServer = "pool.ntp.org";
long gmtOffset_sec = 0;
int daylightOffset_sec = 0; // 3600;
void setup() {
Serial.begin(115200);
// WiFi
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// inicializar LCD
lcd.init();
// ligar a luz de fundo do LCD
lcd.backlight();
}
void loop() {
// Envie uma solicitação HTTP GET
if ((millis() - lastTime) > timerDelay) {
// Verifique o status da conexão WiFi
if(WiFi.status()== WL_CONNECTED){
String serverPath = "http: // api.openweathermap.org/data/2.5/weather?q=" + cidade + "," + codigoPais + "&units=metric" + "&APPID=" + chaveApiOpenWeatherMap;
jsonBuffer = httpGETRequest(serverPath.c_str());
Serial.println(jsonBuffer);
JSONVar myObject = JSON.parse(jsonBuffer);
// JSON.typeof(jsonVar) pode ser usado para obter o tipo da variável.
if (JSON.typeof(myObject) == "undefined") {
Serial.println("Parsing input failed!");
return;
}
// Serial.print("Objeto JSON = ");
// Serial.println(meuObjeto);
// Serial.print("Temperatura: ");
// Serial.println(myObject["main"]["temp"]);
// Serial.print("Pressão: ");
// Serial.println(myObject["main"]["pressão"]);
// Serial.print("Umidade: ");
// Serial.println(myObject["main"]["umidade"]);
// Serial.print("Velocidade do Vento: ");
// Serial.println(myObject["vento"]["velocidade"]);
// Obter tempo
gmtOffset_sec = myObject["timezone"];
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
// tempo =
String time = printLocalTime();
// Impressão LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(myObject["weather"][0]["main"]);
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(myObject["main"]["temp"]);
lcd.print("\xDF"); // "°" caractere
lcd.print("C ");
lcd.print("H:");
lcd.print(myObject["main"]["humidity"]);
lcd.print("%");
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
String printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return "null";
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
// obter formato de hora HH:MM
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String time = String(timeHour) + ":" + String(timeMinute);
Serial.println(time)
; return time;
}
String httpGETRequest(const char* serverName) {
WiFiClient client;
HTTPClient http;
// Seu nome de domínio com caminho de URL ou endereço IP com caminho.
http.begin(client, serverName);
// Enviar solicitação HTTP POST
int httpResponseCode = http.GET();
String payload = "{}";
if (httpResponseCode>0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
payload = http.getString();
}
else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
// Recursos gratuitos
http.end();
return payload;
}
Common Course Links
Common Course Files
Recursos e referências
-
DocumentaçãoTutorial ESP32 43/55 - Página do doc SunFounder para Estação Meteorológica IoTdocs.sunfounder.com
Arquivos📁
Nenhum arquivo disponível.