Tag Archive: Domotica


Retomando un poco el tema de la domótica hemos hecho un pequeño proyecto para probar los sensores magnéticos, instalando uno en la puerta de la habitación hacemos que al abrirla se encienda la luz y al cerrarla se apague.

Un sensor magnético consiste básicamente en un pequeño «interruptor» formado por una pequeña lámina metálica que al acercarse el imán ésta hace contacto cerrando así el circuito, son bastante económicos aunque también bastante frágiles ya que al tener ese movimiento mecánico con el tiempo suelen dañarse. En esta ocasión he usado uno que he sacado de un velocímetro de bicicleta, para comprobar si funciona hemos le ponemos una resistencia y montamos un circuito desde el gnd de arduino hasta la salida de 5v, cargamos el código de DigitalReadSerial y pinchando uno de los pines digitales vemos como al acercarse el imán marca 1 y al alejarse 0.

 

Habiendo montado ese circuito retocamos un poco el código añadiendo una condición para activar el relé cuando marque 0 la lectura. Podéis ver cómo haceros una placa relé y un código de ejemplo en el primer post: https://openmechatronics.wordpress.com/2011/09/03/control-de-luces-con-mando-ir-y-arduino/

 

Os dejo un vídeo para que veáis cómo funciona.

 

 

Cada día nuestra persiana se va haciendo más inteligente, o más bien, la voy haciendo menos tonta. Esta vez hemos incluido al sistema un elemento muy importante a la hora de hacerla más autónoma: el sensor de luz, al haberle incorporado la memoria eeprom anteriormente nos posibilita añadirle este tipo de sensores. El funcionamiento en esta primera prueba es muy simple, cuando detecta que hay una determinada luz sube la persiana para así dejar pasarla, y cuando detecta más oscuridad la cierra, partiendo de esto podríamos hacerla a nuestro gusto,  y conforme hubiera más luz, se pusiese a una determinada posición. Os dejo el video de prueba

El código es el siguiente:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com
//Proyecto domotica: control de persianas mediante el sensor de luminosidad
#include <Servo.h>
#include <Wire.h>
#include <CursoArduino.h>
#include <EEPROM.h>
const int analogInPin = A0;
int sensorPin = A0;    // pin del sensor de luz
int sensorValue = 0;
int addr = 0;
int estado = EEPROM.read(addr); //estado de la persiana (0-100) guardado en la memoria eeprom
byte valor;

void setup(){
  inicializa();
  Serial.begin(9600);
}
void subePersiana(){ //funcion para subir la persiana (100) desde abajo (0)
  if(sensorValue > 640){ //sube la persiana si hay mucha luz
  retrocedeDerecho(100);
  delay(900);
  estado = 100; //al subir el estado es igual a 100
  EEPROM.write(addr, estado); //guarda el estado en la direccion 0
}
else{
  para();
}}
void bajaPersiana(){ //funcion para bajar la persiana (0) desde arriba (100)
  if(sensorValue < 500){ //baja la persiana si hay poca luz
  avanzaDerecho(100);
  delay(850);//al bajar, el tiempo necesario disminuye
  estado = 0; //estado nuevo es igual a 0
  EEPROM.write(addr, estado);  //guarda estado en la eeprom
}
else{
para();
}}
void loop(){
  sensorValue = analogRead(analogInPin);   
  int dato = Serial.read(); //lee el numero en el serial
  if(estado == 100){ //si la persiana esta arriba
    bajaPersiana(); //bajala cuando no haya luz
  }
  else if(estado == 0) { //si la persiana esta abajo
    subePersiana(); //subela cuando no haya luz
  }
  //imprime el estado de la memoria eeprom y el valor del sensor de luminosidad
  Serial.print(addr);
  Serial.print(«\t»);
  Serial.print(EEPROM.read(addr), DEC);
  Serial.println();               
  Serial.print(«sensor = » );                       
  Serial.print(sensorValue);  
  Serial.println();
  delay(30);    
}

Como dije en el último post, el proyecto de la persiana no estaba completo, ya que debido a la complejidad podía haber numerosas versiones, si controlarla con el mando o con los pulsadores parecía complejo eso correspondería a la versión más simple, ya que este tipo de sistemas tienen que funcionar con una memoria que nos diga dónde está la persiana, o más bien, que sepa dónde está, para que cuando pulses dos veces hacia arriba lo haga tan solo una vez y no se desenrrolle, o por ejemplo para dejar la persiana a mediación (50%). Con el código anterior podríamos ponerlo a mediación pero sabiendo nosotros previamente dónde estaba. Para hacer que la persiana sea más «inteligente necesitamos un tipo de memoria llamada memoria EEPROM:

(Wikipedia:) son las siglas de Electrically-Erasable Programmable Read-Only Memory (ROM programable y borrable eléctricamente). Es un tipo de memoria ROM que puede ser programada, borrada y reprogramada eléctricamente, a diferencia de la EPROM que ha de borrarse mediante un aparato que emite rayos ultravioletas. Son memorias no volátiles.

Este tipo de memorias son usadas en infinidad de aparatos electrónicos, arduino ya viene con este microcontrolador instalado, e incluso con la librería en las últimas versiones del software, aunque no es difícil de usar, requiere conocer previamente cómo funciona, esta ha sido la primera vez que he usado este tipo de memoria en un proyecto, y la relación entre dificultad y ventajas es muy favorable.

En primer lugar vamos a dar una pequeña explicación de cómo funcionan estas memorias: Básicamente los comando a usar para esta memoria con arduino, al igual que la mayoría de las memorias, son 3: «EEPROM.write(dirección, valor)» donde indicamos la dirección (un entero de 0 a 512) e indicamos el valor (otro entero de 0 a 1023), de esta forma guardamos los datos en la memoria eeprom. Para leerlo pues simplemente tendremos que imprimir en el monitor serial, «Serial.print()«,  el dato que hay guardado en la dirección donde hayamos guardado el valor, «EEPROM.read(dirección)», por lo que quedaría así «Serial.print(EEPROM.read(address), DEC)». Por último al ser una memoria borrable, debemos que saber que para borrar le tendremos que poner que «for (int i = 0; i < 512; i++)» para la direccion de 0 a 512 el valor es 0 «EEPROM.write(i, 0);»

Tras haber visto el funcionamiento de las memorias eeprom, vamos a explicar cómo lo hemos implementado en el proyecto de la persiana, antes de poner el código debemos saber que la persiana va a tener 3 estados que va a estar imprimiendo constantemente en el monitor, y aunque se apague va a seguir guardando ese valor, éste podrá ser 0, 50 ó 100 correspondiendo el primero cuando la persiana esté abajo y el último cuando esté arriba Estos 3 estados se podrán controlar con las teclas: 2 (baja la persiana), 5 (la deja a la mitad) y 8 (la deja arriba), estas teclas corresponden con las flechas que hay en el teclado númerico de la derecha.El código resultante ha sido el siguiente:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com
//Proyecto domotica: control de persianas con memoria eeprom
#include <Servo.h>
#include <Wire.h>
#include <CursoArduino.h> //libreria del curso iniciativa focus, descargable en su pagina.
#include <EEPROM.h>
int addr = 0;
int estado = EEPROM.read(addr); //estado de la persiana (0-100) guardado en la memoria eeprom
byte valor;

void setup(){
inicializa();
Serial.begin(9600);
}
void subePersiana(){ //funcion para subir la persiana (100) desde abajo (0)
retrocedeDerecho(100);
delay(900);
estado = 100; //al subir el estado es igual a 100
EEPROM.write(addr, estado); //guarda el estado en la direccion 0
}
void bajaPersiana(){ //funcion para bajar la persiana (0) desde arriba (100)
avanzaDerecho(100);
delay(850);//al bajar, el tiempo necesario disminuye
estado = 0; //estado nuevo es igual a 0
EEPROM.write(addr, estado);  //guarda estado en la eeprom
}
void bajamitadPersiana(){  //funcion para bajar la persiana hasta la mitad (50)
avanzaDerecho(100);
delay(900/2); //la mitad del tiempo
estado = 50; //el nuevo estado es 50
EEPROM.write(addr, estado);  //guarda el nuevo estado en la eeprom
}
void subemitadPersiana(){ //funcion para subir la persiana hasta la mitad (50)
retrocedeDerecho(100);
delay(1000/2);
estado = 50; //nuevo estado es 50
EEPROM.write(addr, estado); // guarda estado en la eeprom
}
void loop(){
int dato = Serial.read(); //lee el numero en el serial
if((dato ==’2′) && (estado == 100)){ //bajar (0) desde (100)
;
bajaPersiana();
}
else if((dato==’2′) && (estado == 50)){ //bajar (0) desde (50)
;
bajamitadPersiana();
estado = 0;
EEPROM.write(addr, estado);    //guarda que esta en 0
}
else{
para();
}
if((dato ==’8′) && (estado == 0)){ //sube a 100 desde 0
;
subePersiana();
}
else if((dato==’8′) && (estado == 50)){ //sube a 100 desde 50
;
subemitadPersiana();
estado = 100;
EEPROM.write(addr, estado); //guarda que esta en 100
}
else{
para();
}
if((dato ==’5′) && (estado == 100)){ //baja a 50 desde 100
;
bajamitadPersiana();
}
else if((dato==’5′) && (estado == 0)){ //sube a 50 desde 0
;
subemitadPersiana();
}
else{
para();
}
//imprime el estado de la eeprom
Serial.print(addr);
Serial.print(«\t»);
Serial.print(EEPROM.read(addr), DEC);
Serial.println();
delay(100);

}

 

 

Como comentaba en el post anterior, colaboro en el proyecto Opendomótica, y además de hacer el control de luces através del mando a distancia, me propuse controlar otro elemento muy característico de la domótica: las persianas eléctricas.

Este nuevo proyecto en principio se complicaba un poco más que el de las luces, y cuando comencé a hacerlo me di cuenta que se complicaba mucho, mucho más que el de las luces. Para empezar hay que controlar motores, con la dificultad que ello conlleva (la velocidad, la fuerza…) además al no disponer de una persiana real eléctrica tuve que construir mi propia persiana, como no, a escala, así que me puse manos a la obra y en un ratillo con lo que tenía a la mano hice una maqueta de persiana, le puse un servomotor trucado, y la hoja de la persiana era una hoja de papel. Una vez hecha la persiana, y puesto el motor me dispuse con el código en arduino, el arduino que usé fue el que hicieron para el curso Iniciativa Focus, que incluía un controlador de motores, así que esa parte del hardware la tenía solucionada. El primer paso fue controlar la persiana mediante dos pulsadores (uno para bajar y otro para subir) así ver cuanto tarda en hacer el recorrido, y controlar la persiana de forma manual/analógica.

Si compilais el programa os dará error al no incluir previamente la libreria CursoArduino.h, como no me permite subir un zip por lo que os dejo el archivo .doc para que creeis una nueva libreria y pegueis ese código que hicieron nuestros compañeros de Iniciativa Focus:

libreria cursoarduino

En este video vereis la primera versión, controlado de forma manual mediante pulsadores:

Una vez controlada de forma manual los dos movimientos la subida y la bajada, me puse manos a la obra para controlarlo con el mando a distancia,, usé parte del sistema de las luces (el receptor infrarrojo, la librería IRremote y el mando) y cambiando en el código anterior la condicional del pulsador del botón por el código del mando IR. Y listo ya tenía la persiana controlada con el mando.

Esta sería la primera parte del controlador de persianas, la cosa se complica cuando no queremos la persiana ni completamente subida, ni completamente bajada, sino que la queremos enmedio, para ello debemos saber dónde está. y para hacer eso tenemos que usar la memoria EEPROM de arduino, eso lo pondremos en otro post aparte.

Código persiana con mando IR:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com  //Proyecto domotica: control de persianas con mando ir  #include <Servo.h>
#include <Wire.h>
#include <CursoArduino.h> //libreria del curso iniciativa focus, la podreis encontrar en su web
#include <IRremote.h>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Comienza a recibir
 pinMode(13,OUTPUT);
 inicializa();
}

void loop() {
 if (irrecv.decode(&results)) { 
 int lectura = results.value;

 Serial.println(lectura, HEX);
 //recibe el código que te manda el mando, y envialo al monitor serial

 if(lectura == 0x708F){ //cuando leamos el código recibido en el serial lo copiamos ahí
 avanzaDerecho(170); //mueve el motor a la velocidad (170) 
 delay(650); 
 }
 else{
 para();
 }

 if(lectura == 0x609F){ //cuando leamos el código recibido en el serial lo copiamos ahí
 retrocedeDerecho(150); //mueve el motor en sentido contrario a la velocidad (170) 

 delay(80); 
 }
 else{
 para();
 }
 irrecv.resume(); // Recibe el siguiente valor
 }
 }

Tras comenzar a hacer proyectos con arduino, empezar a programar en python (libro: «Python para todos») y aprender  C  haciendo algún que otro proyecto con arduino, Juan Antonio me comentó que iba a retomar el proyecto de Opendomótica, y que si quería colaborar con él, para aprender y aportar lo poco que pudiese saber de este mundo aún nuevo para mí,con mucho gusto y entusiasmo acepté, y comenzamos a ver cómo iba a plantear este gran proyecto, desde ese día colaboro con él, al igual que José Moreno (hardware).

Ya que mis conocimientos son escasos en este campo, en comparación con Juan Antonio, voy haciendo partes del proyecto en paralelo, como por ejemplo el control de persianas a través del mando IR, o el control de luces…

Gracias al proyecto Opendomótica he tenido acceso a un mundo en el que todavía queda mucho por recorrer, y que se va introduciendo cada vez más en nuestras vidas.

Aquí os dejo un sencillo código para arduino que para mí fue el primer contacto con la domótica, con este código y teniendo como hardware una placa relé (la podeis hacer facilmente gracias a este tutorial http://txapuzas.blogspot.com/2010/07/rele-controlado-por-transistor.html así hice yo, o también podreis comprarla si no manejais  muy bien la elaboración del hardware), un arduino y la librería IRremote facil de encontrar por internet (como en este sitio: http://www.pjrc.com/teensy/td_libs_IRremote.html ) ya podreis controlar cualquier elemento de vuestra casa, como lámparas, ventilador, estufa (teniendo cuidado de no sobrepasar los watios que pueda aguantar el relé, para no quemarlo), persianas electricas (aunque para eso ya haré un post más detallado) etc.

Código:

// Miguel Angel Torres de la Camara, matc2068@gmail.com, openmechatronics.wordpress.com 
//Proyecto domotica: control de luces con mando ir
#include <IRremote.h>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Comienza a recibir
 pinMode(13,OUTPUT);
}

void loop() {
 if (irrecv.decode(&results)) {
 int lectura = results.value;

 Serial.println(lectura, HEX);

 //lee el código que llega a través del receptor IR y lo imprime en el serial.
 if(lectura == 0x40BFA05F){ //este es el código que debeis copiar del serial.
 digitalWrite(13,HIGH); 
 }
 //si el código es X activa el relé
 if(lectura == 0x40BF00FF){
 digitalWrite(13,LOW); 
 }
 //si el código es Y apaga el relé
 irrecv.resume(); // Recibe el siguiente valor
 }
}

Para adaptarlo a vuestro mando lo único que tendreis que hacer es cambiar el código (0x40BF…) por el que salga en el serial al pulsar el boton.

Espero que os sirva de ayuda!