Fantec 2016. Proyecto Casa Domótica

MEMORIA CASA DOMÓTICA

   Durante el curso 2015-16, en la asignatura de Tecnología Industrial I, los alumnos de 1º de Bachillerato B Francisco Javier Sánchez Sánchez, Sergio Vargas Cintas y Juan Felipe González Carretero hemos realizado el diseño y construcción de una casa domótica controlada mediante Arduino por bluetooth desde un Smartphone. Este trabajo lo hemos presentado en la II Feria Andaluza de Tecnología (FANTEC 2016) celebrada en la Escuela de Ingenieros Industriales de la Universidad de Málaga el 20 de mayo de 2016.

   Lo que se planteó hacer en este proyecto era construir una casa domótica, pero ¿que es una casa domótica? Es una casa la cual consta de varias partes que pueden ser controladas automáticamente usando una placa controladora Arduino.

La casa consta de los siguientes automatismos: Luces controladas por Bluetooth y sensor de luz, Puerta automática que se abre manualmente o con Bluetooth, ascensor que puede usarse mediante el móvil.

DESARROLLO

Paso 1: Toma de medidas de todas las piezas de la casa.

Paso 2: Cortado y lijado de las diferentes piezas.

Paso 3: Construcción de la estructura de ambas plantas.

Paso 4: Pintado de la casa.

Paso 5: Diseño y formación del circuito de la casa.

Paso 6: Comprobación del correcto funcionamiento de todas las partes.

Paso 7: Decoración de la casa.

Paso 8: Diseño y formación del Project BoardDSC_0020

Problemas y soluciones

Doble pared:

Utilizamos este sistema para conseguir que los cables llegasen a todas las habitaciones de la casa sin pasar por el interior de la misma.

Bluetooth y LDR:

Teníamos el problema de que no conseguíamos hacer funcionar esta dos cosas al mismo tiempo así que al final hicimos que al usar una se desactivara automáticamente la otra

Ascensor:

Al colocar el ascensor en la casa nos dimos cuenta de que el motor no tenía suficiente potencia como para elevarlo así que lo sustituimos por uno que constaba de unos reductores para aumentar su potencia

PRESUPUESTO

Material

Unidades

Precio

-Tablón de madera (DM)

2

20€

-Botes de pintura en spray

15

30€

-Modulo de control de Bluetooth

1

11€

-L293D (inversor de movimiento)

4

23€

-Jumping clay

5

20€

-Varillas de madera

2

3€

-Césped artificial (lamina)

1

3´5€

-Total

30

110’5

Opiniones personales

Francisco Javier Sánchez: Estoy muy contento por el esfuerzo puesto en este proyecto y me alegra que haya quedado muy bien

Sergio Vargas: Ha llevado mucho tiempo de trabajo y esfuerzo pero estoy muy contento del resultado final, aunque yo debería haber trabajado más

Juan Felipe González: Estoy orgulloso del trabajo que hemos logrado terminar después varios meses trabajando duramente entre tensión y discusiones porque realizar algo así no es una tarea muy fácil y se deben tener las ideas claras

Planos (La casa consta de 2 plantas, los cables circulaban por una doble pared que había en la primera planta con bisagras que llegaban hacia la segunda planta):

20160613_134728

Plano de la primera planta a escala 1:3 de la real

20160613_134721

Plano de la segunda planta a escala 1:3 de la real

20160613_134706

Plano del circuito eléctrico usado en el proyecto

Programa de control para el arduino IDE:

-El programa de control que viene a continuación tiene las siguientes características y hace resumidamente lo siguiente:

-Control sencillo

-Fácil conexión a un dispositivo Bluetooth que hay instalado en la casa

-Modificable mediante el código mostrado a continuación

Código del programa de control (… // es la información de lo que hace en esa línea del código)

//Zona bluetooth

#define START_CMD_CHAR ‘*’ //Los #DEFINE son igual que las variables solo que no se puede cambiar el valor por lo que se llaman constantes.

#define END_CMD_CHAR ‘#’ //Y se define de tal manera que el termino #define el nombre de la constante y el valor, no lleva punto y coma al final.

#define DIV_CMD_CHAR ‘|’

#define CMD_DIGITALWRITE 10

#define CMD_ANALOGWRITE 11

#define CMD_TEXT 12

#define CMD_READ_ARDUDROID 13

#define MAX_COMMAND 20 // máximo comando numérico. usado para el error de checking.

#define MIN_COMMAND 10 // mínimo comando numérico. usado para el error de checking.

#define IN_STRING_LENGHT 40

#define MAX_ANALOGWRITE 255

#define PIN_HIGH 3

#define PIN_LOW 2

int luz = 0; //Variable para ejecutar o no el encendido de luces de manera automática o manual.(el iniciio es automático), cambia de estado cuando se enciende una luz manualmente.

int On; // Variable para funcionamiento del ascensor(hay que declararla global para que guarde el estado de encendio o apagado del ascensor.

String inText;

//Fin zona bluetooth

#include <Servo.h>

//Variables

// Ascensor

int switchPin = 5; // Entrada señal botón para activar Ascensor

int motor1Pin1 = 6; // pin en L293D una dirección motor

int motor1Pin2 = 10; // pin en L293D otra dirección motor

int enablePin = 9; // pin en L293D activación del motor

int direccion; //declaramos la variable para la dirección del ascensor

Servo myservo; // Variable para la puerta

const int buttonPin = 2;

int val;

int buttonState = 0;

// luces

int lightPin = 0; // Pin LDR.

int valor; // Variable para cálculos.

int min = 988; // Valor mínimo obtenido por A0. (SENSOR LUMÍNICO)

int max = 1018; // Valor máximo obtenido por A0.

void setup() {

//Bluetooth

Serial.begin(9600);

Serial.println(«Javier Sánchez, Sergio Vargas y Juan Felipe González»);

Serial.flush();

//Ascensor

pinMode(switchPin, INPUT); // seleccionamos el pin como entrada de datos para el botón

// Pin1 2 y activacion del motor como salida

pinMode(motor1Pin1, OUTPUT);

pinMode(motor1Pin2, OUTPUT);

pinMode(enablePin, OUTPUT);

// le decimos al pin que encienda el motor

digitalWrite(enablePin, HIGH);

{

//Puerta automática

myservo.attach(11);

pinMode(buttonPin, INPUT);

//luces

Serial.begin(9600); // Inicializa el puerto serie.

pinMode( 13, OUTPUT ); // ledPin como salida.

pinMode( 12, OUTPUT );

pinMode( 4, OUTPUT );

pinMode(8, OUTPUT );

pinMode( 7, OUTPUT );

}

}

//Función principal

void loop() {

if (luz == 0) {

int val = analogRead(3);

val = map(val, 0, 965, 0, 79);

valor = analogRead(lightPin); // Leemos el valor de A0.

Serial.print («Valor de entrada: «);

Serial.println(valor); // Valor de entrada de A0.

valor = constrain(valor, min, max); // Normalizamos el valor.

valor = map(valor, min, max, 0, 255);

analogWrite(13, valor);// Se Escribe el valor de manera automática.

analogWrite(12, valor);

analogWrite(4, valor);

analogWrite(8, valor);

analogWrite(7, valor);

Serial.print («Valor de salida: «);

Serial.println(valor); // Valor de salida del LED

delay(1000);

}

else

Serial.println(«Hay una Luz encendida, apagala para acivar modo automatico»);

bt(); //Iniciamos el bluetooth

puerta(); // Iniciamos el control de la puerta

ascensor(); //Iniciamos el ascensor.

}

//Funcion para apertura y cierre de la puerta

void puerta() {

buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {

val = 0;

}

else {

val = 90;

}

myservo.write(val);

delay(1500);

}

//Funcion para encendido de las luces de la casa

void luces(){

int val = analogRead(3);

val = map(val,0,965,0,79);

valor = analogRead(lightPin); // Leemos el valor de A0.

Serial.print («Valor de entrada: «);

Serial.println(valor); // Valor de entrada de A0.

valor = constrain(valor, min, max); // Normalizamos el valor.

valor = map(valor, min, max, 0, 255);

analogWrite(13, valor);// Se Escribe el valor de manera automática.

analogWrite(12, valor);

analogWrite(4, valor);

analogWrite(8, valor);

analogWrite(7, valor);

Serial.print («Valor de salida: «);

Serial.println(valor); // Valor de salida del LED

delay(1000);

}

//Funcion para la activacion y funcionamiento del ascensor con el boton

void ascensor() {

digitalWrite(motor1Pin1, LOW); //Le damos la orden a los motores que arranquen apagados.

digitalWrite(motor1Pin2, LOW);

if (digitalRead(switchPin) == HIGH && direccion == 1) { //Creamos condicional para cambiar estado del ascensor arriba o abajo

// y dar las ordenes de arranque y para del motor.

digitalWrite(motor1Pin2, HIGH);

delay(2500);

direccion = 0; // si se cumple la condición cambiamos el estado para que se ejecute en dirección contraria en la siguiente pulsación del ascensor

}

else if (digitalRead(switchPin) == HIGH && direccion == 0) {

digitalWrite(motor1Pin1, HIGH);

delay(2500);

direccion = 1;

}

else {

digitalWrite(motor1Pin1, LOW); // Apagamos los motores en caso de que no exista un estado del ascensor(Que no sepa en que posición esta).

digitalWrite(motor1Pin2, LOW);

}

}

void bt() {

Serial.flush();

int ard_command = 0;

int pin_num = 0;

int pin_value = 0;

char get_char = ‘ ‘; //lee el serial

if (Serial.available() < 1) return; // si el serial esta vacio, vuelve al loop().

get_char = Serial.read();

if (get_char != START_CMD_CHAR) return; // si el comando empieza a decaer, vuelve al loop().

ard_command = Serial.parseInt(); // lee el comando

pin_num = Serial.parseInt(); // lee el pin

pin_value = Serial.parseInt(); // lee el valor

if (ard_command == CMD_TEXT) {

inText = «»; //despeja la variable para una nueva entrada

while (Serial.available()) {

char c = Serial.read(); //coge un byte del serial buffer

delay(5);

if (c == END_CMD_CHAR) { // si la cadena ha sido leída

break;

}

else {

if (c != DIV_CMD_CHAR) {

inText += c;

delay(5);

}

}

}

}

if (ard_command == CMD_DIGITALWRITE) {

if (pin_value == PIN_LOW) pin_value = LOW;

else if (pin_value == PIN_HIGH) pin_value = HIGH;

else return; // error en el valor del pin. vuelve.

set_digitalwrite( pin_num, pin_value); // Desconectar esta función si se desea utilizar

return; // vuelve al principio del loop()

}

// 3) coge analogWrite DATA de ARDUDROID

if (ard_command == CMD_ANALOGWRITE) {

analogWrite( pin_num, pin_value );

return; //Hecho. Vuelve al loop();

}

// 4) Envia DATA a ARDUDROID

if (ard_command == CMD_READ_ARDUDROID) {

// char send_to_android[] = «Pon tu texto aqui» ;

// Serial.println(send_to_android); // Ejemplo: Enviando texto

Serial.print(» Analog 0 = «);

Serial.println(analogRead(A0)); // Example: Lee y manda el valor de pin a arduino

return; // Hecho. Vuelve al loop();

}

}

// 2a) Selecciona el pin deseado para DigitalWrite

void set_digitalwrite(int pin_num, int pin_value) {

switch (pin_num) {

case 6:

pinMode(13, OUTPUT); //LUZ

if (pin_value == PIN_LOW) {

pin_value = LOW;

}

else if (pin_value == PIN_HIGH) {

pin_value = HIGH;

luz =1;

} else

digitalWrite( 13, pin_value);

break;

case 2:

pinMode(12, OUTPUT); //LUZ

if (pin_value == PIN_LOW) {

pin_value = LOW;

}

else if (pin_value == PIN_HIGH) {

pin_value = HIGH;

} else

digitalWrite( 12, pin_value);

break;

case 8:

pinMode(11, OUTPUT); //BOTÓN PUERTA ABRIR CERRAR

buttonState = HIGH;

if (buttonState == HIGH) {

val = 0;

}

else {

val = 90;

}

myservo.write(val);

delay(2500);

break;

case 3:

pinMode(8, OUTPUT); //LUZ

if (pin_value == PIN_LOW) {

pin_value = LOW;

}

else if (pin_value == PIN_HIGH) {

pin_value = HIGH;

} else

digitalWrite( 8, pin_value);

break;

case 4:

pinMode(7, OUTPUT); //LUZ

if (pin_value == PIN_LOW) {

pin_value = LOW;

}

else if (pin_value == PIN_HIGH) {

pin_value = HIGH;

} else

digitalWrite( 7, pin_value);

break;

case 9:

On = 1;

digitalWrite(motor1Pin1, LOW); //Le damos la orden a los motores que arranquen apagados.

digitalWrite(motor1Pin2, LOW);

if (On == 1 && direccion == 1) { //Creamos condicional para cambiar estado del ascensor arriba o abajo

// y dar las ordenes de arranque y para del motor.

digitalWrite(motor1Pin2, HIGH);

delay(2500);

direccion = 0; // si se cumple la condicion cambiamos el estado para que se ejecutre en direccion contraria en la siguiente pulsacion del ascensor

On = 0;

}

else if (On == 1 && direccion == 0) {

digitalWrite(motor1Pin1, HIGH);

delay(2500);

direccion = 1;

On = 0;

}

else {

digitalWrite(motor1Pin1, LOW); // Apagamos los motores en caso de que no exista un estado del ascensor(Que no sepa en que posicion esta).

digitalWrite(motor1Pin2, LOW);

}

break;

case 5:

pinMode(4, OUTPUT); //LUZ

if (pin_value == PIN_LOW) {

pin_value = LOW;

}

else if (pin_value == PIN_HIGH) {

pin_value = HIGH;

}

else {

digitalWrite( 4, pin_value);

}

break;

case 7:

// pinMode(2, OUTPUT);

if (luz ==0)

luz =1;

else

luz=0;

break;

}

}

Enlace permanente a este artículo: https://ieshuelin.com/huelinwp/2016/06/fantec-2016-proyecto-casa-domotica/

1 comentario

1 ping

    • Sonia Codes Requena el 14/06/2016 a las 12:31
    • Responder

    Enhorabuena, chicos!!
    Creo que con este proyecto habéis aprendido muchas cosas importantes:
    además de conocimientos y procedimientos formales, el valor del esfuerzo, de la constancia, así como, las dificultades y bondades del trabajo en equipo.
    Qué disfrutéis de vuestro éxito, que también se mide por la satisfacción personal, y podéis estar satisfechos.

    Saludos

  1. […] ejemplo tenemos: Proyecto casa domótica IES Huelin y la web […]

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.