Domótica – Proyecto de Automatización del Hogar con Arduino + 1Sheeld

En esta oportunidad les ofrezco un proyecto en el cual he estado trabajando, y del cual esperaría recibir comentarios, ideas, mejoras, con el fin de lograr alguno de los mejores sistemas disponibles en la red.

En el presente artículo encontrará todo el detalle y las ideas que tengo en mente añadir. Actualmente tengo parte del sistema instalado en mi hogar, y ha funcionado muy bien.

Mi idea inició de la siguiente forma (Clic en la imagen para mayor detalle o resolución):

English:

This time I offer a project in which I have been working, and which expect to receive comments, ideas, improvements, in order to achieve one of the best systems available on the network.

In this article you will find all the details and ideas that I have in mind to add. Currently I have part of the system installed in my home, and it worked very well.

My idea started as follows (Click image for more detail or resolution):

diagrama 1

Figura No.1

Características del sistema según el diagrama de la figura #No.1:

  • Los interruptores son inteligentes y se comunican entre si. La idea de comunicar los interruptores, es debido que la cobertura de la señal de radio se puede extender esta manera. Por ejemplo, si tenemos un interruptor relativamente lejos de la central, digamos que en el cuarto principal, y emitimos una orden de encendido o apagado de la luz de dicha habitación, la orden, enviada desde el radio de la central Arduino sería recibida por el interruptor o los interruptores más cercanos a la central. Estos interruptores no atenderían a la orden ya que no reconocerían el serial configurado para el interruptor que deseamos activar o desactivar, pero podrían reenviar la orden, recorriendo de este modo la casa, hasta llegar a la habitación más lejana. Es bueno considerar este detalle, ya que los radios de los interruptores quedan muy empotrados en la pared, la cual limita el alcance de la señal.
  • La cubierta es de vidrio templado, y son sensibles al tacto. Tienen un buzzer incorporado en el circuito, dos leds (Led Azul: es una luz de cortesía para la noche, y led rojo: enciende cuando tocamos el vidrio para activar el circuito de encendido o apagado).
  • El interruptor puede ser programado para apagar la luz pasados X cantidad de minutos, con el fin de ahorrar energía si el usuario olvida apagar la luz.
  • El interruptor podría encender la luz automáticamente, y hacer sonar el buzzer, por ejemplo, para cubrir la función de despertador.
  • El interruptor responde a comandos de voz y Text to Speech, desde un teléfono celular, gracias al sistema 1Sheeld que he incorporado al sistema. Dicho sistema de reconocimiento de voz utiliza un API de Google muy bueno, que funciona casi con cualquier idioma, obviamente el teléfono celular deberá tener conexión a internet.
  • La central que controla los interruptores, por los momentos la he implementado con un arduino UNO + 1Sheeld. Para conectar dicha central a la nube, estoy intentando integrar un módulo Ethernet al sistema.
  • La idea de integrar el sistema a la nube es tener una pequeña página Web desde la cual podamos observar el estado del sistema por zonas, encender, apagar, ver registros de consumo de energía eléctrica, Gas y agua.

English:

System features according to the diagram in Figure # No.1:

  • The switches are intelligent and communicate with each other. The idea of ​​communicating switches is due to the coverage of the radio signal can be extended this way. For example, if we have a switch relatively far from the center, say that in the main room, and issued an order on or off the light of that room, the order sent from the radio Arduino center would be received by the switch or the closest to the central switches. These switches would attend no order because it does not recognize the serial switch configured to enable or disable we want, but may forward the order, thus crossing the house, down to the farthest room. It is good to consider this detail as the radii of the switches are very embedded in the wall, which limits the range of the signal.
  • The cover is made of tempered glass, and are sensitive to the touch. They have a built-in buzzer circuit, two LEDs (Led Blue: it is a courtesy light for the night, and red LED: on when we touch the glass to activate the circuit on or off).
  • The switch can be programmed to turn off the light past X number of minutes, in order to save power if the user forgets to turn off the light.
  • The switch could turn on the light automatically, and sound the buzzer, for example, to cover the alarm function.
  • The switch responds to voice commands and Text to Speech from a cell phone, thanks to 1Sheeld system that have joined the system. Said voice recognition system uses a Google API very good, it works with almost any language, obviously the cell phone must have internet connection.
  • The central controlling switches for the times I have implemented a arduino UNO + 1Sheeld. To connect this center to the cloud, I’m trying to integrate an Ethernet module to the system.
  • The idea of ​​integrating the system into the cloud is to have a small Web page from which you can observe the system state by area, on, off, view logs consumption of electricity, gas and water.

diagrama 2

diagrama 3

Diagráma Esquemático del Interruptor:

SCHEMATIC Switch:

diagrama 4 diagrama 5

(Puede solicitar el archivo del esquema electrónico y PCB el cual he realizado en Eagle, a mi correo electrónico: cbodington@gmail.com)

La fuente de poder del Interruptor la compré en el siguiente website:

English:

(You can request the file of electronic schematic and PCB which I have done in Eagle, to my email: cbodington@gmail.com)

The power supply Switch bought at the following website:

diagrama 6 diagrama 7

http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

nRF24L01-PA-LNA-ANT nRF24L01-5

El interruptor ensamblado y funcionando se ve de la siguiente manera:

English:

The switch assembly and running is as follows:

IMG_20160125_225327676

IMG_20160125_225149881

A continuación dejo dos videos de demostración, en los cuales se puede observar el sistema en funcionamiento. En el primer video muestro como enciende y apaga la luz tocando el vidrio con la mano, el segundo video es una demostración del comando de voz, con ruido o sonidos de ambiente comunes de fondo:

English:

Then I leave two videos demonstration, in which you can see the system in operation. In the first video I show how the light on and off by touching the glass with your hand, the second video is a demonstration of voice command, with noise or ambient sounds common background:

Los programas para cargar en el Arduino Nano y en el Arduino UNO (Central), pueden ser visualizados en la siguiente ventana (Solo para usuarios registrados en Conexión Electrónica).

English:

Programs to load into the Arduino Nano and the Arduino UNO (Central) can be displayed in the next window (for registered users only Connection Electronics).

[miembro]

/* nRF24L01 

 - CONEXIONES: Módulo nRF24L01:
 
 1 - GND
 2 - VCC 3.3V !!! NOT 5V
 3 - CE to Arduino pin 9
 4 - CSN to Arduino pin 10
 5 - SCK to Arduino pin 13
 6 - MOSI to Arduino pin 11
 7 - MISO to Arduino pin 12
 8 - UNUSED
 
/*-----( Import needed libraries )-----*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DigitalToggle.h>

/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN 9
#define CSN_PIN 10

// NOTE: the "LL" at the end of the constant is "LongLong" type
const uint64_t pipe = 0xE8E8F0F0E2LL; // Define the transmit pipe

const int buttonPin = 5;
const int ledPin = 3;
const int buzzerPin = 6;

/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio

/*-----( Declare Variables )-----*/
int estadoswitch[2]; // 2 element array holding Joystick readings
int buttonState = 0;

void setup() /****** SETUP: RUNS ONCE ******/
{
 Serial.begin(9600);
 
 pinMode(4, OUTPUT); // Pin 4 es la salida que activa el TRIAC
 pinMode(buttonPin, INPUT); // ButtonPin es la salida 5, y se usa para recibir el pulso del NE555.
 pinMode(3, OUTPUT); // Pin 3 se usa para activar el Led Rojo de Cortesia.
 pinMode(6, OUTPUT); // Pin 6 se usa para hacer sonar el Buzzer
 
 digitalWrite(buzzerPin, HIGH); //Genera un Sonido de inicio, para saber que el sistema inició.
 delay(50);
 digitalWrite(buzzerPin, LOW);
 
 digitalWrite(4, HIGH); // Apaga el Bombillo, la logica del pin 4 es inversa, HIGH = apagado, LOW = encendido.
 analogWrite(ledPin, 20); // Enciente la luz de cortesia del boton de vidrio.
 
 delay(1000);
 Serial.println("Nrf24L01 Receiver Starting"); // envia mensaje via RS232 para monitorear funcionamiento del sistema.
 radio.begin(); // Inicia el radio RF24
 radio.openReadingPipe(1,pipe); // Asigna serial identificador al Radio.
 radio.startListening();; // Activa el radio para escuchar.
}

void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
 
 if ( radio.available() )
 {
 // Read the data payload until we've received everything
 bool done = false;
 while (!done)
 {
 // Fetch the data payload
 done = radio.read( estadoswitch, sizeof(estadoswitch) );
 Serial.print("Estado del Switch = ");
 Serial.print(estadoswitch[0]);
 digitalWrite(4, estadoswitch[0]);
 delay(500); // Delay para permitir que encienda un bombillo ahorrador.
 digitalWrite(buzzerPin, HIGH); //Sonido de inicio
 delay(25);
 digitalWrite(buzzerPin, LOW);
 //Serial.print(" Y = "); 
 //Serial.println(joystick[1]);
 }
 }
 
 // read the state of the pushbutton value:
 buttonState = digitalRead(buttonPin); // Verifica si el NE555 Cambió de estado lógico.

 // check if the pushbutton is pressed.
 // if it is, the buttonState is HIGH:
 
 if (buttonState == HIGH) {
 // Invierte el estado de la salida 4:
 digitalToggle(4);
 delay(500);
 
 // Genera sonido:
 digitalWrite(buzzerPin, HIGH);
 delay(50);
 digitalWrite(buzzerPin, LOW);
 }

 //else
 //{ 
 // Serial.println("No radio available");
 // delay(10); 
 //}

}
/* YourDuinoStarter Example: nRF24L01 Transmit Joystick values
 - WHAT IT DOES: Reads Analog values on A0, A1 and transmits
 them over a nRF24L01 Radio Link to another transceiver.
 - SEE the comments after "//" on each line below
 - CONNECTIONS: nRF24L01 Modules See:
 http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
 1 - GND
 2 - VCC 3.3V !!! NOT 5V
 3 - CE to Arduino pin 9
 4 - CSN to Arduino pin 10
 5 - SCK to Arduino pin 13
 6 - MOSI to Arduino pin 11
 7 - MISO to Arduino pin 12
 8 - UNUSED
 - 
 Analog Joystick or two 10K potentiometers:
 GND to Arduino GND
 VCC to Arduino +5V
 X Pot to Arduino A0
 Y Pot to Arduino A1
 
 - V1.00 11/26/13
 Based on examples at http://www.bajdi.com/
 Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <OneSheeld.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define CE_PIN 9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1

// NOTE: the "LL" at the end of the constant is "LongLong" type
const uint64_t pipe1 = 0xE8E8F0F0E1LL; // Define the transmit pipe
const uint64_t pipe2 = 0xE8E8F0F0E2LL; // Define the transmit pipe

const char luz1on[] = "prende la luz del baño";
const char luz1off[] = "apaga la luz del baño";

const char luz2on[] = "prende la luz de la sala";
const char luz2off[] = "apaga la luz de la sala";

const char luz255on[] = "prende todas las luces";
const char luz255off[] = "apaga todas las luces";

int lamp = 6;

/*-----( Declare objects )-----*/
RF24 radio(CE_PIN, CSN_PIN); // Create a Radio
/*-----( Declare Variables )-----*/
int estado[1]; // 2 element array holding Joystick readings

void setup() /****** SETUP: RUNS ONCE ******/
{
 Serial.begin(9600);
 radio.begin();
 OneSheeld.begin();
 VoiceRecognition.setOnError(error);
 VoiceRecognition.start();
 pinMode(lamp, OUTPUT);

}//--(end setup )---


void loop() /****** LOOP: RUNS CONSTANTLY ******/
{


if(VoiceRecognition.isNewCommandReceived())
 {
 if(!strcmp(luz1on,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Encendida");
 estado[0] = 0;
 
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW);
 }
 
 if (!strcmp(luz1off,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Apagada");
 estado[0] = 1;

 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW); 
 }
 
 if(!strcmp(luz2on,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Encendida");
 estado[0] = 0;
 
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW); 
 }
 
 if (!strcmp(luz2off,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Apagada");
 estado[0] = 1;

 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW); 
 }

 if(!strcmp(luz255on,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Encendidas");
 estado[0] = 0;

 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW); 
 }
 
 if (!strcmp(luz255off,VoiceRecognition.getLastCommand()))
 {

 TextToSpeech.say("Apagadas");
 estado[0] = 1;

 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe1); 
 radio.write( estado, sizeof(estado) );
 
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 radio.openWritingPipe(pipe2); 
 radio.write( estado, sizeof(estado) );
 digitalWrite(lamp, HIGH);
 delay(500);
 digitalWrite(lamp, LOW); 
 }
 
 }

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/


void error(byte errorData)
{
 switch(errorData)
 {
 case NETWORK_TIMEOUT_ERROR:
 Terminal.println("Network timeout");
 break;
 case NETWORK_ERROR:
 Terminal.println("Network Error");
 break;
 case AUDIO_ERROR:
 Terminal.println("Audio Error");
 break;
 case SERVER_ERROR:
 Terminal.println("No Server");
 break; 
 case SPEECH_TIMEOUT_ERROR:
 Terminal.println("Speech Error");
 break;
 case NO_MATCH_ERROR:
 Terminal.println("No Match");
 break;
 case RECOGNIZER_BUSY_ERROR:
 Terminal.println("Busy");
 break;
 }
}

[/miembro]

La central Arduino + 1Sheeld se ve asi:

The Arduino + 1Sheeld center looks like this:

mobile-1-2

http://www.1sheeld.com

El circuito para medir el consumo de voltaje que he conseguido en la red es el siguiente: (clic sobre la imagen para maximizar y ver con mayor detalle)

English:

The circuit for measuring voltage consumption’ve gotten in the network is as follows: (click on the image to maximize and see more detail)

diagrama 8

Cuelquier idea o comentario siería útil y bienvenida/o.-

Any ideas or comments would be useful and welcome.-

Autor: Ing. Christian Bodington Esteva.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *