Pages: [1]   Go Down
Author Topic: Automatizar incubadora.  (Read 2949 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
////////////////////////////////////////////////////
//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?
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 738
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: November 15, 2012, 05:47:02 pm by martinrv84 » Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 738
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-cool smiley-grin smiley-yell

Code:
////////////////////////////////////////////////////
//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);
  }
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 738
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

////////////////////////////////////////////////////
//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
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 738
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

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

porque has puesto

long previousMillis = 0
sin acabar con punto y coma ;
« Last Edit: November 19, 2012, 11:32:25 pm by curro92 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
////////////////////////////////////////////////////
//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);
  }
}
« Last Edit: November 22, 2012, 02:14:15 am by martinrv84 » Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 738
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: