Go Down

Topic: Cultivo Autónomo. (Read 67724 times) previous topic - next topic

hiddenotebook

#30
May 04, 2015, 10:51 am Last Edit: May 04, 2015, 12:38 pm by hiddenotebook
Que grande tu ayuda!! ha quedado de lujo si señor después de pelearme un rato con los errores he conseguido hacer funcionar el día de la semana, tendré que esperar al domingo para ver el resultado, luego sigo con la segunda parte que ahora tengo que ir al trabajo.

Muchas gracias por la ayuda de verdad!!

Code: [Select]
/*
 Lectura de humedad del suelo 2/05/2015
  Versión del sketch: 1.7
 
  Este sketch lee una entrada analógica en el pin 0 (A0)
  imprime el resultado en el monitor serial. Usaremos
  el medidor de humedad en suelo FC-28
  
  Conexiones:
  VCC a 5V
  GND a GND
  A0 a A0
  Do de momento no se usa.
  
 Este sketch es Libre para mejorar y compartir!
 */

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;
int sensorHumedad;    // Variable para sensorHumedad
const int bomba = 12; // Defino el pin de la mini bomba de agua
const char* diaDeSemana[7]= {"Domingo", "Lunes", "Martes", "Miercoles","Jueves", "Viernes", "Sabado"};

  
// Función principal:
void setup()
{
  pinMode(bomba, OUTPUT);   // Pin 12 bomba como salida
  digitalWrite(bomba, LOW); // Iniciamos con la bomba apagada
  Wire.begin();             // Inicia el puerto I2C
  RTC.begin();              // Inicia la comunicación con el RTC
  Serial.begin(9600);       // Establece la velocidad de datos del puerto serie
  
  // Establece la fecha y hora (Comentar una vez establecida la hora)
  // RTC.adjust(DateTime(2015,05,1, 20,40,30));
}

// Función cíclica:
void loop() { // Esta función se mantiene en bucle...

  DateTime now = RTC.now();       // Obtiene la fecha y hora del RTC

  sensorHumedad = analogRead(A0); // Leemos la entrada analógica pin 0:
  sensorHumedad = map (sensorHumedad, 0, 1023, 100, 0); // Mapeamos el valor del sensor de 0 a 100
  Serial.print("Humedad ");
  Serial.print(sensorHumedad);
  Serial.print("% ");

    Serial.print("Fecha: ");
    Serial.print(now.day(), DEC); // Dia
    Serial.print('/');
    Serial.print(now.month(), DEC); // Mes
    Serial.print('/');
    Serial.print(now.year(), DEC); // Año
    Serial.print(" Hora:");
    Serial.print(' ');
    Serial.print(now.hour(), DEC); // Horas
    Serial.print(':');
    Serial.print(now.minute(), DEC); // Minutos
    Serial.print(':');
    Serial.print(now.second(), DEC); // Segundos
    Serial.print(" Dia de la semana: ");
    Serial.println(diaDeSemana[now.dayOfWeek()]);  
    Serial.println();
    delay(1000); // retardo un segundo entre lecturas.
 
  if (sensorHumedad < 85) // si el sensor lee menos de 85%...
  {
      digitalWrite(bomba, HIGH);  // ...Enciende la bomba de agua...
  }
  else // Si es mayor...
  {
      digitalWrite(bomba, LOW);  //... apagamos la bomba de agua.  
  } //Cerramos la llave del if.
} // Cerramos la llave del bucle y vuelve arriba.

 

Un pantallazo del serial:



Las pruebas las hago con un arduino uno y una maderita diseñada para estar sentado en mi escritorio, el led azul indica que es hora de riego.



Aun queda mucho por hacer, esto es solo el principio, estoy seguro que este proyecto me ocupara un año por lo menos hasta terminar todo lo que necesito hacer con arduino.



Un abrazo a todos los que siguen el proyecto en especial a surbyte por su ayuda!!


EDITO:

Bueno gracias a la ayuda de surbyte ya tengo mis dudas funcionando os dejo la actualización del código:

Code: [Select]

/*
- Sketch para lectura de humedad del suelo y riego autónomo 4/05/2015
- Versión del sketch: 1.8
- Agradecimientos por su ayuda a: Surbyte
 
  Este sketch lee una entrada analógica en el pin 0 (A0)
  imprime el resultado en el monitor serial. Usaremos
  el medidor de humedad en suelo FC-28 y un RTC DS3231N
 
  
 Este sketch es Libre para mejorar y compartir!
 */

#include <Wire.h>  // Librería para comunicación I2C
#include "RTClib.h" // Librería para trabajar con RTC DS3231N

RTC_DS1307 RTC;

int sensorHumedad;       // Variable para sensorHumedad
const int bomba = 12;   // Defino el pin de la mini bomba de agua
int histeresis = 7;        // Histeresis para bomba de riego
const char* diaDeSemana[7]= {"Domingo", "Lunes", "Martes", "Miercoles","Jueves", "Viernes", "Sabado"};

  
// Función principal:
void setup()
{
  pinMode(bomba, OUTPUT);   // Pin 12 bomba como salida
  digitalWrite(bomba, LOW);   // Iniciamos con la bomba apagada
  Wire.begin();                    // Inicia el puerto I2C
  RTC.begin();                    // Inicia la comunicación con el RTC
  Serial.begin(9600);           // Establece la velocidad de datos del puerto serie
  
  // Establece la fecha y hora (Comentar una vez establecida la hora)
  // RTC.adjust(DateTime(2015,05,1, 20,40,30));
}

// Función cíclica:
void loop() { // Esta función se mantiene en bucle...

  DateTime now = RTC.now();       // Obtiene la fecha y hora del RTC

  sensorHumedad = analogRead(A0); // Leemos la entrada analógica pin 0:
  sensorHumedad = map (sensorHumedad, 0, 1023, 100, 0); // Mapeamos el valor del sensor de 0 a 100
  Serial.print("Humedad ");
  Serial.print(sensorHumedad);
  Serial.print("% ");

    Serial.print("Fecha: ");
    Serial.print(now.day(), DEC); // Dia
    Serial.print('/');
    Serial.print(now.month(), DEC); // Mes
    Serial.print('/');
    Serial.print(now.year(), DEC); // Año
    Serial.print(" Hora:");
    Serial.print(' ');
    Serial.print(now.hour(), DEC); // Horas
    Serial.print(':');
    Serial.print(now.minute(), DEC); // Minutos
    Serial.print(':');
    Serial.print(now.second(), DEC); // Segundos
    Serial.print(" Dia de la semana: ");
    Serial.println(diaDeSemana[now.dayOfWeek()]);  
    Serial.println();
    delay(1000); // retardo un segundo entre lecturas.
 
if (sensorHumedad < 85) // si el sensor lee menos de 85%...
  {
      digitalWrite(bomba, HIGH);  // ...Enciende la bomba de agua...
  }
if (sensorHumedad > (85 + histeresis)) // hasta que no llegue a 92% de humedad...
  {
      digitalWrite(bomba, LOW);  //... apagamos la bomba de agua.  
  } //Cerramos la llave del if.
} // Cerramos la llave del bucle y vuelve arriba.

 

surbyte

#31
May 04, 2015, 12:31 pm Last Edit: May 04, 2015, 12:33 pm by surbyte
Te hago una consulta ya que tu eres el experto en tema plantas.
He leido que algunos equipos cuentan con una base de datos para cada planta, justamente porque los suelos pueden ser distintos y la cantidad de humedad que requiere una planta también lo es.
Has considerado eso? Creo haberte leído algo al respecto pero implementar esa parte es algo complicado. Te digo como para que no te des golpes contra la pared si está entre tus objetivos.
Hay un  muy buen trabajo de Noter gestión e indexación de archivos con SD que esta 95% terminado según sus propias palabras pero que para mi esta al 100%. Ese proyecto maneja bases de datos sea donde sea, incluída una SD. Asi que ahi podrias ir acumulando información a tener en cuenta.

Sugerencia para incorporar a tu sistema cuando sea necesario.

hiddenotebook

Como bien dices cada planta es un mundo aun conviviendo en el mismo invernadero con la misma temperatura y humedad cada planta tiene sus necesidades y eso complica mucho la cosa o no jaja segun queramos complicarnos claro.

Me explico podemos poner un sensor a cada planta para tratarla individualmente o poner solo unos cuantos y hacer una media, eso ya veremos como hacerlo cuando pruebe todo

Pero si que quiero hacer lo que comentas me servirá de mucho también de hecho ya compre el modulo SD pero voy a mi ritmo, recuerda que soy un novato totalmente solo tenia algunos conocimientos de C, queda mucho camino por recorrer pero me gustara hacer bases de datos y hacer gráficas con el historial de eventos, por si la planta muere por ejemplo poder consultar que ha podido pasar.

Te agradezco mucho la ayuda prestada de verdad!! Os dejo que al final no llego al trabajoooo jajajaja

surbyte

Ya se que vas a tu ritmo. Solo era una consulta que veo que acertada. He visto equipos comerciales que guardan esos datos en la PC pero claro, ahora podemos hacer cualquier de las dos cosas.
Podria estar una PC con su base de datos dedicada a eso y via WIFI comunicarse con el Arduino y tomar las decisiones que requiera.
Bien, esperaré tu próximo paso. Saludos!!

hiddenotebook

Si señor muy acertada, es una parte muy importante y será una buena herramienta, el cultivo tendrá el wifi shield así que será toda una aventura para mi.

Resulta que me confundí y compre Ethernet shield que hay que enchufar el cable y no me gustó, pero bueno por lo menos me sirve para ir haciendo pruebas.

Ahora me estoy centrando en el sistema de riego porque tiene tela el asunto de la forma que lo quiero hacer, necesito poner un depósito de agua para que la bomba coja agua. Esto va a pasar en el 90% de los casos ya que nadie tiene un grifo en la habitación de un piso. El problema es que el PH sube en agua estancada y eso es fatal en un indoor el PH influye directamente en que nutrientes puede asimilar la planta. Lo más posible es que con una bomba de oxígeno tipo pecera y un filtro para mover el agua sea suficiente, pero hay un líquido especial para regular el PH y tengo que idear una forma de dosificar el líquido. Eso sin contar que me gustaría que el cultivo pueda fertilizar por si mismo, hay mucho que probar aún hasta que quede perfecto.

Hoy hemos arreglado el código y ahora toca vigilar la tierra a ver si consigo buenos resultados con el cambio, si no aun se puede ajustar, tengo que ver que se riega como yo lo haría y que queda en condiciones esta parte es de lo más importante, regar bien es todo un arte la producción depende mucho de esta parte y es la esencia de este proyecto, si al final tengo que controlar el agua a mano no merece la pena seguir, para encender y apagar luces y ventiladores ya hay temporizadores. Mi mayor problema era regar... vengo de trabajar y mi mujer se va al trabajo me quedo sólo con mi hijo y ya sabes baño cena...

Total que el riego tiene que ser llenar un depósito y olvidarme de todo, se tiene que regular el PH y regar correctamente.

Bueno que me enrollo jajaja para mi es todo un placer contar con tu ayuda y tus sugerencias todo muy acertado y correcto gracias!! Un saludo.

surbyte

#35
May 05, 2015, 04:38 am Last Edit: May 05, 2015, 04:52 am by surbyte
Bueno dime cuanto debes dosificar, si son ml o algo mas?
Traducido, algo como que una jeringa puede satisfacer?

Tengo por ahi (debo buscarlo) un dosificador a base de una jeringa. Tal vez te sirva. Habría que buscar el modo de llenarla de modo continuo cuando se queda sin producto.
Aunque ahora mientras me ponía a buscarte ese artículo recordé que tal vez sea mas facil este método.
se llama bomba peristáltica.


bueno acá se ve bien. Se trata de un motor que hace girar una pieza que presiona sobre una goma elástica y resistente, forzando la circulación de agua. Se usa para caudales pequeños con mucha presición. Se usa en medicina. Puedes detenerla cuando quieres. Puedes aumentar o disminuir el flujo inyectado.

mejor imposible

No te rías, te busqué como hacerlo barato y fácil

Peristaltic pump DIY

hiddenotebook

#36
May 05, 2015, 10:21 am Last Edit: May 05, 2015, 10:26 am by hiddenotebook
En principio son ml actualmente uso un tubo de cristal de laboratorio tiene 10 ml es como un boli BIC sin la tinta, metes el tubo en el líquido y tapas con el dedo el culo para coger el liquido. Antes usaba una jeringa, pero vamos que tu sugerencia es perfecta yo pensé en un dosificador como los de las máquinas de café



pero esta bomba que comentas es perfecta si señor esta de lujo voy a coger una para ir probando.

Gracias de nuevo ya me siento en deuda contigo.

hiddenotebook

Estoy alucinando con tu ayuda  :smiley-eek: eres un crack, la he encontrado muy económica mira.



Y el flujo es perfecto!

surbyte

Excelente. Eso cierra perfectamente con la idea y el presupuesto que seguramente manejaría cualquiera.

Ojo que los elementos que no sean agua. recuerda que son plasticos y sufren la corrosión, pero a 10 euros puedes hasta considerar una vida util X.

hiddenotebook

#39
May 06, 2015, 12:53 am Last Edit: May 06, 2015, 12:25 pm by hiddenotebook
Es ácido nitrico no pasa nada se que no se comerá el tubo, porque he usado mucho tiempo una jeringa con un tubo de aire de pecera para recoger el liquido del fondo del bote. De todas formas en eBay también se vende el tubo para seguir usando el mismo motor eso esta genial solo habría que cambiar el tubo cuando sea necesario. :smiley-wink:

Video con prueba

hiddenotebook

#40
May 08, 2015, 12:05 pm Last Edit: May 08, 2015, 12:08 pm by hiddenotebook
Hola amigos voy a intentar acoplar el LCD para ver que pasa en la siguiente prueba de riego en LCD estoy totalmente perdido así que toda ayuda sera muy agradecida.

Aquí ando haciendo pruebas y de momento no he conseguido ni encenderlo jajajaja



Code: [Select]
/*
- Sketch para lectura de humedad del suelo y riego autónomo 4/05/2015
- Versión del sketch: 1.8
- Agradecimientos por su ayuda en especial a: Surbyte
 
  Este sketch lee una entrada analógica en el pin 0 (A0)
  imprime el resultado en el monitor serial.
  
  Usaremos:
  Medidor de humedad en suelo FC-28
  RTC DS3231N
  LCD Shield
  
 Este sketch es Libre para mejorar y compartir!
 */
 
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

//Pin assignments for DFRobot LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//---------------------------------------------

RTC_DS1307 RTC;
int sensorHumedad;    // Variable para sensorHumedad
const int bomba = 12; // Defino el pin de la mini bomba de agua
int histeresis = 5;   // Margen de riego
const char* diaDeSemana[7]= {"Domingo", "Lunes", "Martes", "Miercoles","Jueves", "Viernes", "Sabado"};

  
// Función principal:
void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  
  pinMode(bomba, OUTPUT);   // Pin 12 bomba como salida
  digitalWrite(bomba, LOW); // Iniciamos con la bomba apagada
  Wire.begin();             // Inicia el puerto I2C
  RTC.begin();              // Inicia la comunicación con el RTC
  Serial.begin(9600);       // Establece la velocidad de datos del puerto serie
  
  // Establece la fecha y hora (Comentar una vez establecida la hora)
  // RTC.adjust(DateTime(2015,05,1, 20,40,30));
}

// Función cíclica:
void loop() { // Esta función se mantiene en bucle...

  DateTime now = RTC.now();       // Obtiene la fecha y hora del RTC

  sensorHumedad = analogRead(A0); // Leemos la entrada analógica pin 0:
  sensorHumedad = map (sensorHumedad, 0, 1023, 100, 0); // Mapeamos el valor del sensor de 0 a 100
  lcd.print("Humedad ");
  lcd.print(sensorHumedad);
  lcd.print("% ");

    Serial.print("Fecha: ");
    Serial.print(now.day(), DEC); // Dia
    Serial.print('/');
    Serial.print(now.month(), DEC); // Mes
    Serial.print('/');
    Serial.print(now.year(), DEC); // Año
    Serial.print(" Hora:");
    Serial.print(' ');
    Serial.print(now.hour(), DEC); // Horas
    Serial.print(':');
    Serial.print(now.minute(), DEC); // Minutos
    Serial.print(':');
    Serial.print(now.second(), DEC); // Segundos
    Serial.print(" Dia de la semana: ");
    Serial.println(diaDeSemana[now.dayOfWeek()]);  
    Serial.println();
    delay(1000); // retardo un segundo entre lecturas.
 
if (sensorHumedad < 85) // si el sensor lee menos de 85%...
  {
      digitalWrite(bomba, HIGH);  // ...Enciende la bomba de agua...
  }
if (sensorHumedad > (85 + histeresis)) // hasta que no llegue a 90% de humedad...
  {
      digitalWrite(bomba, LOW);  //... apagamos la bomba de agua.  
  } //Cerramos la llave del if.
} // Cerramos la llave del bucle y vuelve arriba.


Como se puede apreciar en el código estoy intentando imprimir en el LCD la humedad.

Con un poco de trabajo podemos visualizar que pasa cuando vamos regando y así ajustaremos el riego mejor, cuando tenga el LCD funcionando pondré otro vídeo.

Muchas gracias!!

hiddenotebook

#41
May 09, 2015, 09:47 pm Last Edit: May 09, 2015, 09:49 pm by hiddenotebook
Funcionando LCD ya puedo ver que pasa mientras riego sin ordenador también he empezado a integrar la fuente de alimentación atx para alimentar el LCD y la fuente alimentará también los sensores, motores y ventiladores del foco.





Aunque me pasa una cosa muy rara en la hora como se puede observar en la foto de arriba "los segundos" 69... imposible verdad...

Observando veo un patrón y es que los primeros 10 segundos siempre los imprime mal del 59 pasa al 19 y 29 y 39 así hasta los 20, alguien sabe porque?

Code: [Select]
/*
- Sketch para lectura de humedad del suelo y riego autónomo 4/05/2015
- Versión del sketch: 1.8
- Agradecimientos por su ayuda a: Surbyte
 
  Este sketch lee una entrada analógica en el pin 3 (A3)
  imprime el resultado en el monitor serial. Usaremos
  el medidor de humedad en suelo FC-28 y un RTC DS3231N
 
  
 Este sketch es Libre para mejorar y compartir!
 */
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

//Pin assignments for DFRobot LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//---------------------------------------------

RTC_DS1307 RTC;
int sensorHumedad;    // Variable para sensorHumedad
const int bomba = 12; // Defino el pin de la mini bomba de agua
int histeresis = 5;   // Margen de riego
const char* diaDeSemana[7]= {"Domingo", "Lunes", "Martes", "Miercoles","Jueves", "Viernes", "Sabado"};

  
// Función principal:
void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  
  pinMode(bomba, OUTPUT);   // Pin 12 bomba como salida
  digitalWrite(bomba, LOW); // Iniciamos con la bomba apagada
  Wire.begin();             // Inicia el puerto I2C
  RTC.begin();              // Inicia la comunicación con el RTC
  Serial.begin(9600);       // Establece la velocidad de datos del puerto serie
  
  // Establece la fecha y hora (Comentar una vez establecida la hora)
  // RTC.adjust(DateTime(2015,05,1, 20,40,30));
}

// Función cíclica:
void loop() { // Esta función se mantiene en bucle...

  DateTime now = RTC.now();       // Obtiene la fecha y hora del RTC

  sensorHumedad = analogRead(A3); // Leemos la entrada analógica pin 0:
  sensorHumedad = map (sensorHumedad, 0, 1023, 100, 0); // Mapeamos el valor del sensor de 0 a 100

  lcd.setCursor(0, 0);
  lcd.print("Humedad ");
  lcd.print(sensorHumedad);
  lcd.print("% ");

    lcd.setCursor(0, 1);
    lcd.print("Hora: ");
    lcd.print(now.hour(), DEC); // Horas
    lcd.print(':');
    lcd.print(now.minute(), DEC); // Minutos
    lcd.print(':');
    lcd.print(now.second(), DEC); // Segundos
    delay(1000); // retardo un segundo entre lecturas.
 
if (sensorHumedad < 85) // si el sensor lee menos de 85%...
  {
      digitalWrite(bomba, HIGH);  // ...Enciende la bomba de agua...
  }
if (sensorHumedad > (85 + histeresis)) // hasta que no llegue a 90% de humedad...
  {
      digitalWrite(bomba, LOW);  //... apagamos la bomba de agua.  
  } //Cerramos la llave del if.
} // Cerramos la llave del bucle y vuelve arriba.

surbyte

los ves bien por el serial?

hiddenotebook

#43
May 10, 2015, 01:37 pm Last Edit: May 10, 2015, 01:38 pm by hiddenotebook
Si por el serial todo salia perfecto, pero tengo otro problema aun peor estoy intentando conectar la bomba de agua y por el serial todo sale perfecto.

Pero con el LCD al conectar la bomba se vuelve loco el LCD, también he notado que si apago la fuente ATX y conecto a arduino el USB en la fuente ATX empieza a girar el ventilador algo hay mal conectado seguro.

Ahora edito y subo un vídeo ya veras.

https://www.youtube.com/watch?v=J7YpH6qFujI


Estoy por desconectar todo y empezar de 0 para repasar todo. También he leído en tutos que el pin 10 del LCD no se puede usar en este shield yo ni siquiera lo he conectado lo mismo reside ahí el problema... Vale acabo de conectar el pin 10 al LCD y a mejorado un poco, pero solo con conectar la bomba la humedad sube al 17% desde 0

Del LCD estoy usando los pines 5V GND y 8, 9, 4, 5, 6, 7 también el 10 tal y como estaría conectado encima de arduino.






noter

Lo de los segundos es sencillamente que los números de un dígito no llegan a "tapar" los dos dígitos del contador, con lo que queda el 9 del último segundo (59). Cuando llegas a 10, supongo que vuelve a la normalidad. Ese mismo problema se te puede dar cuando las horas o minutos sean de un solo dígito. Hay varias soluciones para ello; por ejemplo poner primero un cero si el número a imprimir (hora minuto o segundo) es menor que 10, o bien preparando una cadena en un buffer, que será la que imprimas luego:
Code: [Select]
sprintf(buffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.print(buffer);

Go Up