Mostrando entradas con la etiqueta incubadora digital. Mostrar todas las entradas
Mostrando entradas con la etiqueta incubadora digital. Mostrar todas las entradas

martes, 16 de agosto de 2016

Incubadora para germinación con Arduino Leonardo

Incubadora con Arduino Leonardo. En interfaz con la PC es posible guardar valor de temperatura interior y luminosidad (intensidad lumínica) exterior durante las 24 horas. Datalogger!!!

También es posible agregar un módulo Bluetooth HC06 o HC05 agregando un nuevo canal de comunicación serial (RX - TX), llamado digamos MySerial y enviando por él la cadena String salidaDatos mediante una instrucción MySerial.println(salidaDatos);. Con este dispositivo, se pueden leer los datos temperatura e intensidad lumínica empatando un teléfono inteligente que tenga instalado BTconsole, AruinoDroid o alguna app semejante.

El código está escrito para mantener la temperatura en un rango de 25 a 30 °C. Cuando la temperatura baja de 25 °C se encienden las dos lámparas, una incandescente de 40W para generar calor y una lámpara LED para incrementar la luminosidad sin generar más calor. Si se necesita calentar un mayor volumen hay que usar dos lámparas incandescentes o un sistema de calefacción si se requiere calefaccionar una habitación completa. Cuando la temperatura interior rebasa los 30 °C se enciende un ventilador de 12 V de corriente directa.

Controlador (Arduino Leonardo), ventilador, placa de relevadores y cable de alimentación

Por la parte interna lámparas (una incandescente de 40W y una LED) para proporcionar iluminación y calor. Sensor de temperatura LM35.

Placa Arduino Leonardo, protoboard con circuitos accesorios y LEDs indicadores (verde indica que el ventilador está activo; ámbar indica que las lámparas están encendidas; rojo indica que la temperatura está dentro de rango y tanto ventilador como lámparas están apagadas)

Listado de materiales:

  • Arduino (UNO o Leonardo)
  • Módulo con dos relevadores de 5.0V
  • Fuente de alimentación de 12V 3A
  • Ventilador de 12V CD
  • Mini Protoboard
  • 2 Socket de cerámica
  • 1 foco incandescente de 40W
  • 1 foco led
  • 2 m  de cable duplex con clavija
  • 1 hielera de poliuretano o unicel
  • 3 LED de 5mm 
  • 3 resistencias de 330 Ohm
  • 1 sensor de temperatura LM35
  • 1 m de alambre calibre 22 para proyectos en protoboard (pueden usarse jumpers macho- macho)
  • 1 fotoresistencia (LDR) de 2 M_Ohm (opcional)
  • 1 resistencia de 10 K_Ohm (opcional, para el circuito sensor de luminosidad)


El código Arduino queda de la siguiente manera:

/*
Indicador heat  fan
ledRojo   LOW   LOW
ledVerde  LOW   HIGH
ledAmbar  HIGH  LOW

Arduino-Leonardo:
PWM: 3, 5, 6, 9, 10, 11, and 13. Provide 8-bit PWM output with the analogWrite() function
*/

// Configuracion de pines
#define ledRojo 2
#define ledVerde 3
#define ledAmbar 4
#define ventilador 5
#define iluminacion 6
int flagPrimario,flagSecundario;

void setup() {
  /* Inicializacion */
  pinMode(ledRojo,OUTPUT);
  pinMode(ledVerde,OUTPUT);
  pinMode(ledAmbar,OUTPUT);
  pinMode(ventilador,OUTPUT);
  pinMode(iluminacion,OUTPUT);
  Serial.begin(9600);
  /* Secuencia de inicio */
  cicloActivo();
  digitalWrite(ledVerde,HIGH);
  ventiladorActivo();
  delay(10000);
  ventiladorParo();
  digitalWrite(ledVerde,LOW);
  delay(100);
  iluminacionActivo();
  digitalWrite(ledAmbar,HIGH);
  delay(10000);
  iluminacionParo();
  digitalWrite(ledAmbar,LOW);
  delay(1000);
  Serial.println("El sistema se ha inicializado ...");
}

void loop() {
  iluminacionParo();
  ventiladorParo();
  // Comprueba si en el ciclo anterior se ejecutó la
  // funcion cicloEstable() como ciclo de espera
  if (flagPrimario == 1){
    flagSecundario=1;
  }
  else {
    flagSecundario=0;
  }
  // Activa ventilador o iluminacion en funcion de la temperatura
  if (temp()>30.00){
    ventiladorActivo();
    iluminacionParo();
    Serial.println("Temp > 30");
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,LOW);
    digitalWrite(ledRojo,LOW);
    flagPrimario=0;
    delay(30000);
    ventiladorParo();
  }
  else if ((temp()>25.00) && (temp()<=30.00)){
    ventiladorParo();
    iluminacionParo();
    Serial.println("25 < Temp < 30");
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    digitalWrite(ledRojo,HIGH);
    flagPrimario=1;
    delay(60000);
  }
  else if (temp()<=25.00){
    ventiladorParo();
    iluminacionActivo();
    Serial.println("Temp < 25");
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,HIGH);
    digitalWrite(ledRojo,LOW);
    flagPrimario=0;
    delay(30000);
    iluminacionParo();
  }
  ventiladorParo();
  iluminacionParo();
  // Asigna el ciclo de espera con flagSecundario como criterio

  if (flagSecundario==1){
    cicloEstable();
  }
  else {
    cicloActivo();
  }
  // Despliega lectura de sensores
  String salidaDatos="";
  salidaDatos+=temp();
  salidaDatos+="\t";
  salidaDatos+=luz();
  Serial.println(salidaDatos);
}
/*****     #####     FUNCIONES     #####     *****/
float temp()
{
  analogReference(INTERNAL);
  delay(10);
  int val;
  for (int v=0; v<=10; v++){
    val=analogRead(A0);
  }
  val=analogRead(A0);
  float t_celsius=val/9.31;
  t_celsius=t_celsius+12.44;
  analogReference(DEFAULT);
  delay(10);
  //Serial.println(t_celsius);
  return(t_celsius);
}

int luz(){
  int val=analogRead(A1);
  delay(10);
  //Serial.println(val);
  return(val);
}

void cicloEstable(){
  ventiladorParo();
  iluminacionParo();
  for (int s=0; s<=100; s++){
    // 800 mS por ciclo
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,HIGH);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,HIGH);
    delay(100);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(200);
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,HIGH);
    delay(100);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(200);
  }
}

void cicloActivo(){
  ventiladorParo();
  iluminacionParo();
  // 800 mS por ciclo
  for (int s=0; s<=10; s++){
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,HIGH);
    delay(50);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(50);
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,HIGH);
    delay(100);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(200);
    digitalWrite(ledRojo,HIGH);
    digitalWrite(ledVerde,HIGH);
    digitalWrite(ledAmbar,HIGH);
    delay(100);
    digitalWrite(ledRojo,LOW);
    digitalWrite(ledVerde,LOW);
    digitalWrite(ledAmbar,LOW);
    delay(200);
  }
}

void ventiladorActivo(){
  digitalWrite(ventilador,HIGH);
  digitalWrite(iluminacion,LOW);
  Serial.println("Ventilador activo");
}

void iluminacionActivo(){
  digitalWrite(ventilador,LOW);
  digitalWrite(iluminacion,HIGH);
  Serial.println("Iluminacion activo");
}

void ventiladorParo(){
  digitalWrite(ventilador,HIGH);
  digitalWrite(iluminacion,HIGH);
  Serial.println("Ventilador en paro");
}

void iluminacionParo(){
  digitalWrite(ventilador,HIGH);
  digitalWrite(iluminacion,HIGH);
  Serial.println("Iluminacion en paro");
}

#nfjh