lunes, 23 de diciembre de 2013

Proyecto "SmartHouse" Fase 1

Por fin después de tanta decidía hemos empezado el proyecto Casa Inteligente, lo dividiremos en 2 fases, la primera  fase sera realizar todos los módulos  necesarios (arduino) y hacer conexión con un servidor (Raspberry pi).
La segunda fase constara de optimizar todos los comandos instalados, poder manipular la mayoría de estos mediante el celular,tablet o computadora.

Ayer logramos realizar la primera prueba, en la cual podemos manipular la intensidad del foco, en este caso un Led.


Nuestro código fue el el siguiente:
int LED = 11;
int PB = 10;
int Pot = 0;
int intensidad;
int estadoBotonIncremento;
int estadoBotonAnteriorIncremento;
const int tiempoAntirebote = 10;
boolean bandera = false;
boolean banderaPot;
boolean antirebote(int pin){
int contador = 0;
boolean estado;
boolean estadoAnterior;
do{
estado = digitalRead(pin);
if(estado != estadoAnterior){
contador = 0;
estadoAnterior = estado;
}
else{
contador = contador + 1;
}
delay(1);
}
while(contador < tiempoAntirebote);
return estado;
}
void setup(){
pinMode(LED, OUTPUT);
pinMode(PB, INPUT);
pinMode(Pot, INPUT);
Serial.begin(9600);
}
void loop(){
estadoBotonIncremento = digitalRead(PB);
if(estadoBotonIncremento != estadoBotonAnteriorIncremento){
if(!antirebote(PB)){
if(bandera==true){
digitalWrite(LED, HIGH);
bandera=false;
banderaPot=true;
}
else{
digitalWrite(LED, LOW);
bandera=true;
banderaPot=false;
}
}
}
if(banderaPot ==true){
intensidad = analogRead(Pot)/4;
analogWrite(LED,intensidad);
Serial.print("POT: ");
Serial.println(intensidad);
delay(10);
}
}
view raw intensidad.ino hosted with ❤ by GitHub





En la lógica el anti rebote nos da un poco de problemas, muy pocas veces no enciende el LED a la primera pulsación.

Para el control de temperatura se utilizo un sensor LM335, y un LED RGB. Cuando la temperatura desciende el LED enciendo de color Azul, cuando aumenta de color Rojo.




El código es muy simple, declaramos el sensor como Entrada Analógica, y los LED's igual pero como salidas. Nuestras variables milivots y temperatura serán declaradas como tipo "long" por las operaciones que realizaremos.
const int sensor = 0; // entrada del sensor analogico
const int ledRojo = 11; //LED rojo
const int ledAzul = 10; //LED azul
long miliVolts;
long temperatura;
int brillo;
void setup() {
Serial.begin(9600); //iniciamos la comunicacion serial
pinMode(ledRojo,OUTPUT);
pinMode(ledAzul,OUTPUT);
}
void loop (){
miliVolts = (analogRead(sensor)*5000L) / 1023; //calculamos los mV en la entrada
temperatura = (miliVolts / 10)-273.15; // calculamos la temperatura del sensor
brillo = map(temperatura,10, 40, 0, 255); //Ajustamos la escala de temperatura para poder usar analogRead
brillo = constrain(brillo, 0,255); //Limitar el rango de brillo de 0 a 255;
analogWrite(ledRojo, brillo);
analogWrite(ledAzul, 255 - brillo); //Ajustamos el color del LED
Serial.print ("Temperatura: "); //Enviamos la temperatura por
Serial.print (temperatura); //puerto serial
Serial.println(" grados");
delay(200); ////Esperamos para no saturar el monitor
}
view raw temp.ino hosted with ❤ by GitHub

Con map ajustaremos la escala de temperatura para poder usar analogRead y con "constrain" limitar el rango del brillo.
Por ultimo y opcional usamos el serial.print para poder visualizar los los Grados °C.