Código de Pesquisa

Tutorial ESP32 43/55 - Estação Meteorológica IoT Internet | Kit de Aprendizado IoT ESP32 da SunFounder

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

FabricanteEspressif
Número da peçaESP32-WROOM-32
Tensão lógica/IO3,3 V
Tensão de alimentação3,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 PWM1 kHz
Limiares de lógica de entrada0,3 V (baixo), 0,7 V (alto)
Queda de tensão / RDS(on)/ saturação0,5 V
Limites térmicos-40 a 85 °C
PacoteQFN48
Notas / variantesInclui 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

esp32-43-weather_station-wiring

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

Imagens

esp32-43-weather_station-main
esp32-43-weather_station-main
esp32-43-weather_station-wiring
esp32-43-weather_station-wiring
844-ESP32 Tutorial 43/55- Arduino code for IoT Internet Weather Station
Idioma: C++
/*
 * 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;
}

Recursos e referências

Arquivos📁

Nenhum arquivo disponível.