Automatizarea utilizării dispozitivelor radio ASK

Pornind de la sistemul prezentat în proiectul “Convertor ASK USB” putem dezvolta o funcționalitate foarte simplă dar utilă în cazul utilizării mai multor dispozitive radio în bandă ISM de 433MHz modulație ASK – mai ales dacă vorbim de de dispozitive de la producători diverși, incompatibile nativ între ele. Această nouă funcționalitate a sistemului ne va permite să automatizăm diverse operații simple ca de exemplu: ”la declanșarea unui senzor de prezență sau de deschidere a ușii să se aprindă lumina într-o anumită cameră„ sau ”la declanșarea unui senzor de gaz să pornească alarma sistemului antiefracție„ etc. Sistemul nostru va face legătura între componente radio ce fac parte din dispozitive complet diferite și va putea fi utilizat indiferent indiferent dacă componentele respective mai fac sau nu mai fac parte din dispozitivele inițiale (senzorii și elementele de acționare vor funcționa cu sau fără componenta bază originală).

Vom utiliza aceleași componente ca și în lecția precedentă: placă de dezvoltare Arduino Pro Micro cu un microcontroler ATmega 32U4 la 16MHz / 5V, un transmițător radio și un receptor radio – ambele în bandă de 433MHz modulație ASK. Schema de interconectare este de asemenea la fel (transmițătorul conectat la pinul 10, receptorul la pinul 3):

2

Programul, dezvoltat și testat utilizând Arduino IDE 1.8.1, extensia Arduino AVR Boards 1.6.19 și bibilioteca rc-switch 2.6.2, este puțin diferit:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  while (!Serial);

  Serial.begin(115200);

  mySwitch.enableTransmit(10);

  mySwitch.setRepeatTransmit(3);

  mySwitch.enableReceive(0); }

void loop() {

   if (mySwitch.available()) {

     int value = mySwitch.getReceivedValue();

     if (value != 0) {

      switch (mySwitch.getReceivedValue()) {

        case 6083408:

          Serial.println(“ON command received.”);

          mySwitch.setProtocol(2);

          mySwitch.send(2474994176,32);

          break;

        case 6049984:

          Serial.println(“OFF command received.”);

          mySwitch.setProtocol(2);

          mySwitch.send(2743429632,32);

          break;

        default:

          Serial.print(“Unknown command, received “);

          Serial.print( mySwitch.getReceivedValue() );

          Serial.print(” / “);

          Serial.print( mySwitch.getReceivedBitlength() );

          Serial.print(“bit “);

          Serial.print(“Protocol: “);

          Serial.println( mySwitch.getReceivedProtocol() );

          break;

      }

    }

    mySwitch.resetAvailable();

  }

}

Se poate observa că în cadrul secțiunii loop() se execută o buclă infinită care așteaptă primirea unui cod radio. În funcție de codul radio primit (instrucțiunea switch(mySwitch.getReceivedValue())) se va trimite un alt cod radio ca efect al acțiunii dorite.

3

În cazul exemplului dat s-a utilizat un senzor de deschidere a ușii și o telecomandă radio (ambele făcând parte dintr-un sistem de securitate a locuinței) ca intrări și o priză Conrad RSL ca element de acționare. Pentru mai multe informații legate de diverse dispozitive radio de securitate se poate parcurge și proiectul ”HomeWatch” din cartea ”10(zece) proiecte cu Arduino” și pentru mai multe informații legate de dispozitivele din gama Conrad RSL se pot parcurge și materialele ”Cloud’s Lights” și ”Local Area Power Plugs”.

Codul 6083408 este transmis de senzorul de deschidere a ușii și declanșează deschiderea prizei – cod radio transmis 2474994176. Putem considera că priza alimentează o veioză, o sonerie sau o cameră video de securitate.

4

5

Codul 6049984 este transmis de butonul de armare al telecomenzii radio și va declanșa transmiterea codului radio 2743429632 de închidere a prizei. Orice alt cod radio, necunoscut, va avea ca efect afișarea în consola serială a mesajului Unknown command urmat de codul numeric propriu-zis, acest lucru permite aflarea codurilor ce dorim a fi introduse în program.

6

Funcționarea sistemului nu este limitată la dispozitive radio prefabricate. Putem cu ușurință să dezvoltăm sisteme simple de supraveghere a parametrilor de mediu sau sisteme de acționare pentru diverse sarcini casnice. Un bun exemplu este prezentat în cadrul proiectului ”HomeWatch” din cartea ”10(zece) proiecte cu Arduino” – este vorba de un senzor de bucătărie ce permite avertizarea în caz de inundație sau în cazul unor scurgeri de gaze. Senzorul se bazează pe o placă de dezvoltare Arduino Pro Mini, un modul senzor de gaz metan MQ4 și un transmițător radio 433MHz ASK.

Senzorul de bucătărie poate detecta două evenimente neplăcute ce pot apărea într-o locuință în zona bucătăriei: scurgeri de gaz, senzorul va trimite codul radio 3333310 la apariția acestui eveniment, și scurgeri de apă la nivelul podelei, senzorul va trimite codul radio 3333311 la apariția acestui eveniment. Acest sistem de tip senzor poate fi utilizat cu ușurință împreună cu sistemul de automatizare prezentat putând declanșa o alarmă sonoră sau, de ce nu, un sistem de deschidere a ferestrelor. Schema și codul necesar sunt prezentate în cele ce urmează.

7

Programul a fost testat utilizând Arduino IDE 1.8.1, extensia Arduino AVR Boards 1.6.19 și bibilioteca rc-switch 2.6.2.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

volatile unsigned long alarma_apa = 0;

volatile unsigned long alarma_gaz = 0;

const unsigned long interval = 60000;

const unsigned int pin_rf = 10;

const unsigned int pin_gaz = A0;

const unsigned int pin_apa = A1;

const unsigned long cod_gaz = 3333310;

const unsigned long cod_apa = 3333311;

void setup() {

  mySwitch.enableTransmit(pin_rf);

  mySwitch.setRepeatTransmit(10);

  pinMode(pin_apa,INPUT_PULLUP); }

void loop() {

  if (analogRead(pin_gaz)>500)

  {   if (alarma_gaz == 0)

      {

         mySwitch.send(cod_gaz,24);

         delay(3000);

         alarma_gaz = millis();

      }

      else

        if ((millis() – alarma_gaz) > interval)

        {

          mySwitch.send(cod_gaz,24);

          delay(2000);

          alarma_gaz = millis();

        }

   }

   else

     if ((alarma_gaz != 0) && ((millis() – alarma_gaz) > interval) )

     {

       alarma_gaz = 0;

     }

   if (analogRead(pin_apa)<500)

   {

      if (alarma_apa == 0)

      {

         mySwitch.send(cod_apa,24);

         delay(3000);

         alarma_apa = millis();

      }

      else

        if ((millis() – alarma_apa) > interval)

        {

          mySwitch.send(cod_apa,24);

          delay(2000);

          alarma_apa = millis();

        }

   }

   else

     if ((alarma_apa != 0) && ((millis() – alarma_apa) > interval) )

     { alarma_apa = 0; }

}

Proiect Convertor ASK / USB

Multe dintre dispozitivele casnice fără fir funcționează prin comunicație radio în bandă ISM de 433MHz modulație ASK. Cele mai des întâlnite astfel de dispozitive sunt sistemele de securitate fără fir, prizele sau soclurile de bec comandate de la distanță și chiar sistemele meteo cu senzori fără fir. Toate aceste sisteme oferă dispozitive fără fir gata construite, ieftine și foarte ușor de folosit în sisteme de comandă personalizate. Dacă sistemul de comandă este bazat pe o placă de dezvoltare de tipul Arduino nu este nici un fel de problemă deoarece există module radio ASK în bandă de 433MHz cu un cost mic și ușor de folosit. Dacă sistemul de comandă are o complexitate mai mare și necesită utilizarea unui PC sau a unei plăci de tipul Raspberry Pi lucrurile se complică puțin. În cadrul acestui proiect ne propunem să realizăm un sistem ieftin și de mici dimensiuni care să realizeze legătura între comunicația radio în bandă de 433MHz modulație ASK și portul USB prezent în sistemele de calcul de uz general (PC-uri, laptop-uri, plăci de dezvoltare bazate pe microprocesoare). Astfel de dispozitive există deja dar au un preț destul de mare (a se vedea (*)).

Sistemul nostru se va baza pe o placă de dezvoltare Arduino Pro Micro cu un microcontroler ATmega 32U4 la 16MHz / 5V, un transmițător radio și un receptor radio – ambele în bandă de 433MHz modulație ASK. Componentele au fost alese astfel încât să asigure un cost total cât mai scăzut și posibilitatea de a fi integrate într-o carcasă de mici dimensiuni (aproximativ cât o baterie USB externă, imagine alăturată, astfel de carcase se găsesc de cumpărat pe Internet la prețuri de circa 2$).

2

Dispozitivul rezultat va fi văzut de sistemul de calcul în cadrul căruia va fi utilizat ca un dispozitiv serial ce va transmite către sistem codurile radio primite și va transmite radio codurile primite de la sistem – va fi realiza conversia dintre comunicația serială (over USB) și comunicația radio ASK în bandă de 433MHz.

 

Interconectarea componentelor

Interconectarea dintre placa de dezvoltare și cele două module radio este reprezentată în diagrama următoare:

3

Transmițătorul radio va avea linia de date conectată la pinul 10 al plăcii de dezvoltare iar receptorul radio va avea linia de date conectată la pinul 4 al plăcii de dezvoltare (pinul de întrerupere 0). Ambele module se vor alimenta la 5V prin intermediul pinilor VCC / GND ai plăcii de dezvoltare.

Pentru mai multe detalii despre instalarea și operarea plăcii Sparkfun Pro Micro se recomandă parcurgerea materialului ”Pro Micro & Fio V3 Hookup Guide” .

 

Programarea sistemului

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.1 cu extensia Arduino AVR Boards 1.6.19 instalată și bibilioteca rc-switch 2.6.2.

 

#include <string.h>

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  while (!Serial);

  Serial.begin(115200);

  mySwitch.enableTransmit(10);

  mySwitch.setRepeatTransmit(3);

  mySwitch.enableReceive(0);

}

void loop() {

  char inData[80];

  int index = 0;

  while(Serial.available() > 0)

  {

     char aChar = Serial.read();

     if(aChar == ‘\n’)

     {

        inData[index] = NULL;

        index = -1;

     }

     else

     {

        inData[index] = aChar;

        index++;

        inData[index] = ‘\0’;

     }

  }

  char * number;

  unsigned long number1, number2, number3;

  if (index==-1) {

    number = strtok(inData,”,”);

    number1 = atol(number);

    number = strtok(NULL,”,”);

    if(number!=NULL) { number2=atoi(number); }

    number = strtok(NULL,”,”);

    if(number!=NULL) { number3=atoi(number); mySwitch.setProtocol(number3);}

    mySwitch.send(number1,number2);

  }

  if (mySwitch.available()) {

     int value = mySwitch.getReceivedValue();

        if (value == 0) {

      Serial.print(“Unknown encoding”);

    } else {

      Serial.print( mySwitch.getReceivedValue() );

      Serial.print(“,”);

      Serial.print( mySwitch.getReceivedBitlength() );

      Serial.print(“,”);

      Serial.println( mySwitch.getReceivedProtocol() );

    }

    mySwitch.resetAvailable();

  }

}

Comunicația dintre sistemul de calcul și dispozitivul USB construit va avea mesajele de forma COD,DIMENSIUNE,VERSIUNEPROTOCOL .

De exemplu, în consola serială, apăsarea butoanelor unei telecomenzi radio ce face parte dintr-un sistem de securitate a locuinței va avea următorul efect (se observă codul butonului de dimensiune 24 biți, protocol radio versiunea 1).

4

5

Pentru mai multe informații legate de diverse dispozitive radio de securitate se poate parcurge și proiectul ”HomeWatch” din cartea ”10(zece) proiecte cu Arduino”.

În cazul în care dorim să dăm o comandă radio vom tasta în consola serială cei trei parametrii necesari transmisiei. De exemplu: 2474994176,32,2 (cod de deschidere pe 32 de biți, protocol versiunea 2, specific unei prize radio din gama Conrad RSL).

6

Pentru mai multe informații legate de dispozitivele din gama Conrad RSL se pot parcurge și materialele ”Cloud’s Lights” și ”Local Area Power Plugs”.

Bineînțeles, dispozitivul prezentat nu își găsește utilitatea majoră în comanda sau supravegherea manuală în consola serială. Utilizarea lui trebuie integrată într-o aplicație specifică platformei la care este conectat (o aplicație Windows sau un script de automatizare sub platforma Linux) și sub care pot fi predefinite codurile de comandă pentru diverse dispozitive cunoscute.

O aplicație utilă poate fi utilizarea dispozitivului în conjuncție cu o platfotmă de automatizare a locuinței, de exemplu OpenHAB. În acest scop se pot vedea și materialele ”Realizarea unui sistem de tip Home Automation” și ”Conectarea unor dispozitive antiefracție la platforma OpenHab”.

Proiect Local Area Power Plugs

Controlul centralizat al alimentării cu energie electrică a consumatorilor este o problemă în permanentă căutare de noi soluții și de noi modalități de implementare a acestora. Chiar dacă vorbim de consumatori casnici – aplicații de automatizare a locuinței – și chiar dacă există soluții deja cunoscute de implementare a controlului centralizat la acest nivel, considerăm subiectul de interes suficient de mare încât să propunem o soluție nouă elegantă și extraordinar de simplu de implementat. Bazându-ne pe elemente de alimentare comandante în bandă ISM de 433MHz și pe o placă de dezvoltare Arduino Leonardo ETH vom dezvolta o aplicație de comandă centralizată de comandă prin intermediul rețelei locale.

Având în vedere faptul că, construirea de la zero a unui element de comandă de putere (220V) este riscantă (prezintă risc de electrocutare și de incendiu) materialul vine cu propunerea de utilizare a unor elemente prefabricate / comercializate ca dispozitive de sine stătătoare, și anume prizele intermediare telecomandate Conrad RSL comercializate la noi în țară de German Electronics SRL:

1

Aceste prize sunt controlate prin intermediul unei telecomenzi radio (bandă 433MHz) de la o distanță de maxim 30m (suficient pentru un apartament obișnuit). În cadrul sistemului nostru vom înlocui telecomanda furnizată de producător cu un sistem de rețea bazat pe placa Arduino Leonardo ETH (telecomanda va putea fi folosită în paralel cu sistemul de comandă propus). Pentru a putea implementa sistemul de comandă este necesară observarea codurilor emise de telecomanda oferită de producător, acest lucru se poate face cu ajutorul unui sistem simplu compus dintr-o placă Arduino Uno (sau orice versiune de placă Arduino compatibilă) și un receptor radio 433MHz:

2

Rulând exemplul ReceiveDemo_Simple al bibliotecii software rc-switch vom putea vizualiza tipul de cod și codul emis la fiecare apăsare de buton al telecomenzii:

3

Se observă că seria Conrad RSL folosește un cod de comandă pe 32 de biți. Din cei 32 de biți trimiși la fiecare apăsare de buton: primii doi biți sunt întotdeauna 10 (secvență de sincronizare), următorii 6 codează canalul (I-IV), numărul butonului (1-4) și comanda (On, Off, All-On, All-Off) iar ultimii 24 reprezintă un identificator unic al telecomenzii – cu alte cuvinte la apăsarea diverselor butoane ale aceleiași telecomandă vor varia doar șase biți (ce notați cu roșu) – 64 de combinații posibile.

10 00 00 10 100001010110101000000000

Pentru mai multe informații legate de protocolul folosit de dispozitivele Conrad RSL puteți consulta și discuția de la adresa:

Conrad RSL Switch

https://forum.pilight.org/Thread-Fully-Supported-Conrad-RSL-Switch?page=7

Spre deosebire de alte prize telecomandate în bandă ISM, prizele Conrad RSL permit învățarea codurilor emise de telecomandă în mod dinamic. Butonul roșu de pe priză folosește la deschiderea / închiderea manuală a prizei dar, prin apăsare prelungă, și la învățarea unui nou cod de comandă. Fiecare priză poate memora până la 8 coduri de comandă diferite. Priza memorează și în lipsa alimentării cu energie (deconectată) codurile învățate și starea (dacă este deconectată în starea deschis la reconectare va avea starea deschis). În plus fiecare priză integrează protecție la supra-sarcină. La prima punere în funcțiune este necesară citirea cu atenție a documentației pusă la dispoziție de producător pentru înțelegerea exactă a modului de operare.

Comparativ, cu privire la protocolul radio de comunicație, se poate parcurge următorul material pentru a înțelege diferențele față de alte protocoale specifice unor produse similare:

Intertechno Code Berechnung

https://wiki.fhem.de/wiki/Intertechno_Code_Berechnung

După determinarea codurilor emise de telecomandă se poate trece la contruirea sistemului de comandă. Acesta se bazează pe o placă Arduino Leonardo ETH și o telecomandă radio 433MHz Arduino. Opțional, pentru a putea supraveghera sistemul, se poate adăuga un ecran LCD 20×4 I2C. Schema de interconectare este următoarea:

4

Ambele componente ale sistemului se alimentează la 5V. Emițătorul radio se va conecta la pinul digital 10 al plăcii de dezvoltare iar ecranul LCD (modulul I2C) va utiliza magistrala I2C a plăcii de dezvoltare (pinii 2 și 3).

Programul sistemului va utiliza bibiliotecile software rc-switch, LiquidTWI și Ethernet2 (biblioteca necesară noului chip Wiznet 5500 cu care este echipată placa Arduino Leonardo ETH):

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

#include <Wire.h>

#include <LiquidTWI.h>

LiquidTWI lcd(0);

#include <SPI.h>

#include <Ethernet2.h>

EthernetServer server(80);

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

String HTTP_req;

boolean plug1_status = 0;

boolean plug2_status = 0;

boolean plug3_status = 0;

În cadrul secțiunii setup() vom inițializa componentele de lucru cu ecranul LCD, cu emițătorul radio și cu controlerul ethernet (sistemul va funcționa într-o rețea locală bazată pe configurare dinamică – DHCP):

void setup() {

  mySwitch.enableTransmit(10);

  mySwitch.setProtocol(2);

  mySwitch.setRepeatTransmit(3);

  lcd.begin(20, 4);

  lcd.clear();

  lcd.setCursor(0,0);

  if (Ethernet.begin(mac) == 0) { lcd.print(F(“Failed

DHCP”)); while(1); }

  else

    { server.begin();

      lcd.print(“SrvIP: “);

      lcd.print(Ethernet.localIP());

    }

  delay(5000); }

Secțiunea loop() implementează interfața web de comandă (captură de ecran) și se va ocupa cu trimiterea comenzilor radio provenite de la utilizator pe această cale:

5

void loop() {

  EthernetClient client = server.available();

  if (client) {

    boolean currentLineIsBlank = true;

    while (client.connected()) {

      if (client.available()) {

        char c = client.read();

        HTTP_req += c;

        if (c == ‘\n’ && currentLineIsBlank) {

          client.println(F(“HTTP/1.1 200 OK”));

          client.println(F(“Content-Type: text/html”));

          client.println(F(“Connection: close”));

          client.println();

          client.println(F(“<!DOCTYPE HTML>”));

          client.println(F(“<html>”));

          client.println(F(“<head>”));

          client.println(F(“<title>Local Area PowerPlugs</title>”));

          client.println(F(“</head>”));

          client.println(F(“<body>”));

          client.println(F(“<h1>Local Area Power Plugs</h1>”));

          client.println(F(“<p>Click to switch plugs on and off.</p>”));

          client.println(F(“Power Plug 1: “));

          client.println(F(“<button

onclick=””window.location.href=’/?plug1on'””>Turn On Plug1</button>”));

          client.println(F(“<button onclick=””window.location.href=’/?plug1off'””>Turn Off Plug1</button><br>”));

          client.println(F(“Power Plug 2: “));

          client.println(F(“<button

             onclick=””window.location.href=’/?plug2on'””>Turn On Plug2</button>”));

          client.println(F(“<button onclick=””window.location.href=’/?plug2off'””>Turn Off Plug2</button><br>”));

          client.println(F(“Power Plug 3: “));

          client.println(F(“<button onclick=””window.location.href=’/?plug3on'””>Turn On Plug3</button>”));

client.println(F(“<button onclick=””window.location.href=’/?plug3off'””>Turn Off Plug3</button><br><br>”));

          client.println(F(“<b>All Power Plugs: </b>”));

          client.println(F(“<button

onclick=””window.location.href=’/?plugson'””>Turn On All Plugs</button>”));

          client.println(F(“<button onclick=””window.location.href=’/?plugsoff'””>Turn Off All Plugs</button><br>”));

          client.println(F(“</body>”));

          client.println(F(“</html>”));

          break;

        }

        if (c == ‘\n’) {

          currentLineIsBlank = true;

        }

        else if (c != ‘\r’) {

          currentLineIsBlank = false;

        }

      }

      }

    delay(1);

    client.stop();

    if (HTTP_req.indexOf(“?plug1on”) >0){

      mySwitch.send(2189781504,32);

      lcd.setCursor(0,1);

      lcd.print(“Plug1 On “);

    }

    else if (HTTP_req.indexOf(“?plug1off”) >0) {

      mySwitch.send(2323999232,32);

      lcd.setCursor(0,1);

      lcd.print(“Plug1 Off”);

    }

    else if (HTTP_req.indexOf(“?plug2on”) >0) {

      mySwitch.send(2424662528,32);

      lcd.setCursor(0,2);

      lcd.print(“Plug2 On “);

    }

    else if (HTTP_req.indexOf(“?plug2off”) >0) {

      mySwitch.send(2558880256,32); 

      lcd.setCursor(0,2);

      lcd.print(“Plug2 Off”);

    }

    else if (HTTP_req.indexOf(“?plug3on”) >0) {

       mySwitch.send(2625989120,32);

       lcd.setCursor(0,3);

       lcd.print(“Plug3 On “);

    }

    else if (HTTP_req.indexOf(“?plug3off”) >0) {

      mySwitch.send(2458216960,32);  

      lcd.setCursor(0,3);

      lcd.print(“Plug3 Off”);

    }

    else if (HTTP_req.indexOf(“?plugson”) >0) {

      mySwitch.send(2474994176,32);

      lcd.setCursor(0,1);

      lcd.print(“Plug1 On “);

      lcd.setCursor(0,2);

      lcd.print(“Plug2 On “);

      lcd.setCursor(0,3);

      lcd.print(“Plug3 On “);

    }

    else if (HTTP_req.indexOf(“?plugsoff”) >0) {

      mySwitch.send(2743429632,32);

      lcd.setCursor(0,1);

      lcd.print(“Plug1 Off”);

      lcd.setCursor(0,2);

      lcd.print(“Plug2 Off”);

      lcd.setCursor(0,3);

      lcd.print(“Plug3 Off”);

    }

    HTTP_req=””;

  }

}

Programul a fost dezvoltat și testat cu Arduino IDE 1.8.1 și bibliotecile rc-switch 2.6.2, Ethernet2 1.0.4 și LiquidTWI 1.5.1.

Ne-conectarea LCD-ului (neutilizarea acestuia) nu afectează în nici un fel funcționalitatea web a sistemului. Interfața web de comandă se va accesa din aceiași rețea locală cu sistemul de comandă utilizând un client web și accesând adresa de IP a sistemului. LCD-ul nu face altceva decât să reflecte comenzile radio transmise prin intermediul interfeței web:

6

Comunicația între sistemul de comandă și prize este unidirecțională. Sistemul nu poate determina starea unei prize ci poate doar să transmită o comandă către aceasta – LCD-ul nu afișează starea prizelor ci ultima comandă transmisă, dacă starea prizei este modificată manual (din buton) sau din telecomandă acest lucru nu se va reflecta în informația afișată.

Seria de dispozitive de automatizare a locuinței Conrad RSL este compusă din dispozitive telecomandate radio perfect compatibile între ele. În cadrul sistemului de comandă construit se pot adăuga și alte elemente telecomandate din această serie. Codurile transmise de sistemul de comandă trebuie doar înregistrate în noile dispozitive adăugate. Vă recomandăm și priza intermediară de exterior (protecție IP44, funcționare identică cu a celor din setul de prize intermediare prezentat, memorie 10 coduri de comandă, 2000W, recepție comandă până la 70m):

 

7