miércoles, 24 de agosto de 2016

Módulos inalámbricos de radiofrecuencia a 433 Mhz






En este artículo explicaremos como utilizar los enchufes inalámbricos a 433 Mhz en Souliss.

Esta opción puede ser muy útil para quienes tengan problemas con el cableado de algunos puntos de corriente, o para quienes tengan prisa por empezar y ver resultados de su proyecto sin necesidad de meterse en obras.





Para ello necesitaremos un kit de enchufes por radio frecuencia, como por ejemplo el de la foto de inicio (pero hay muchos más). Además necesitaremos un emisor de radiofrecuencia a 433 Mhz, (ejemplo: http://www.dx.com/es/p/433mhz-rf-transmitter-receiver-link-kit-green-221225#.V2bw_zXlyj8), y un Arduino o ESP.   

La librería


También necesitaremos utilizar la librería RC-Switch.

Podremos obtener la última versión de:  https://github.com/sui77/rc-switch/releases/latest y la instalemos en el directorio “libraries” . Tambien la podemos instalar desde el menú: “Programa”, “Include Library”, “Manage Libraries…”, y en el campo “Filter your search…” introducir: RC-Switch, seguidamente hacer clic en “Install”..

En sí, esta librería está diseñada para gestionar los siguientes encoders / decoders:

  • SC5262 / SC5272
  • HX2262 / HX2272
  • PT2262 / PT2272
  • EV1527 / RT1527 / FP1527 / HS1527
  • HT6P20X


El Hardware


Estos encoders, según el Git de rc-switch vienen implementados en los siguientes equipos:

Francia

"phenix YC-4000S" outlets

Alemania

  • Conrad 646443 outlet sockets / RSL366R - Protocol:1 / BitLength:24 - (Link)
  • Pollin Funk-Steckdosen-Set 2605 - Protocol:1 / BitLength:24 - (Link)
  • Pollin Funk-Dimmer HouseLight FD-UP001 - Protocol:1 / BitLength:24 - (Link)
  • Conrad RSL88R/B - Protocol:2 / BitLength:32 - (Link)
  • Elro Home Control Funk Set - Protocol:1 / BitLength:24
  • Brennenstuhl Comfort RCS 1000N - Protocol:1 / BitLength:24 - (Available from Amazon in different countries)
  • Globaltronics GT-FSI-07 / GT-9000 - Protocol:4 or 5 / BitLength:24 - (Available as "EasyHome Funksteckdosen-Set" about once a year from Aldi Süd)
  • Goodbay "Funksteckdose NK Funk II", available at ebay or amazon, details see here.

Italia

  • Arendo - Protocol:1 / BitLength:24 - (Link)

España

  • Three plug packet from Alcampo / Auchan (15€). Addresses come hard-coded. BitLength:24, PulseLength = 184 (code example)

Suecia

  • Three plug packet + remote, FHT-7901, from Kjell & Company. Protocol:1, PulseLength = 150

Reino Unido

  • Socket + Remote starting at £5
  • Rolson 60027 (SC2262) (Link)
  • Proteam HO1853 (Link)

Paises Bajos

  • Velleman WRS3B Protocol:1 / BitLength:24
  • Eurodomest 972080 3 sockets + remote (Protocol: 1 / BitLength:24) at €9,95

Desconocido / no especifica el país

  • RM-RFDIMMER-1CH-12V - Protocol:1 / BitLength:24 - (Link)
  • Comen SD-UN2-RF
  • !MRC03
  • SilverCREST 53117
  • SilverCrest RC DS1 4001-A FR 3726 (Wireless Socket Set); Remote control RCT DS1 AAA-A 3726; Sockets RCR DS1 3711-A IP20 FR 3726; IAN 113854; Protocol: 4 or 5 [details] ; BitLength: 24; SilverCrest is a brand of the Lidl stores; sold in the Czech Republic and probably also Germany, Slovakia and Poland





El emisor de RF

wiring_transmitter.png

Conectaremos el emisor de RF, alimentando el Gnd, el positivo a + 5Vcc, y el terminal data al pin 10 de nuestro arduino. En el pin “ant” soldar un cable de 16,5 cm.


Los enchufes RF


CONFIGURACIÓN MEDIANTE MICRO-SWITCH

  • En el caso de utilizar enchufes con codificación mediante micro-switch de 10 posiciones, verificaremos que los cinco primeros coinciden en todos ellos y en el mando (código de la instalación):



Las opciones son la siguientes:

On Off Off Off Off = 1
Off On Off Off Off = 2
Off Off On Off Off = 3
Off Off Off On Off = 4

Como podéis observar en la imagen anterior, la codificación de los cinco primeros switch coinciden, siendo estos: On Off Off Off Off, o lo que es lo mismo: 1 0 0 0 0, por lo que el código escogido en la instalación de este ejemplo será; 1.

Los siguientes cinco switch identifican el canal, en el caso de la foto está seleccionado el canal “1”, On Off Off Off Off.

Las opciones son la siguientes:

On Off Off Off Off = 1
Off On Off Off Off = 2
Off Off On Off Off = 3



CONFIGURACIÓN POR SELECTORES ROTATIVOS

images/typeB.png

En el caso de disponer de un receptor con codificación mediante selectores rotativos, la configuración deberá de ser igual a la que estos tengan seleccionados.

En la imagen se observa que están seleccionados IV y 2. El 4 corresponde al código de la instalación y el 2 al canal.


El Software


Seguidamente cargaremos el siguiente Sketch, basado en una propuesta del foro en inglés, en el que hemos añadido hasta tres equipos receptores para comprender mejor su funcionamiento.

// Configure the framework
#include "bconf/StandardArduino.h"          // Use a standard Arduino
#include "conf/ethW5100.h"                  // Ethernet through Wiznet W5100
#include "conf/Gateway.h"                   // The main node is the Gateway

// Include framework code and libraries
#include <SPI.h>
#include "Souliss.h"
#include <RCSwitch.h>

// Define the network configuration according to your router settings
uint8_t ip_address[4]  = {192, 168, 1, 77};
uint8_t subnet_mask[4] = {255, 255, 255, 0};
uint8_t ip_gateway[4]  = {192, 168, 1, 1};
#define Gateway_address 77
#define Peer_address    78
#define myvNet_address  ip_address[3]       // The last byte of the IP address (77) is also the vNet address
#define myvNet_subnet   0xFF00
#define myvNet_supern   Gateway_address

#define LIGHT1_NODE1    0         
#define LIGHT2_NODE1    1   
#define LIGHT3_NODE1    2   

RCSwitch mySwitch = RCSwitch();

// Send an output command to the socket
#define RcDigOut(code1, code2, value, slot) Souliss_RcDigOut(code1, code2, value, memory_map, slot)
void Souliss_RcDigOut(U8 code1, U8 code2, U8 value, U8 *memory_map, U8 slot)
{
    // If output is active switch on the pin, else off
    if(memory_map[MaCaco_OUT_s + slot] == value)
        mySwitch.switchOn(code1,code2);
    else
       mySwitch.switchOff(code1,code2);
}

void setup()
{  
    Initialize();

    // Set network parameters
    Souliss_SetIPAddress(ip_address, subnet_mask, ip_gateway);
    SetAsGateway(myvNet_address);     // Set this node as gateway for SoulissApp

    // Set the typical logic to handle the lights
    Set_T11(LIGHT1_NODE1);
    Set_T11(LIGHT2_NODE1);
    Set_T11(LIGHT3_NODE1);

    // Define inputs, outputs pins
    pinMode(2, INPUT);                // Hardware pulldown required
    pinMode(3, INPUT);                // Hardware pulldown required
    pinMode(7, OUTPUT);               // trasmettitore 433Mhz


    // Declare the pin where the transmitter is connected
    mySwitch.enableTransmit(7);

}

void loop()
{  
    // Here we start to play
    EXECUTEFAST() {                  
       UPDATEFAST();  

       // Read every 510ms the input state and send it to the other board
       FAST_510ms() {
          // Use Pin2 as ON/OFF command
          DigIn(2, Souliss_T1n_ToggleCmd, LIGHT1_NODE1);  

          // Use Pin3 as ON/OFF command
          DigIn(3, Souliss_T1n_ToggleCmd, LIGHT2_NODE1);   
        
          // Use Pin4 as ON/OFF command
          DigIn(4, Souliss_T1n_ToggleCmd, LIGHT3_NODE1);  
        
          // Execute the logic
          Logic_T11(LIGHT1_NODE1);
          Logic_T11(LIGHT2_NODE1);
          Logic_T11(LIGHT3_NODE1);
                   
          // Send an output to the socket if there is a data change
          if(isTrigger()) {
            RcDigOut(1, 2, Souliss_T1n_Coil, LIGHT1_NODE1);   
            RcDigOut(1, 3, Souliss_T1n_Coil, LIGHT2_NODE1);
            RcDigOut(1, 4, Souliss_T1n_Coil, LIGHT3_NODE1);   
                   
           }    
       }

       // Here we handle here the communication
       FAST_GatewayComms();

}

EXECUTESLOW() {
       UPDATESLOW();

       SLOW_10s() {        // We handle the light timer with a 10 seconds base time
           Timer_T11(LIGHT1_NODE1);
           Timer_T11(LIGHT2_NODE1);    
           Timer_T11(LIGHT3_NODE1);
                   
       }

       SLOW_70s()  {   
            RcDigOut(1, 2, Souliss_T1n_Coil, LIGHT1_NODE1);   
            RcDigOut(1, 3, Souliss_T1n_Coil, LIGHT2_NODE1);   
            RcDigOut(1, 4, Souliss_T1n_Coil, LIGHT3_NODE1);   
                
       }    
    }  
}


Explicaión del código

El sketch está configurado para una codificación con código de instalación  “1”, y los canales 1, 2, y 3.

      // Send an output to the socket if there is a data change
          if(isTrigger()) {
            RcDigOut(1, 2, Souliss_T1n_Coil, LIGHT1_NODE1);   
            RcDigOut(1, 3, Souliss_T1n_Coil, LIGHT2_NODE1);
            RcDigOut(1, 4, Souliss_T1n_Coil, LIGHT3_NODE1);   

Después de las pruebas realizadas hemos verificado que hay que sumar un uno al número de canal, por ello el canal 1 se configura como 1, 2 el 2 como 1, 3, y el 3 como 1, 4.

En caso de escoger el código de instalación 2 se configuraría como 2, 2 , 2 , 3 , y 2 , 4.

En el apartado EXECUTEFAST() se verifica el estado de las entradas u órdenes de la apk, y se envían todos los estados de cada canal programado, es decir, si enviamos una orden de marcha en el canal 1, y tenemos en paro los canales 2 y 3, se emitirá la señal de marcha para el canal 1 y la de paro para los canales 2 y 3. Esta condición repetirá para cada cambio de estado de las entradas u órdenes desde la la apk.

En el apartado EXECUTESLOW() se verifica el estado de las entradas u órdenes de la apk, y se envían todos los estados de cada canal programado, es decir, aunque no estemos enviando ninguna orden de marcha o paro, cada ciclo de tiempo se emitirá la señal de marcha y paro para cada canal, según el último estado de estos. Esta función es útil debido a que no tenemos una supervisión cableada del estado de cada enchufe o receptor RF, con ello nos aseguramos de que la orden enviada se esté ejecutando.

Deberemos de tener en cuenta de que si desde el mando a distancia original enviamos alguna orden, la apk no sabría el estado, por ello se ha optado por repetir la orden Souliss cada cierto tiempo. Si encendemos desde el mando un canal, este se apagará pasado cierto tiempo dado que esta sería la última orden que constaría en el sistema.

Para optimizar el sistema se puede configurar el mando en canales diferentes a los del sketch, y a través de un receptor RF en el Arduino o ESP, tratar estas señales como entradas de canal y así generar a través del sistema Souliss la correspondiente orden de salida.

4 comentarios:

  1. :OOO Madre mia!! Un trabajo espectacular Pep!! :))
    Los tuyos son los de Alcampo u otros?

    ResponderEliminar
    Respuestas
    1. No, son los Elro, los compré en una oferta de Amazon por 10 €, pero ya no los tienen a ese precio.
      La verdad es que se trata de un sistema muy sencillo de poner en marcha por cualquier persona, sin necesidad de demasiados conocimientos.

      Eliminar
  2. Gran trabajo, yo cuando vi el hack creo que de juan pintom empece a comprar enchufes de esos :-D algunos probados y otros sin probar.
    - de bauhaus tengo 3 con un mando y pila por 9€ (sin probar, son sin microinterruptores :-( )
    - brico de pot 3 y un mando sin pila creo que 20€ probados y van bien.

    -De Carrefour pack mando un enhufe sin pila por 6€ probado y funciona. aunque.... Ojo que los han cambiado y han cambiado la electronica a smd pero no han cambiado las instruciones :-D asi que si cambias el canal o letra en el encufe la LIAS, a no ser que lo sepas y cuando tienes que poner 1111100001 en realidad es 100011111 vamos el interruptor 9 es el 1, el 8 es el 2 y asi...
    otra cosa a tener encuenta con estos enchufes de carrefouer o por lo menos me pasa a mi... es que no puedo caturar los codigos con el mando. Pero como son los mismos que los de brico de pot... pues capturo con ese mando

    ResponderEliminar
  3. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar