Estação meteorológica De Baixo Custo Com ESP32

Estação meteorológica de solo automática é um equipamento extremamente importante para analisar o microclima mas seu valor pode ser bastante elevado mas com o app Orion, ESP32 e alguns sensores que são bem fáceis de encontrar, é possível montar uma estação com um custo bastante reduzido.

Estação Meteorológica para Que serve?

A estação meteorológica é um conjunto de sensores que são capaz de medir variações climáticas e registrar em um datalogger de forma automática ou manual.

Existem diversos tipos de estações meteorológicas e cada uma delas são complementares umas as outras, as mais comuns são as de solo, balão e satélite. No entanto, a que será retratada neste post são as de solo, pois são especificadas para fazer análise de microclima e por isso são indicadas para medições locais.

Diagrama

A conexões abaixo já foram abordadas de formas independentes aqui no site respectivamente pelos seguintes links:

  • HTU21D;
  • BMP180;
  • ML8511;
  • Display OLED 0.98″.
      Estação meteorológica automática de solo de baixo custo feito com Arduino ESP32 e com aplicativo open source Orion.

Código

Todo o código abaixo trata-se da junção dos conteúdos já abordados em outro post, apenas e a única diferença é que o diretório e os tipos de variáveis usadas no Firebase foram modificadas diretório para o aplicativo Orion.

#include <SPI.h>
#include <Wire.h>
#include <ML8511.h>
#include <Adafruit_GFX.h>
#include "FirebaseESP32.h"
#include <Adafruit_BMP085.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_HTU21DF.h"
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET    -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define FIREBASE_HOST "PATH"
#define FIREBASE_AUTH "AUTH"
#define WIFI_SSID     "SSID"
#define WIFI_PASSWORD "SENHA"

FirebaseData firebaseData;
String path = "/orion/rx/";

#define ANALOGPIN     A6
ML8511 ruv(ANALOGPIN);
Adafruit_BMP085 bmp;
Adafruit_HTU21DF htu = Adafruit_HTU21DF();

double Hummidity(void){
  return htu.readHumidity() + (-0.15*(25 - htu.readTemperature()));
}
double Temperature(void){
  return (htu.readTemperature() +  bmp.readTemperature()) / 2;
}
void setup() {
  Serial.begin(9600);
  ruv.enable();
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println(WiFi.localIP());
  Serial.println("HTU21D-F test");
   
  if (!htu.begin()) {
    Serial.println("Couldn't find sensor!");
    while (1);
  }
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1);
  }
  
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.reconnectWiFi(true);
  Firebase.setReadTimeout(firebaseData, 1000 * 60);
  Firebase.setwriteSizeLimit(firebaseData, "tiny");
  if(Firebase.getShallowData(firebaseData, "/")){
    Serial.println(firebaseData.payload());
  }
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {                                 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }
  
  display.display();
  delay(2000); 
  display.clearDisplay();
}
void loop() {
    double UV = ruv.getUV();
    float DUV = ruv.estimateDUVindex(UV)/100;
    Serial.print(UV, 4);
    Serial.print("\t");
    Serial.print(DUV, 1);
    Serial.println();
    display.clearDisplay();
    display.setTextSize(1.5); 
    display.setTextColor(WHITE);
    display.setCursor(10, 10);
    display.print(F("T: "));
    display.println(Temperature());
    display.setCursor(10, 20);
    display.print(F("H: "));
    display.println(Hummidity());    
    display.setCursor(10, 30);
    display.print(F("B: "));
    display.println(bmp.readPressure());       
    display.setCursor(10, 40);
    display.print(F("U: "));
    display.println(DUV);                                                   
    display.display();

    String tp = String(Temperature()),
           hm = String(Hummidity()),
           br = String(bmp.readPressure() / 100),
           uv = String(DUV);
    
    tp.replace(".", ",");
    hm.replace(".", ",");
    br.replace(".", ",");
    uv.replace(".", ",");
    
    Firebase.setString(firebaseData, path + "temp_out", tp);
    Firebase.setString(firebaseData, path + "hum_out", hm); // E
    Firebase.setString(firebaseData, path + "bar", br);
    Firebase.setString(firebaseData, path + "uv", uv); // E
}

Funcionamento

O vídeo abaixo mostra o circuito eletrônico a direita lendo os dados de uv, temperatura, pressão atmosférica e umidade relativa do ar. Os valores são exibidos no app Orion via Firebase. Os testes realizados são apenas demonstrativos e que podem ser aplicados em ambiente externo com acesso a internet ou através de um transceptor como o LoRa, que se conecta ao computador e realiza a comunicação.

Para fazer a integração do Firebase com a Orion é bastante simples, é só ir em configurações por o path, auth e desativar a comunicação serial. Em casos de dúvidas, clique aqui para acessar o tutorial das configurações.