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


No hay comentarios:

Publicar un comentario