/*************************************************************
Monitoramento de Nível de Água com ESP32 e Blynk
Utilizando o sensor ultrassônico HC-SR04 para medir a distância
até o nível da água e enviar os dados para o aplicativo Blynk.
App dashboard setup:
- Widget de Display para V5 (nível de água)
- Widget de LED para V6 (status da bomba)
- Widget de Button para controlar o status da bomba
*************************************************************/
#define BLYNK_TEMPLATE_ID "TMPL2kMmQ2uxn"
#define BLYNK_TEMPLATE_NAME "trabalho algoritmo bruno s alexandre m"
#define BLYNK_AUTH_TOKEN "BvmSGcEY-f59PrPjVS2qudcjZSSR9Kze"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <NewPing.h>
// Credenciais da rede Wi-Fi
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Definindo os pinos do sensor HC-SR04 e do LED
#define TRIGGER_PIN 5
#define ECHO_PIN 18
#define LED_PIN 17 // Pino do LED físico
#define MAX_DISTANCE 40
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
BlynkTimer timer;
bool bombaLigada = false; // Variável para armazenar o estado da bomba
// Função para medir a distância e calcular o nível de água
void sendWaterLevel() {
int distance = sonar.ping_cm();
if (distance == 0) {
distance = MAX_DISTANCE;
}
int waterLevel = MAX_DISTANCE - distance;
// Envia o nível de água para o Blynk
Blynk.virtualWrite(V5, waterLevel);
Serial.print("Distância: ");
Serial.print(distance);
Serial.print(" cm, Nível de Água: ");
Serial.print(waterLevel);
Serial.println(" cm");
// Ligar o LED se o nível de água estiver abaixo de 200 cm
if (distance < 20) {
digitalWrite(LED_PIN, LOW); // Liga o LED
} else {
digitalWrite(LED_PIN, HIGH); // Desliga o LED
}
}
// Função chamada quando o botão de controle da bomba é pressionado no Blynk
BLYNK_WRITE(V6) {
bombaLigada = param.asInt(); // Recebe o valor do botão (0: desligado, 1: ligado)
if (bombaLigada) {
Serial.println("Bomba ligada");
// Aqui podemos controlar a bomba física, mas no caso apenas simulamos com o LED
} else {
Serial.println("Bomba desligada");
// Desligar a bomba, se necessário, ou simular com o LED
}
// Atualiza o LED virtual no Blynk para refletir o estado da bomba
Blynk.virtualWrite(V6, bombaLigada ? 25 : 0); // 255: LED aceso, 0: LED apagado
}
void setup() {
Serial.begin(115200);
Serial.begin(9600);
// Configura o LED físico como saída
pinMode(LED_PIN, OUTPUT);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, sendWaterLevel); // Medir nível de água a cada 1 segundo
}
void loop() {
Blynk.run(); // Necessário para a comunicação com o Blynk
timer.run(); // Necessário para a execução do timer
}