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.
- 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!