20 feb 2015

Colector solar para agua caliente "inteligente" - Mi primer proyecto de Arduino


Hace poco tiempo un amigo me regaló una placa de Arduino, una especie de programador tuneable para tus intereses, de relativo bajo coste, y con una comunidad de usuarios y apasionados de lo mas variopinta. Electrónica para profanos. Y así vino esta maravillosa plaquita a ocupar mi tiempo de recreo. En este vídeo aparezco maravillado ante el estado de la técnica:



Así pues decidí animarme a hacer realidad una simple idea que tenía desde hacía ya tiempo rondando la cabeza. Como es por todos conocido, las mangueras al sol, especialmente las negras, tienden a calentar el agua que contienen hasta temperaturas que incluso queman al tacto (en los días de intensa radiación solar directa).

El caso sería entonces saber cuando es bueno recircular el agua de un termo o acumulador de calor, cuando la manguera está llena de agua caliente, y cuando podemos poner mas de la fría a calentar.

Para ello fue necesario:

- Bidón de agua. Mejor un termo, pero para esta prueba de depósito sin presión (un termo eléctrico convencional tiene siempre presión de abasto. Estoy por verlo)


- Manguera, preferiblemente negra, y accesorios.


- Una bomba para recircular el agua. En mi caso utilicé la vieja bomba que tanta agua a movido en estos últimos años, a la cual le da mas miedo estar parada (porque se oxida y tranca) que estar activa.


- Dos sensores de temperatura (no saqué fotos pues no se veían bien) y un relé.


- y nuestra plaquita de Arduino, cables para empatar -observa que el cable de red convencional permite alejar los sensores y el relé "hasta donde necesites"-, y una protoboard de esas que se estilan para este tipo de cacharreo.

La conexión física es, mas o menos, como sigue:

- Los sensores de temperatura: Los dos sensores tienen una toma de 5V (la linea que lleva electricidad), un pin de información, que conectamos en este caso cada uno a una entrada analógica, ya que necesitaremos para poder medir cosas como la temperatura, y otro pin que se llama Ground y que es por donde "vuelve" la electricidad.

- El "Relay": El relé es esencialmente lo mismo, solo que la señal la conectamos a una entrada digital pues tan solo necesitamos saber si estará encendido o apagado. En mi caso esta normalmente abierto (NO). Por el otro lado del relé conectaremos una instalación normal de interruptor, pero disponiendo el propio relé. Disculpen que no hay fotos clara pero los cables estaban un poco liados ya en su sitio.

Comentar que empleé cable RJ45 o el llamado "de red" para alejar de la placa el relé y los sensores, que necesitaba quedaran "afuera", y me pareció una solución simple y efectiva para tal fin.

Y luego el código a cargar en nuestra placa de arduino. Simplemente copie y pegué el código que encontré en las referencias, y las últimas lineas "se me ocurrieron solas"... Es bastante sencillo pero consigue hacer lo que tenía en la cabeza. Ahora lo tengo en "periodo de pruebas", a ver que tal lo hace, y si lo puedo afinar. Ahí queda eso:

//......................................................................
// SOLAR THERMAL ENERGY FOR ALL (S.T.E.F.A. V_0.01)
//......................................................................
// este código permite activar un relé según un determinado diferencial de temperatura
// el objeto de este programa es poder activar una bomba de recirculación de agua
// tan solo cuando las condiciones de calentamiento solar sean óptimas
//......................................................................
int sensorPin1 = 0;
int sensorPin2 = 1;
int Relay = 8;
// activamos los dos sensores de temperatura y el relé

void setup()
// este código corre solo una vez
{
  Serial.begin(9600);
  // activa "Monitor Serial" en nuestra computadora
 
  pinMode(Relay, OUTPUT);
  // define activar-desactivar el relé
 
  Serial.println("Mas Sol, mas agua. Menos sol, menos agua.");
}

void loop()
// este código comienza una y otra vez en bucle
{

Serial.println(".....................................");

//......................................................................
// SENSOR TEMPERATURA 1
//......................................................................
int reading1 = analogRead(sensorPin1);
// obtiene la lectura

float voltage1 = reading1 * 5.0;
voltage1 /= 1024.0;
// calcula el voltaje de salida

float temperatureC1 = (voltage1 - 0.5) * 100;
// calcula la temperatura desde el voltaje

Serial.print(temperatureC1); Serial.println(" grados C ...... sensor bidon...");
// imprime la temperatura del sensor 1

//......................................................................
// SENSOR TEMPERATURA 2
//......................................................................
int reading2 = analogRead(sensorPin2);
// obtiene la lectura

float voltage2 = reading2 * 5.0;
voltage2 /= 1024.0;
// calcular el voltaje de salida

float temperatureC2 = (voltage2 - 0.5) * 100;
// calcula la temperatura desde el voltaje

Serial.print(temperatureC2); Serial.println(" grados C ...... sensor manguera");
// imprime la temperatura del sensor 2

//......................................................................
// DIFERENCIAL DE TEMPERATURA
//......................................................................
float diferencialT = temperatureC1 - temperatureC2;
// calcula el diferencial de temperatura

Serial.print(diferencialT); Serial.println(" grados C diferencial temperatura");
// imprime el diferencial de temperatura

//......................................................................
// CONTROL DEL RELÉ
//......................................................................
if( temperatureC2 < temperatureC1 + 05.00 )
// Define el diferencial de temperatura. 05.00 corresponde a 5 grados centígrados.
// Modifica este valor para adaptarlo a tus necesidades
{
  digitalWrite(Relay, HIGH);
// activa el relé (que esta normalmente abierto), desactiva la recirculación.
}

else if( temperatureC1 < temperatureC2 +- 99.00 )
//si por algo pierde la lectura del sensor,
{
  digitalWrite(Relay, HIGH);
// así no se activa por error.
}

else
{
  digitalWrite(Relay, LOW);
  Serial.println("........RECIRCULANDO AGUA........");
// desactiva el relé. Funciona a la inversa ya que
// el relé esta en NO (normalmente abierto), pues activa la bomba y mueve agua.

}

delay(8220);
// tiempo de espera entre lecturas y acción.

}


//......................................................................
//......................................................................
// Luis Rodriguez Alonso. Febrero 2015. habitainer@gmail.com
// http://habican.blogspot.com.es/
// publicado bajo GNU GENERAL PUBLIC LICENSE
// https://gnu.org/licenses/gpl-3.0.en.html
// documento realizado con información y código modificado desde:
// http://descargas.cetronic.es/TMP36.pdf
// http://tech.yeesiang.com/control-real-devices-using-relay/
// http://arduino.cc/en/pmwiki.php?n=Reference/Else
//......................................................................
//......................................................................


Y como no, la captura en 3D del bochinche: