Medição de umidade do solo com ESP32-S2 Franzininho

Posted by

Hoje faremos um projeto de medição de umidade do solo com ESP32-S2 Franzininho. Utilizaremos um sensor de umidade do solo capacitivo, encontrado aqui. A informação será mandada para o Thingspeak, já vá criar uma conta gratuíta por lá.

Sensor capacitivo de umidade do solo para Arduino
Sensor capacitivo de umidade do solo para Arduino

Este sensor consome menos de 5mA. A placa Franzininho tem um regulador LDO de 3,3V chamado Ap2112 que fornece até 600mA. Então estaremos seguros quanto a não utilizar fonte externa, apenas o regulador da própria Franzininho. O diagrama de pinagem da Franzininho está aqui.

Utilizaremos para o sensor de umidade o pino analógico: GPIO 1 (ADC1_0). Teremos também um sensor de temperatura e pressão atmosférica, o BMP280. Será conectado nos pinos SCL-GPIO 9, SDA-GPIO 8 além de 3,3V e GND. Todo o código utilizado estará aqui.

O diagrama esquemático

O diagrama esquemático do nosso medidor de umidade de plantas está abaixo. Agora observe a simplicidade, apenas dois componentes externos.

Diagrama esquemático - medidor de umidade do solo com ESP32-S2
Diagrama esquemático – medidor de umidade do solo com ESP32-S2

A montagem do protótipo no vaso de plantas é vista abaixo. Portanto observe que arrumei uma caixinha plástico para conter a ESP32-S2 Franzininho e o sensor de pressão atmosférica BMP280. Para fora ficam o cabo USB de alimentação e o sensor de umidade capacitivo.

Conjunto medidor de umidade montado
Conjunto montado no vaso da planta
Conjunto montado no vaso da planta

O código do Arduino e conexão com o Thingspeak

O código que desenvolvi foi baseado no deste link, contendo tudo que é necessário para enviar informações para o serviço Thingspeak. Então veja que a parte que você tem que configurar está quatro nas linhas abaixo. Insira as credenciais do seu WiFi, o número do canal e o API key (que você consegue na dashboard do seu thingspeak).

const char* ssid = "nomedoseuwifi";   // your network SSID (name) 
const char* password = "senhadoseuwifi";   // your network password

WiFiClient  client;

unsigned long myChannelNumber = numerodoseucanal;
const char * myWriteAPIKey = "apikeydoseucanal";

O código abaixo faz uma escrita no Thingspeak a cada 30 segundos, isso é importante para não ultrapassarmos o limite de escritas da conta gratuíta. E também porque estamos falando de uma grandeza lenta (umidade), velocidade de atualização não é necessária.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

#include <WiFi.h>
#include "ThingSpeak.h"

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

const char* ssid = "";   // your network SSID (name) 
const char* password = "";   // your network password

WiFiClient  client;

unsigned long myChannelNumber = ;
const char * myWriteAPIKey = "";

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

int stabilization= 0;
int iterationcounter= 0;
int oldtime= 0;
int humidityreadings;
int writetothingspeak= 0;
int temperature;
int pressure;

void setup() {
  // put your setup code here, to run once:
 
  Serial.begin(115200);

  WiFi.mode(WIFI_STA);   
  ThingSpeak.begin(client);  // Initialize ThingSpeak

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

  unsigned status;
  status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  //status = bmp.begin();
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }
                  
}

void loop() {
  // put your main code here, to run repeatedly:
  if(micros()- oldtime > 10000){ //repeat every 10mS
    oldtime= micros();

    iterationcounter++;
    if(iterationcounter > 97){ //wait 970mS to do anything (in between readings)
      stabilization++;
      
      if(stabilization = 3){
        
        stabilization= 0;
        iterationcounter= 0;
        humidityreadings= analogRead(A0); //read analog value
        Serial.println(humidityreadings);

        Serial.print(F("Temperature = "));
        temperature= bmp.readTemperature();
        Serial.print(temperature);
        Serial.println(" *C");

        Serial.print(F("Pressure = "));
        pressure= bmp.readPressure();
        Serial.print(pressure);
        Serial.println(" Pa");
      }
    }
    writetothingspeak++;
    if(writetothingspeak == 3000){ //write to thingspeak iot server every 30 seconds
      writetothingspeak= 0;

      // Connect or reconnect to WiFi
      if(WiFi.status() != WL_CONNECTED){
        Serial.print("Attempting to connect");
        while(WiFi.status() != WL_CONNECTED){
          WiFi.begin(ssid, password); 
          delay(5000);     
        } 
      Serial.println("\nConnected.");
      }

      // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
      // pieces of information in a channel.  Here, we write to field 1.
      
      ThingSpeak.setField(1, humidityreadings);
      ThingSpeak.setField(2, temperature);
      ThingSpeak.setField(3, pressure);
      

      int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

      /*for(int j= 1; j < 9; j++){
        int x = ThingSpeak.writeField(myChannelNumber, j, humidityreadings[j], myWriteAPIKey);
    
        if(x == 200){
          Serial.println("Channel update successful.");
        }
        else{
          Serial.println("Problem updating channel. HTTP error code " + String(x));
      }
      delay(1000);
    }*/
    

    }
    
  }
  
}

Abaixo você vê um exemplo de leituras de umidade do solo, temperatura e pressão atmosférica ambiente. Observe que o valor da umidade está crú, não tratei nem converti para percentual ainda.

Medições de umidade no Thingspeak

Conclusão

A placa ESP32-S2 Franzininho WiFi é muito versátil, conseguimos conectar um sensor de umidade do solo, um sensor de pressão atmosférica (BMP280). E depois de tudo isso enviar informações para o serviço Thingspeak. Fazendo uma conversão para percetual, que eu não fiz, você consegue determinar o “quanto” o solo está encharcado ou seco.

Não posso garantir que o serviço vai estar ligado, mas segue aqui o link da dashboard exemplo que utilizei neste artigo.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *