Programming for remote contolled sockets

You can download the English version of this page in pdf at the bottom of this page or from the download page.

Het programmeren t.b.v. remote controlled (RC) stopcontacten

Om de RC stopcontacten te schakelen is de remote nodig of een klein 433MHz zendertje dat bediend wordt door de microprocessor.

Zender (links) aangesloten aan de 5V en GND van de Arduino. De gebogen data pin is recht gebogen en verbonden met de digitale output 10 aan de andere zijde.

Ontvanger (rechts) De 5V en GND komen van een USB connector. De data en GND gaan naar een audio plug. Beiden gaan naar de computer. Het datasignaal is met een weerstandsbrug 1k-10k verzwakt.

Zender en ontvanger worden doorgaans samen verkocht voor een paar Euro.

 

Het vinden van de remote commando's

Dit kan met het programma Audacity met de bovenstaande 433 MHz ontvanger op de computer aangesloten. Het indrukken van een commando op de remote geeft dan, naast de reeds aanwezige storing, een hoorbaar en zichtbaat signaal dat men kan opnemen. Dit ziet er in mijn geval uit als dit:

In dit geval ziet het commando eruit als een patroon van 24 bits dat 6 maal gezonden wordt, gevolgd door een patroon van 32 bits dat 4 maal wordt uitgezonden.

Verder ingezoomd op het overgangspunt van 24 naar 32 bits is ook het tijdsverschil zichtbaar:

Bij het nog verder inzoomen worden per “LOW” en “HIGH” bit de sample punten zichtbaar:

De standaard sample rate van Audacity is 44100 Hz. Door de sample punten te tellen is de tijdsduur van het hoog en laag uitzenden te berekenen. 44 sample punten bijvoorbeeld, duren 44 / 44100 = 998 µ seconds;

 

Om het signaal later in het programma te kunnen simuleren definieer ik aan het begin van het programma de tijden van laag en hoog van elk bit type. De code volgorde wordt geteld en opgeslagen in twee multi arrays, één voor het 24 bits patroon en de andere voor het 32 bits patroon.

 

In het programma ziet het er als volgt uit:

 

// delay times (HIGH or LOW situations) in µ seconds:

 

#define Bit24LowUp 295             // 13 samplepoints

#define Bit24LowDown 1179     // 52 samplepoints

#define Bit24HighUp 998            // 44 samplepoints

#define Bit24HighDown 476       // 21 samplepoints

 

#define Bit32LowUp 408             // 18 samplepoints

#define Bit32LowDown 1610     // 71 samplepoints

#define Bit32HighUp 1429         // 66 samplepoints

#define Bit32HighDown 590      // 26 samplepoints

 

#define StartDelay24LowUp 400

#define StartDelay24LowDown 2250

#define StartDelay32LowUp 408

#define StartDelay32LowDown 7188

 

Met 3 stopcontacten A. B en C, elk met een “ON” en “OFF”, zien de arrays met de 6 commando's eruit als:

 

bool S24[6][24] = {{0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,1,0,1,1,0,1,1,0,0},   // A_ON

                                 {0,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,1,1,1,1,1,0,0},   // A_OFF

                                 {0,0,1,1,0,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,0,1},   // B_ON

                                 {0,0,1,1,0,1,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,1,0,1},   // B_OFF

                                 {0,0,1,1,0,1,1,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,1,0},   // C_ON

                                 {0,0,1,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,0,1,1,1,1,0}};  // C_OFF

 

bool S32[6][32] = {{1,1,1,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,0,0,1,1},   // A_ON

                                {1,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,1,0,0,1,1,0,0,0,1,0,0,1,0,0,1,1},   // A_OFF

                                {0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,0,1,0,1},   // B_ON

                                {1,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,1,1,0,0,1,0,1,0,1},   // B_OFF

                                {1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,0,1,1},   // C_ON

                                {1,1,0,1,0,0,1,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1}}; // C_OFF

 

Los van de bit patronen begint elk patroon met een lang LOW. De timing hiervan komt nauwer dan die van de bit patronen.

Gedurende het programma roep ik voor elk stopcontact en commando, dezelfde functie aan, met het betreffende commando nummer:

void switchRC(int commandNumber)

{

  int bitNumber;

  int bitPattern;

  for (bitPattern = 0; bitPattern < 6; bitPattern++) // 24 bit part 6x

  { // start with the extra long LOW part

     digitalWrite(pinRCdata, HIGH);

     delayMicroseconds(StartDelay24LowUp);

     digitalWrite (pinRCdata, LOW);

     delayMicroseconds(StartDelay24LowDown);

     for (bitNumber = 0; bitNumber < 24; bitNumber++)

     {

         if (S24[commandNumber][bitNumber] == HIGH)

         {

             digitalWrite (pinRCdata, HIGH);

             delayMicroseconds(Bit24HighUp);

             digitalWrite (pinRCdata, LOW);

             delayMicroseconds(Bit24HighDown);

         }

         else

         {

             digitalWrite (pinRCdata, HIGH);

             delayMicroseconds(Bit24LowUp);

             digitalWrite (pinRCdata, LOW);

             delayMicroseconds(Bit24LowDown);

          }

        }

     }

     for (bitPattern = 0; bitPattern < 4; bitPattern++) // 32bits part 4x

     { //start with an extra long LOW:

         digitalWrite (pinRCdata, HIGH);

         delayMicroseconds(StartDelay32LowUp);

         digitalWrite (pinRCdata, LOW);

         delayMicroseconds(StartDelay32LowDown);

         for (bitNumber = 0; bitNumber < 32; bitNumber++)

        {

            if (S32[commandNumber][bitNumber] == HIGH)

            {

                digitalWrite (pinRCdata, HIGH);

                delayMicroseconds(Bit32HighUp);

                digitalWrite (pinRCdata, LOW);

                delayMicroseconds(Bit32HighDown);

             }

             else

             {

                 digitalWrite (pinRCdata, HIGH);

                 delayMicroseconds(Bit32LowUp);

                 digitalWrite (pinRCdata, LOW);

                 delayMicroseconds(Bit32LowDown);

             }

         }

     }

}

Een door de computer op deze wijze gesimuleerd commando ziet er als volgt uit:

Voor alle drie de stopcontacten werkt dit prima.

Alternatieven:

Op het internet is ook een “RCSwitch library” voor de Arduino te vinden maar deze werkt niet voor mijn stopcontacten.

Als de schakelaartjes op de meegeleverde remote toegankelijk zijn is het misschien mogelijk het zendertje van de remote te gebruiken en de schakelaars aan te sturen met de microprocessor. Dit vergt natuurlijk wel meerdere digitale uitgangen (elk commando knopje zijn eigen uitgang) maar spaart het uitzoeken van de commando's

2025 02 02 Program Listing.pdf bevat op het moment:

_240828_Solar_Switched_Sockets.ino

Een programma dat een hard wired stopcontact "aan" zet als er voldoende zon is en er RC stopcontacten bijschakelt indien er extra veel zon is of als het boilerstopcontact "uit" staat.

Het programma dient als voorbeeld/ idee en kan eenvoudig aan persoonlijke voorkeuren en situaties aangepast worden.

 

Jeroen Droogh                bootprojecten@gmail.com

Downloads 

(English versions)

2025 01 21 Programming Remote Controlled Sockets Pdf
PDF – 1,6 MB
2025 02 02 Program Listing Pdf
PDF – 75,6 KB