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