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);
}