// ****************** LIBRERIAS ****************** //
#include <WiFi.h>
#include <WebServer.h>
#include <ArduinoJson.h>
// ************* DEFINICION DE PINES ************* //
#define TRIGGER 5
#define ECHO 18
#define VALVE_PIN 14 // Pin de control de la electroválvula
// ******* VARIABLES GLOBALES Y CONSTANTES ******* //
int intDistance;
int intTime;
int intVolume = 0;
int intFull = 11;
int intEmpty = 117;
int intCapacity = 0;
int intLevelCm = 0;
int intLevel = 0;
float floatLitersPerCm = 0.0;
float floatSpeedOfSoundCMPMS = 0.0;
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const int SerialSpeed = 115200;
const int tempAvg = 30;
const float SpeedOfSoundMPS = 331 + (tempAvg * 0.6);
IPAddress ip(192, 168, 10, 252);
IPAddress gateway(192, 168, 10, 1);
IPAddress subnet(255, 255, 255, 0);
WebServer server(80);
DynamicJsonDocument jsonDocument(250);
char bufferJson[250];
// ******** SETUP SE EJECUTA UNA SOLA VEZ ******** //
void setup()
{
floatSpeedOfSoundCMPMS = SpeedOfSoundMPS * 100 / 1000000;
floatLitersPerCm = 22.624;
intCapacity = intEmpty - intFull;
Serial.begin(SerialSpeed);
pinMode(TRIGGER, OUTPUT);
pinMode(ECHO, INPUT_PULLUP);
pinMode(VALVE_PIN, OUTPUT); // Configura el pin de la electroválvula como salida
// Configuración WiFi
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
Serial.print("Conectando a WiFi: ");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("\nConectado a WiFi");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
Serial.print("Servidor HTTP iniciado");
server.on("/", getTankStatus);
server.begin();
}
void loop()
{
/*** CHEQUEAR DISTANCIA ***/
digitalWrite(TRIGGER, HIGH);
delayMicroseconds(20);
digitalWrite(TRIGGER, LOW);
intTime = pulseIn(ECHO, HIGH);
intTime = intTime / 2;
intDistance = intTime * floatSpeedOfSoundCMPMS;
Serial.print("Distancia: ");
Serial.print(intDistance);
Serial.println(" cm");
// *** CALCULAR NIVEL Y VOLUMEN *** //
if (intDistance != 0)
{
intLevelCm = intEmpty - intDistance;
if (intLevelCm < 0)
intLevelCm = 0;
if (intLevelCm > intCapacity)
intLevelCm = intCapacity;
Serial.print("Nivel: ");
Serial.print(intLevelCm);
Serial.println(" cm");
Serial.print("Capacidad: ");
Serial.print(intCapacity);
Serial.println(" cm");
intLevel = (float(intLevelCm / float(intCapacity)) * 100);
Serial.print("Nivel: ");
Serial.print(intLevel);
Serial.print(" %");
intVolume = intLevelCm * floatLitersPerCm;
Serial.print(" Volumen: ");
Serial.print(intVolume);
Serial.println(" lts");
}
else // Cuando int.Distance es 0 es un error de sensor o está desconectado //
{
intLevel = -1;
intVolume = -1;
}
// *** CONTROL DE ELECTROVÁLVULA *** //
if (intLevel < 100)
{
digitalWrite(VALVE_PIN, HIGH); // Abre la electroválvula cuando el nivel es menor al 100%
Serial.println("Electroválvula abierta");
}
else if (intLevel >= 100)
{
digitalWrite(VALVE_PIN, LOW); // Cierra la electroválvula cuando el nivel llega al 100%
Serial.println("Electroválvula cerrada");
}
// *** CHEQUEA CONEXION WIFI Y WEBSERVER *** //
if (WiFi.status() == WL_CONNECTED)
{
server.handleClient();
}
else
{
Serial.println("Conexión perdida");
WiFi.disconnect();
WiFi.reconnect();
}
delay(1000);
}
void getTankStatus()
{
Serial.println("Obtener estado del tanque");
jsonDocument.clear();
jsonDocument["Nivel"] = intLevel;
jsonDocument["Volumen"] = intVolume;
serializeJson(jsonDocument, bufferJson);
// Agrega el porcentaje de llenado como un dial directamente en el HTML
String htmlPage = "<html> <head> <title>Nivel del tanque de agua</title> \
<meta name='viewport'content='width=device-width, initial-scale=1.0'> \
</head> <body> <p><b>NIVEL DEL TANQUE DE AGUA</b></p> \
<div id='gauge_div'></div> \
<p class='volumen'>Contiene <b><i>" + String(intVolume) + "</i></b> Litros de agua</p> \
<p>Electrovalvula: " + (intLevel < 100 ? "Abierta" : "Cerrada") + "</p> \
<script type='text/javascript' src='https://www.gstatic.com/charts/loader.js'></script> \
<script type='text/javascript'> \
google.charts.load('current', {'packages':['gauge']}); \
google.charts.setOnLoadCallback(drawGauge); \
function drawGauge() { \
var data = google.visualization.arrayToDataTable([ \
['Label', 'Value'], \
['Nivel', " + String(intLevel) + "] \
]); \
var options = { \
width: 400, height: 350, \
redFrom: 0, redTo: 25, \
yellowFrom: 25, yellowTo: 50, \
minorTicks: 25 \
}; \
var chart = new google.visualization.Gauge(document.getElementById('gauge_div')); \
chart.draw(data, options); \
} \
</script> \
</body> </html>";
server.send(200, "text/html", htmlPage);
}Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1