UMA ESTAÇÃO METEOROLÓGICA SEM QUAISQUER SENSORES? SÓ AQUI!

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.

 

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

 

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:

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!