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