Go Down

Topic: Automatizar incubadora. (Read 3210 times) previous topic - next topic

martinrv84

Hola chicos. Soy nuevo con Arduino y recien llegado al foro.
Estoy haciendo un controlador que gestione la temperatura, la humedad y el volteo de los huevos de una incubadora.
Aun estoi esperando a que me lleguen varias cosillas para el proyecto pero me he puesto ya con el sketch y hasta ahora he conseguido esto:

Code: [Select]
////////////////////////////////////////////////////
//CONTROLADOR INCUBADORA PARA HUEVOS              //
//AUTOR: MARTIN ROMERO VIEITES                    //
////////////////////////////////////////////////////


#include <DHT.h>
#include <LiquidCrystal.h>

#define CALEFACCION 10
#define HUMIDIFICADOR 11
#define MOTOR 12
#define DHTPIN 15  //Analogico 1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8,9,4,5,6,7);

void setup()
{
 Serial.begin (9600);
 lcd.begin (16,2);
 dht.begin();
 
 pinMode (CALEFACCION, OUTPUT);
 pinMode (HUMIDIFICADOR, OUTPUT);
 pinMode (MOTOR, OUTPUT);
}



void loop()
{
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 if (isnan (t)  ||  isnan (h))
 {Serial.println("Fallo sensor DHT");
 }
 else
 {
   lcd.setCursor(0,0);
   lcd.print("Temperatura ");
   lcd.print(t,0);
   lcd.print("C");
   lcd.setCursor(0,1);
   lcd.print("Humedad    ");
   lcd.print(h,0);
   lcd.print("%");
   delay(1200);
 }
 if (t <= 36)
 {
   digitalWrite (CALEFACCION, HIGH);
 }
 if (t >= 38)
 {
   digitalWrite (CALEFACCION, LOW);
 }
 
 if (h <= 55)
 {
   digitalWrite (HUMIDIFICADOR, HIGH);
 }
 if (h >= 65)
 {
   digitalWrite (HUMIDIFICADOR, LOW);
 }
}


Aun no se si funcionara algo o no pero espero que vosotros me podais decir si va bien o no.
Aun me falta el volteo de los huevos que como no tengo ni idea de servos decidi hacerlo con un motor que tendria que funcionar durante 3 segundos para hacer un volteo y lo deberia hacer con una frecuencia de 15 o 30 minutos.
Me podeis hechar una manita?

curro92

Hola,
este tema se ha tratado otras veces, puedes mirar, por ejemplo
http://arduino.cc/forum/index.php/topic,101273.0.html

martinrv84

El caso es que llegue a Arduino recientemente y no llego a entender las funciones que usaban en el hilo al que haces referencia.
Yo habia pensado detener el motor y hacerlo funcionar usando delay pero tambien afectaria al resto del programa lo que supone un gran problema.

martinrv84

#3
Nov 15, 2012, 10:28 pm Last Edit: Nov 15, 2012, 11:47 pm by martinrv84 Reason: 1
Una cosilla. Con un RTC se podrian hacer periodos de 15 o 30 minutos para hacer funcionar el motor? El coste es bajo y si alguien me dice que es posible intentare informarme para intentar programarlo para mi proyecto.

PD: Podria usar el RTC para comprobar los minutos y cuando estubiera en 00 o en 30 hacer que el motor funcionase durante 3 segundos verdad?
A ver si alguien me puede hechar un cable con este tema que es el unico "problemilla" que me queda.

curro92

Hola,
en realidad no te hace falta un RTC para controlar eso, lo puedes hacer con el millis() del mismo Arduino. No es tan crítico el período, que sea cada 30 minutos, o 40 o 50 minutos; y tampoco tendría importancia que hubiera alguna vez dos o tres volteos más o menos seguidos porque Arduino se haya reinicializado.

martinrv84

He estado investigando el comando "millis()" y he añadido algo al codigo. A ver si alguien me puede decir si esta aceptablemente bien asi o si he hecho algo mal. En principio el IDE me da el aprovado  8) :D :smiley-yell:

Code: [Select]
////////////////////////////////////////////////////
//CONTROLADOR INCUBADORA PARA HUEVOS              //
//AUTOR: MARTIN ROMERO VIEITES                    //
////////////////////////////////////////////////////


#include <DHT.h>
#include <LiquidCrystal.h>

#define CALEFACCION 10
#define HUMIDIFICADOR 11
#define MOTOR 12
#define DHTPIN 15  //Analogico 1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8,9,4,5,6,7);

void setup()
{
  Serial.begin (9600);
  lcd.begin (16,2);
  dht.begin();
 
  pinMode (CALEFACCION, OUTPUT);
  pinMode (HUMIDIFICADOR, OUTPUT);
  pinMode (MOTOR, OUTPUT);
}



void loop()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan (t)  ||  isnan (h))
  {Serial.println("Fallo sensor DHT");
  }

  else
  {
    lcd.setCursor(0,0);
    lcd.print("Temperatura ");
    lcd.print(t,0);
    lcd.print("C");
    lcd.setCursor(0,1);
    lcd.print("Humedad    ");
    lcd.print(h,0);
    lcd.print("%");
    delay(1200);
  }


  if (t <= 36)
  {
    digitalWrite (CALEFACCION, HIGH);
  }

  if (t >= 38)
  {
    digitalWrite (CALEFACCION, LOW);
  }
 

  if (h <= 55)
  {
    digitalWrite (HUMIDIFICADOR, HIGH);
  }

  if (h >= 65)
  {
    digitalWrite (HUMIDIFICADOR, LOW);
  }
 
 
  if (millis() >= 1800000)
  {
    digitalWrite (MOTOR, HIGH);
    delay (3000);
    digitalWrite (MOTOR, LOW);
  }
}

martinrv84

Nadie me puede hechar una manita? Aunque solo sea para darm alguna pista como cuando me sugerieron usar millis().
Un saludo a todos y gracias.

curro92

Hola,
busca en Google Arduino sin delay, hay muchos sitios donde explican cómo hacer temporización con millis(), por ejemplo
http://www.ardumania.es/ejercicio-2-blink-without-delay/

martinrv84


Hola,
busca en Google Arduino sin delay, hay muchos sitios donde explican cómo hacer temporización con millis(), por ejemplo
http://www.ardumania.es/ejercicio-2-blink-without-delay/



Muchisimas gracias por tu ayuda.
He modificado el codigo dejandolo tal que asi:

Code: [Select]


////////////////////////////////////////////////////
//CONTROLADOR INCUBADORA PARA HUEVOS              //
//AUTOR: MARTIN ROMERO VIEITES                    //
////////////////////////////////////////////////////

#include <DHT.h>
#include <LiquidCrystal.h>

long previousMillis = 0

#define CALEFACCION 10    //Digital 10
#define HUMIDIFICADOR 11  //Digital 11
#define MOTOR 12          //Digital 12
#define DHTPIN 15         //Analogico 1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8,9,4,5,6,7);


void setup()
{
 Serial.begin (9600);
 lcd.begin (16,2);
 dht.begin();
 
 pinMode (CALEFACCION, OUTPUT);
 pinMode (HUMIDIFICADOR, OUTPUT);
 pinMode (MOTOR, OUTPUT);  
}



void loop()
{
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 if (isnan (t)  ||  isnan (h))
 {Serial.println("Fallo sensor DHT");
 }

 else
 {
   lcd.setCursor(0,0);
   lcd.print("Temperatura ");
   lcd.print(t,0);
   lcd.print("C");
   lcd.setCursor(0,1);
   lcd.print("Humedad    ");
   lcd.print(h,0);
   lcd.print("%");
   delay(1200);
 }


 if (t <= 36)
 {
   digitalWrite (CALEFACCION, HIGH);
 }

 if (t >= 38)
 {
   digitalWrite (CALEFACCION, LOW);
 }
 

 if (h <= 55)
 {
   digitalWrite (HUMIDIFICADOR, HIGH);
 }

 if (h >= 65)
 {
   digitalWrite (HUMIDIFICADOR, LOW);
 }
 
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis > 1800000)
 {
   previousMillis = currentMillis;
   digitalWrite (MOTOR, HIGH);
   delay (3000);
   digitalWrite (MOTOR, LOW);
 }
}
 


Pero no se por que me da errores con la libreria del DHT y si lo dejo como estaba me compila sin problemas. Tienes idea de por que puede ser??
Muchisimas gracias.
Los errores son los siguientes:

Controlador_incubadora_2:17: error: expected ',' or ';' before 'DHT'
Controlador_incubadora_2.cpp: In function 'void setup()':
Controlador_incubadora_2:25: error: 'dht' was not declared in this scope
Controlador_incubadora_2.cpp: In function 'void loop()':
Controlador_incubadora_2:36: error: 'dht' was not declared in this scope

curro92

#9
Nov 20, 2012, 05:30 am Last Edit: Nov 20, 2012, 05:32 am by curro92 Reason: 1
Hola,

Te dice error: expected ',' or ';' before 'DHT'

porque has puesto

long previousMillis = 0
sin acabar con punto y coma ;

martinrv84

#10
Nov 21, 2012, 11:30 pm Last Edit: Nov 22, 2012, 08:14 am by martinrv84 Reason: 1
Muchisimas gracias y perdona por molestarte por un error tan elemental.
A continuacion dejo el sketch completo por si a alguien le sirve de algo algun dia.


Code: [Select]
////////////////////////////////////////////////////
//CONTROLADOR INCUBADORA PARA HUEVOS              //
//AUTOR: MARTIN ROMERO VIEITES                    //
//VERSION: FASE BETA                              //
//FECHA: 20-11-2012                               //
//USO LIBRE SIN FINES COMERCIALES                 //
////////////////////////////////////////////////////

#include <DHT.h>
#include <LiquidCrystal.h>

long previousMillis = 0;

#define CALEFACCION 10    //Digital 10
#define HUMIDIFICADOR 11  //Digital 11
#define MOTOR 12          //Digital 12
#define DHTPIN 15         //Analogico 1
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8,9,4,5,6,7);


void setup()
{
 Serial.begin (9600);
 lcd.begin (16,2);
 dht.begin();
 
 pinMode (CALEFACCION, OUTPUT);
 pinMode (HUMIDIFICADOR, OUTPUT);
 pinMode (MOTOR, OUTPUT);  
}



void loop()
{
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 if (isnan (t)  ||  isnan (h))
 {Serial.println("Fallo sensor DHT");
 }

 else
 {
   lcd.setCursor(0,0);
   lcd.print("Temperatura ");
   lcd.print(t,0);
   lcd.print("C");
   lcd.setCursor(0,1);
   lcd.print("Humedad    ");
   lcd.print(h,0);
   lcd.print("%");
   delay(1200);
 }


 if (t <= 36)
 {
   digitalWrite (CALEFACCION, HIGH);
 }

 if (t >= 38)
 {
   digitalWrite (CALEFACCION, LOW);
 }
 

 if (h <= 50)
 {
   digitalWrite (HUMIDIFICADOR, HIGH);
 }

 if (h >= 55)
 {
   digitalWrite (HUMIDIFICADOR, LOW);
 }
 
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis > 900000)
 {
   previousMillis = currentMillis;
   digitalWrite (MOTOR, HIGH);
   delay (3000);
   digitalWrite (MOTOR, LOW);
 }
}

curro92

Hola,
No dices de qué huevos se trata, pero si son de gallina, estás jugando con un margen de temperaturas inaceptable:
se recomienda controlar entre 37,2-37,8 para la incubación, y 37,0-37,5 para los últimos días del nacimiento. Y la humedad 50-55 para incubación, y 70-75 para el nacimiento. Además, ten en cuenta que el aire de la incubadora tiene que renovarse con aire del exterior, porque los huevos consumen bastante oxigeno.

martinrv84

Hola de nuevo.
Pues en principio seran huevos de gallina.
En cuanto a los parametros, ya he modificado los margenes de la humedad y los de la temperatura aunque en este ultimo dato no lo veo tan relevante pues el margen de error del DHT11 es superior a los 0,2ºC que le he recortado en el sketck. Pero de todas formas no los habia cambiado por que aun estoi esperando a que me lleguen los componentes.
Ya cuento con el consumo de oxigeno pero no todo va controlado por el arduino, Voi a instalar 2 ventiladores de los de pc en el interior para circulacion del aire y al mismo tiempo del calor (estos ventiladores al ser de funcionamiento ininterrumpido iran directamente alimentador sin pasar por el arduino, y para la humedad pondre otro ventilador que introduzca aire humedo desde el exterior lo que tambien oxigenara el interior.
En cuanto a cambiar los parametros sera algo a realizar manualmente modificandolos en el sketch y volviendolo a cargar al alrduino pues ya mis conocimientos no dan para tanto, en el futuro posiblemente lo mire y haga variar los valores segun el dia e incluso podria mirar de configurarlos desde los botones del lcd shield pero de momento me queda bastante fuera de mi alcance.
En cuanto me llegue todo y me ponga con el montaje sacare fotos y videos y los subire a ver que os parece.
La lista de la compra es la siguiente:


Arduino Uno R3
LCD Keypad Shield for Arduino Duemilanove & LCD 1602
DHT11
High Torque 10RPM 12V DC Geared Motor
2 ventiladores pc
1 ventilador pc (chipset 4cm) para entrada de humedad
Bombillas y portalamparas
Cable y jumpers y demas ya los tenia en casa.

Muchas gracias.

Go Up