martes, 30 de mayo de 2023

Programa del huerto domótico.

 Programa de huerto domótico.

El hardware adquirido no sirve de nada si no se monta adecuadamente y se dota a arduino de un programa que, como un director de orquesta, sea capaz de hacer que todo funcione como se desea.
En este caso el programa se ha realizado leyendo diferentes fuentes que muestran cómo se maneja cada uno de los sensores que ha sido necesario utilizar, y componiendo un programa que no solo es capaz de leer cada una de las variables necesarias de los diferentes sensores, sino que también trata esos datos para tomar la decisión de regar o no según las mismas.
La siguiente es una imagen del programa que se ha escrito.

El programa entero es el que sigue:
// Programa realizado por Diego Bote para domotizar el huerto
// del IES Carolina Coronado de Almendralejo.
// El programa se escribe tomando de aquí y de allí por internet,
// retocando y creando lo que ha sido neceesario.


#include <OneWire.h>
#include <DallasTemperature.h>
const int oneWirePin = 5;
OneWire oneWireBus(oneWirePin);
DallasTemperature sensors(&oneWireBus);
DeviceAddress Thermometer0 = { 0x28, 0x96, 0x92, 0xC3, 0x0D, 0x00, 0x00, 0x88 }; // 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
// DeviceAddress outsideThermometer = { 0x28, 0xF2, 0xCE, 0xC4, 0x0D, 0x00, 0x00, 0xA5 }; //0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };
DeviceAddress Thermometer1 = { 0x28, 0xE6, 0xDF, 0xDE, 0x0D, 0x00, 0x00, 0xB0 }; 

#include <DHT.h>//Incluyo la librería del sensor DHT11 de humedad y temperatura.
#include <Wire.h> // Incluyo la librería para usar I2C, esto es SDA y SCL.
////////////////////////////////Para la pantalla LCD
#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); //SI no va, se puede poner 0x20 para probar
//el modulo es de 16 por 2. el protocolo es 0x27. si no va, probar con 0x20

//Pines del módulo I2C
//VCC GND SON LA TENSIÓN Y LA TIERRA
//SDA VA AL A4
//SCL VA AL A5

//////////////////////////Configuro pines y variables
int sensor0 = 2;//Pin 2 para el valor del sensor DHT11 del huerto 0
int sensor1 = 3;//Pin 3 para el valor del sensor DHT11 del huerto 1
int temp0, humedad0;//Configuro las variables de temperatura y humedad del DHT11 del huerto 0.
int temp1, humedad1;//Configuro las variables de temperatura y humedad del DHT11 del huerto 1.

//int boton = 4;//Pin 4 para activar manualmente la bomba // Ese botón no está.
// const int nivel = 9; //Pin 9 para medir el nivel de agua // Que no hay medidor de nivel de agua.
const int bomba1 = 13; //Pin 13 para la bomba1
const int bomba0 = 12; //Pin 12 para la bomba0
const int resis1 = 11; //Pin 11 para la resistencia calefactora 1
const int resis0 = 10; //Pin 10 para la resistencia calefactora 0
const int humedadsuelo0 = A0; //A0 para la humedad del suelo del huerto 0
const int humedadsuelo1 = A1; //A1 para la humedad del suelo del huerto 1

const int dry = 625; // value for dry sensor
const int wet = 239; // value for wet sensor
int tempminimasuelo = 18;

float tempC; // temperatura del sensor de tierra solicitado

DHT dht0 (sensor0, DHT11);//Configuro el modelo de DHT. Es el DHT11 del huerto 0
DHT dht1 (sensor1, DHT11);//Configuro el modelo de DHT. Es el DHT11 del huerto 1
// int botonest = 0; //Inicializamos a 0 el estado del boton // El botón de riego manual no está.

///////////////////////////////Parte de humedad suelo y riego

void setup()
{
  Serial.begin(9600);//Arrancamos el puerto serie a 9600
   sensors.begin();
  sensors.setResolution(Thermometer0, 10);
  sensors.setResolution(Thermometer1, 10);
  dht0.begin();//Arranco el sensor DHT11
  dht1.begin();//Arranco el sensor DHT11

  //Configuramos entradas y salidas
  pinMode(humedadsuelo0, INPUT);//Configuro humedadsuelo0 como entrada
  pinMode(humedadsuelo1, INPUT);//Configuro humedadsuelo1 como entrada
  pinMode(bomba0, OUTPUT);//Configuro bomba0 como salida
  pinMode(bomba1, OUTPUT);//Configuro bomba1 como salida
  pinMode(resis0, OUTPUT);//Configuro resis0 como salida
  pinMode(resis1, OUTPUT);//Configuro resis1 como salida
//  pinMode(nivel, INPUT);//Configuro el nivel de agua como entrada // No hay sensor de nivel de agua.
//  pinMode(boton, INPUT);//Configuro el boton como entrada // No hay botón de riego manual

  //Para la pantalla LCD
  lcd.init(); //Inicializamos el LCD
  lcd.backlight(); //Activamos la luz de fondo
  lcd.clear(); //Limpiamos lo que haya en pantalla
  lcd.setCursor(0, 0); //Iniciamos el cursor en el punto 0,0
}

void printTemperature(DeviceAddress deviceAddress)
{
//  float tempC = sensors.getTempC(deviceAddress);
  tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Error getting temperature");
  } else {
    Serial.print(tempC);
   Serial.println(" ºC");
  }
}

void loop()
{

Serial.println("Leyendo temperaturas");
  sensors.requestTemperatures();
  
  Serial.print("Temperatura del suelo del huerto 0: ");
  printTemperature(Thermometer0);
  //Serial.print(sensors.getTempCByIndex(0));
  Serial.print("Temperatura del suelo del huerto 1: ");
  printTemperature(Thermometer1);
  //Serial.print(sensors.getTempCByIndex(1));
  Serial.println("-------");
  //delay(2000);
  
  int SensorValue0 = analogRead(humedadsuelo0);//Leo el valor de la humedad y lo meto en SensorValue0
  int SensorValue1 = analogRead(humedadsuelo1);//Leo el valor de la humedad y lo meto en SensorValue1
//Serial.print("Humedad del suelo del huerto 0: ");
//Serial.println(SensorValue0);
//Serial.print("Humedad del suelo del huerto 1: ");
//Serial.print(SensorValue1);
//  int SensorNivel = digitalRead(nivel); //Leo lo que marca el nivel de agua, pero no hay sensor para ello.
//  int botonest = digitalRead(boton);//Leo lo que marca el boton que no está puesto
  // digitalWrite(bomba, HIGH);
  // delay(2000);
  // digitalWrite(bomba, LOW);


//Convertir la humedad en %.
//  int sensorVal0 = analogRead(A0);
   int percentageHumidity0 = map(SensorValue0, wet, dry, 100, 0); 
   Serial.print("valor del sensor de humedad0: ");
   Serial.println(SensorValue0);
   //Serial.println("%");
   Serial.print("valor de porcentaje de humedad0: ");
   Serial.print(percentageHumidity0);
   Serial.println("%");
//  int sensorVal = analogRead(A0);
   int percentageHumidity1 = map(SensorValue1, wet, dry, 100, 0); 
   Serial.print("valor del sensor de humedad1: ");
   Serial.println(SensorValue1);
   Serial.print("valor de porcentaje de humedad1: "); 
   Serial.print(percentageHumidity1);
   Serial.println("%");
   
   //delay(1000);   


  //Leo los DHT11 y meto los valores de temperatura y humedad en las variables temp y humedad
  humedad0 = dht0.readHumidity();
  temp0 = dht0.readTemperature();
  humedad1 = dht1.readHumidity();
  temp1 = dht1.readTemperature();
   if (isnan(humedad0) || isnan(temp0) || isnan(humedad1) || isnan(temp1)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return;
    }
    

 // Compute heat index in Fahrenheit (the default)
//  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
//  float hic = dht.computeHeatIndex(t, h, false);

  /////Puerto serie
  //Imprimo por el puerto serie los valores de temperatura y humedad del DHT11
  Serial.print("Temperatura en el huerto 0: "); Serial.print(temp0);
  Serial.print("ºC.  Humedad en el huerto 0: "); Serial.print(humedad0); Serial.println("%");
  Serial.print("Temperatura en el huerto 1: "); Serial.print(temp1);
  Serial.print("ºC Humedad en el huerto 1: "); Serial.print(humedad1); Serial.println("%");

  //Imprimo por el puerto serie el valor de la humedad del suelo
  Serial.print("Humedad del suelo del huerto 0: "); Serial.print(percentageHumidity0); Serial.println("%");
  Serial.print("Humedad del suelo del huerto 1: "); Serial.print(percentageHumidity1); Serial.println("%");
  //delay(5000);

  /////Para mostrarlo en el LCD

  lcd.init(); //Inicializamos el LCD
  lcd.backlight(); //Activamos la luz de fondo
  lcd.clear();//blanqueamos la pantalla
  lcd.setCursor(2, 0); //Posicion: columna 2 fila cero
  lcd.print("Carolina Coronado");
   lcd.setCursor(5, 2);
   lcd.print("Proyecto de");
   lcd.setCursor(3, 3);
   lcd.print("Huerto domotico");
   delay(4000);
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Temp.ambiente:");
   lcd.setCursor(0,1);
  lcd.print("DHT:H0:");
  lcd.print(temp0);
  lcd.print("C ");
  //lcd.setCursor(14, 0);
  lcd.print("H1:");
  lcd.print(temp1);
  lcd.print("C");
  lcd.setCursor(0, 2);
  lcd.print("Hum. ambiente:");
  lcd.setCursor(0,3);
  lcd.print("Hum.:H0:");
  lcd.print(humedad0);
  lcd.print("% ");
  //lcd.setCursor(14, 1);
  lcd.print("H1:");
  lcd.print(humedad1);
  lcd.print("%");
  delay(10000);
  lcd.clear();
  lcd.setCursor(0, 0); //Posicion: columna cero fila uno
  lcd.print("Humedad Suelo:");
  lcd.setCursor(0,1);
  lcd.print("H0:");
  //lcd.print(SensorValue0);
  lcd.print(percentageHumidity0);
  lcd.print("% ");
  //lcd.setCursor(15, 2); //Posicion: columna cero fila 
  //lcd.print(SensorValue1);
  lcd.print("H1:");
  lcd.print(percentageHumidity1);
  lcd.print("%");
  lcd.setCursor(0, 2);
  lcd.print("Temp. suelo:");
  lcd.setCursor(0,3);
  printTemperature(Thermometer0);
      lcd.print("H0:");
      lcd.print(tempC);
      lcd.print("C ");
      printTemperature(Thermometer1);
      lcd.print("H1:");
      lcd.print(tempC);
      lcd.print("C");
 // lcd.print("Imprimiendo esto.");
delay(10000);
  lcd.clear();

  /*
    //esto si quiero que la pantalla vaya de izquierda a derecha.
    for(int c=0;c<12;c++){ //hace una secuencia hacia la izquierda y luego hacia la derecha, por 12 pasos
    lcd.scrollDisplayLeft();
    delay(600);   }
    for(int c=0; c<12;c++){
    lcd.scrollDisplayRight();
    delay(600);   }
    lcd.clear();//blanqueamos la pantalla
  */

/*
  if (SensorNivel == 0 && botonest == 1)
  { Serial.println("Nivel bajo de Agua. Rellenar el tanque");
    lcd.setCursor(0, 0); //Posicion: columna cero fila cero
    lcd.print("Nivel bajo agua");
    lcd.setCursor(0, 1); //Posicion: columna cero fila cero
    lcd.print("Rellenar tanque");
    delay (2000);
    lcd.clear();//blanqueamos la pantalla
    lcd.setCursor(0, 0); //Posicion: columna cero fila cero
    lcd.print("DHT:");
    lcd.print(temp0);
    lcd.print("C/");
    lcd.print(humedad0);
    lcd.print("%");
    lcd.setCursor(0, 1); //Posicion: columna cero fila uno
    lcd.print("HS:");
    lcd.print(SensorValue0);
    lcd.print("%");
    delay (5000);
  }
*/

// Vamos a encender las resistencias necesarias para tener la tierra de las plantas a la temperatura adecuada.

//Huerto 0.
  printTemperature(Thermometer0);
  //if ( tempC < 28.0 )
  if ( int(tempC) < tempminimasuelo )
      {
      lcd.clear();//blanqueamos la pantalla
      lcd.setCursor(0, 0); //Posicion: columna cero fila cero
      lcd.print("Temp suelo H0");
      lcd.setCursor(0, 1); //Posicion: columna cero fila uno
      lcd.print(tempC);
      //lcd.print(SensorValue0);
      //lcd.print(percentageHumidity1);
      lcd.print(" C");
      lcd.setCursor(0, 2);
      lcd.print("Calefactando");
        digitalWrite(resis0, HIGH); // Enciende la resistencia del huerto 0.
        delay(4000); // La mantiene encendida durante 4 segundos.
        digitalWrite(resis0, LOW); //la vuelve a apagar.
        lcd.clear();
        }

//Huerto 1.
  printTemperature(Thermometer1);
  if ( int(tempC) < tempminimasuelo )
      {
        lcd.clear();//blanqueamos la pantalla
      lcd.setCursor(0, 0); //Posicion: columna cero fila cero
      lcd.print("Temp suelo H1");
      lcd.setCursor(0, 1); //Posicion: columna cero fila uno
      lcd.print(tempC);
      //lcd.print(SensorValue0);
      //lcd.print(percentageHumidity1);
      lcd.print(" C");
      lcd.setCursor(0, 2);
      lcd.print("Calefactando");
        digitalWrite(resis1, HIGH); // Enciende la resistencia del huerto 1.
        delay(4000); // La mantiene encendida durante 4 segundos.
        digitalWrite(resis1, LOW); //la vuelve a apagar.
        lcd.clear();
        }
/*
  if (SensorValue1 >= 700) // el valor que considero seco y hay que regar es de 700
    {
      // Si la tierra está seca, comenzara a regar
      // Riega durante 4 segundoS y espera a comprobar la humedad otro segundo
      Serial.println("La tierra del huerto 1 está seca, comienza el riego automático");
      lcd.clear();//blanqueamos la pantalla
      lcd.setCursor(0, 0); //Posicion: columna cero fila cero
      lcd.print("Riego automatico del huerto 1");
      lcd.setCursor(0, 1); //Posicion: columna cero fila uno
      lcd.print("HS:");
      //lcd.print(SensorValue0);
      lcd.print(percentageHumidity1);
      lcd.print("%");
      digitalWrite(bomba1, HIGH);
      delay(4000);
      digitalWrite(bomba1, LOW);
      delay(1000);
    */
/* mientras no haya botón puesto no tiene sentido este párrafo
      if (botonest == 0)
      { Serial.println("No se puede activar riego manual. Riego automático activo");
        lcd.clear();//blanqueamos la pantalla
        lcd.setCursor(0, 0); //Posicion: columna cero fila cero
        lcd.print("Regando automatico");
        lcd.setCursor(0, 1); //Posicion: columna cero fila cero
        lcd.print("NO MANUAL");
        delay(1000);
      }
      */
   // }



/*
  if (SensorNivel == 0 && botonest == 0)
  { Serial.println("Imposible regar, nivel bajo de agua. Debe rellenar el tanque");
    lcd.clear();//blanqueamos la pantalla
    lcd.setCursor(0, 0); //Posicion: columna cero fila cero
    lcd.print("IMPOSIBLE REGAR");
    lcd.setCursor(0, 1); //Posicion: columna cero fila cero
    lcd.print("Nivel bajo");
  }
*/


//  if (SensorNivel == 1)
//  {
//    Serial.println("Nivel de agua correcto, se puede regar");
// Regar o no el huerto 0.
    if (SensorValue0 >= dry) // el valor que considero seco y hay que regar es de 700
    {
      // Si la tierra está seca, comenzara a regar
      // Riega durante 2 segundoS y espera a comprobar la humedad otro segundo
      Serial.println("La tierra está seca, comienza el riego automático");
      lcd.clear();//blanqueamos la pantalla
      lcd.setCursor(0, 0); //Posicion: columna cero fila cero
      lcd.print("Riego automatico H0:");
      lcd.setCursor(0, 1); //Posicion: columna cero fila uno
      lcd.print("Humedad Suelo 0: ");
      //lcd.print(SensorValue0);
      lcd.print(percentageHumidity0);
      lcd.print("%");
      digitalWrite(bomba0, HIGH);
      delay(4000);
      digitalWrite(bomba0, LOW);
     // delay(1000);
    
/* mientras no haya botón puesto no tiene sentido este párrafo
      if (botonest == 0)
      { Serial.println("No se puede activar riego manual. Riego automático activo");
        lcd.clear();//blanqueamos la pantalla
        lcd.setCursor(0, 0); //Posicion: columna cero fila cero
        lcd.print("Regando automatico");
        lcd.setCursor(0, 1); //Posicion: columna cero fila cero
        lcd.print("NO MANUAL");
        delay(1000);
      }
      */
    }

/*    if (SensorValue0 < 700) //No es necesario el riego automático, pero se puede regar de forma manual
    {
      if (botonest == 0) {
        Serial.println("Regando de forma manual");
        lcd.clear();//blanqueamos la pantalla
        lcd.setCursor(0, 0); //Posicion: columna cero fila cero
        lcd.print("Riego manual");
        lcd.setCursor(0, 1); //Posicion: columna cero fila uno
        lcd.print("HS:");
        lcd.print(SensorValue0);
        lcd.print("%");
        digitalWrite(bomba0, HIGH);
      }
      if (botonest == 1) {
        digitalWrite(bomba0, LOW);
      }
    }
    */
    //Ahora el otro huerto, el 1.
     if (SensorValue1 >= dry) // el valor que considero seco y hay que regar es de 700
    {
      // Si la tierra está seca, comenzara a regar
      // Riega durante 4 segundoS y espera a comprobar la humedad otro segundo
      Serial.println("La tierra del huerto 1 está seca, comienza el riego automático");
      lcd.clear();//blanqueamos la pantalla
      lcd.setCursor(0, 0); //Posicion: columna cero fila cero
      lcd.print("Riego automatico H1:");
      lcd.setCursor(0, 1); //Posicion: columna cero fila uno
      lcd.print("Humedad Suelo 1: ");
      //lcd.print(SensorValue0);
      lcd.print(percentageHumidity1);
      lcd.print("%");
      digitalWrite(bomba1, HIGH);
      delay(4000);
      digitalWrite(bomba1, LOW);
      //delay(1000);
    
/* mientras no haya botón puesto no tiene sentido este párrafo
      if (botonest == 0)
      { Serial.println("No se puede activar riego manual. Riego automático activo");
        lcd.clear();//blanqueamos la pantalla
        lcd.setCursor(0, 0); //Posicion: columna cero fila cero
        lcd.print("Regando automatico");
        lcd.setCursor(0, 1); //Posicion: columna cero fila cero
        lcd.print("NO MANUAL");
        delay(1000);
      }
      */
    }

/*    if (SensorValue0 < 700) //No es necesario el riego automático, pero se puede regar de forma manual
    {
      if (botonest == 0) {
        Serial.println("Regando de forma manual");
        lcd.clear();//blanqueamos la pantalla
        lcd.setCursor(0, 0); //Posicion: columna cero fila cero
        lcd.print("Riego manual");
        lcd.setCursor(0, 1); //Posicion: columna cero fila uno
        lcd.print("HS:");
        lcd.print(SensorValue0);
        lcd.print("%");
        digitalWrite(bomba0, HIGH);
      }
      if (botonest == 1) {
        digitalWrite(bomba0, LOW);
      }
    }
    */
//    } // Esta llave va con el if de SensorNivel de más arriba para comprobar el niver de agua antes de regar. Hay que comprar un sensor de nivel de agua.
}

Que programado en arduino hace la magia de poner todo a funcionar. 

 

 

 

No hay comentarios:

Publicar un comentario