La implementación trata de que tomadas las muestras por los sensores el arduino verifique los límites de nitrógeno (Según la FAO, el nivel máximo recomendado de nitrato (como nitrógeno) en el agua de riego es de 5 mg/L y el de nitrito (como nitrógeno) es de 0.5 mg/L) y fósforo ( Según la FAO, el nivel máximo recomendado de fósforo (como P) en el agua de riego es de 2 mg/L) pasado este nivel el servomotor debe dar un giro de 180° (no preciso) para cerrar la válvula.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADS1015.h>
#include <Servo.h>
// Definir pines
#define SERVO_PIN 13
// Crear instancia del objeto servo
Servo servo;
// Definir límites de nitrógeno y fósforo
const float limiteNitrato = 5.0; // mg/L
const float limiteNitrito = 0.5; // mg/L
const float limiteFosforo = 2.0; // mg/L
// Crear instancia de los sensores
Adafruit_ADS1115 ads; // Sensor de nitrógeno
void setup() {
// Inicializar comunicación serial
Serial.begin(9600);
// Inicializar el servo
servo.attach(SERVO_PIN);
// Inicializar el sensor de nitrógeno
ads.setGain(GAIN_ONE);
ads.begin();
}
void loop() {
// Leer los valores de los sensores
float valorNitrato = readNitrato();
float valorNitrito = readNitrito();
float valorFosforo = readFosforo();
// Verificar los límites de nitrógeno y fósforo
if (valorNitrato > limiteNitrato || valorNitrito > limiteNitrito || valorFosforo > limiteFosforo) {
// Si alguno de los límites se excede, cerrar la válvula
servo.write(180); // Girar el servo a 180 grados
delay(1000); // Esperar 1 segundo
// Mostrar mensaje en la consola serial
Serial.println("Se ha cerrado la válvula debido a un exceso de nitrógeno o fósforo.");
}
// Esperar un tiempo antes de tomar nuevas muestras
delay(5000); // Esperar 5 segundos
}
float readNitrato() {
// Leer el valor analógico del sensor de nitrógeno
int valorAdc = ads.readADC_SingleEnded(0);
// Calcular el valor en mg/L basado en la relación del sensor
float valorMgL = valorAdc * 3.3 / 1023.0;
// Mostrar el valor en la consola serial
Serial.print("Nitrato: ");
Serial.print(valorMgL);
Serial.println(" mg/L");
return valorMgL;
}
float readNitrito() {
// Leer el valor analógico del sensor de nitrito
int valorAdc = ads.readADC_SingleEnded(1);
// Calcular el valor en mg/L basado en la relación del sensor
float valorMgL = valorAdc * 3.3 / 1023.0;
// Mostrar el valor en la consola serial
Serial.print("Nitrito: ");
Serial.print(valorMgL);
Serial.println(" mg/L");
return valorMgL;
}
float readFosforo() {
// Leer el valor analógico del sensor de fósforo
int valorAdc = analogRead(A1);
// Calcular el valor en mg/L basado en la relación del sensor
float valorMgL = valorAdc * 3.3 / 1023.0;
// Mostrar el valor en la consola serial
Serial.print("Fosforo: ");
Serial.print(valorMgL);
Serial.println(" mg/L");
return valorMgL;
}
La energía va a ser dividida tanto para el Servo Motor como para la placa de Arduino Esp32. La placa unirá resultados del sensor y modificará el flujo de agua en caso que presente altas concentraciones de N. En la parte del ServoMotor tendrá una válvula que regule el flujo de entrada. Además Esp32 como tiene wi-Fi implementado enviar los alertas y/o resultados observados hasta ese entonces.