{Radio Fréquence} – Contrôler les garages, les portails, et tout ce qui fonctionne en 433Mhz

 

Salut la compagnie,

 

 

Aujourd'hui, j'ai envie de vous partager un petit projet "bricolage", car ça fait un petit bout de temps que je n'en ai pas fait.
L'idée m'est venue car je souhaitais surprendre mon beau-père qui nous ouvre son portail électrique chaque fois que nous venons le voir.
Petite blague, histoire de voir sa réaction face à un portail qui s'ouvrirait et se fermerait tout seul.

Je me suis donc lancé dans un bricolage assez simpliste pour un bricoleur, mais qui vous demandera si vous n'êtes pas habitué, un peu d'organisation.

 

Rolling Code et pas rolling code

Lorsque vous utilisez la commande de votre garage, de votre portail, de votre voiture, ou encore de votre alarme un code est envoyé.

La plupart du temps, ce code est toujours le même pour chacun des boutons de votre télécommande (sauf pour les voitures) .
Cependant pour les voitures (et très probablement pour d'autres choses), il existe ce qu'on appelle un "rolling code" :
La télécommande d'ouverture de la voiture est synchronisée avec celle-ci une première fois.
Ainsi celle-ci va "apprendre" un certain nombre de codes.
100.000 codes par exemple, un chiffrement est alors mis en place sur ces codes, pour éviter que des petits malins n'essaient de brute-forcer : 1, 2, 3, .... 100, 101, 102, ... 1000, ....503935, 56789, ...
Lorsqu'un code est utilisé, il ne peut être réutilisé...

Donc dans le cas d'un "rolling code", ce sniffer est inefficace s'il est utilisé seul.
Généralement, les "voleurs" utilisent 2 boîtiers :
Un du même genre que celui que je vais vous présenter, et un "brouilleur".
Le brouilleur, va empêcher la voiture de recevoir un premier code qui sera intercepté par le premier boitier.
Pour sauver les apparences, le brouilleur se désactive dès que ce code est reçu.

 

 

Le matériel :

Alors, je tiens à dire que je ne suis pas sponsorisé, et que je vous fournis des liens à titre purement indicatif, pour que vous puissiez voir à quoi ressemblent les composants à acheter.

 

Le schéma de branchement

Ayez pitié de moi j'ai fait ça avec un logiciel de dessin, car je n'ai pas trouvé de plateforme qui recensait tous les composants dont j'avais besoin.
Ce n'est pas faute d'avoir essayé sur les plateformes :

  • https://www.tinkercad.com
  • https://www.circuito.io/
  • ... 

Voici donc le résultat :

 

 

Le bout de code

Il y aura 2 librairies à installer dans votre IDE Arduino :

  • Adafruit_SSD1306
  • RCSwitch

Je vous invite à jeter un oeil sur le net pour savoir comment les récupérer et les installer (ce n'est vraiment pas sorcier)

#include <Adafruit_SSD1306.h>
#include <RCSwitch.h>
#define OLED_Address 0x3C
static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);
Adafruit_SSD1306 oled(1);

RCSwitch receiver = RCSwitch();
RCSwitch sender = RCSwitch();
char **tabRecords = malloc(sizeof(char*) * 30);
char * datas = "";
int Led = 12;
int nbRecords = 0;
int choicePin = 1;
int choice = 0;


void setup() {
Serial.begin(9600);
oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
receiver.enableReceive(0);
sender.enableTransmit(7);
pinMode(Led, OUTPUT);
oled.clearDisplay();
oled.setTextSize(0);
}


/*
*
* Verifie que le code n'a pas deje ete enregistre
*
*/

bool isInTab(char *rec){
for (int i = 0; i < nbRecords; i++){
if (strcmp(tabRecords[i], rec) == 0){
return true;
}
}
return false;
}

/*
*
*
* Converti une chaine de caractere binaire en
* une valeur décimale
*
*/

unsigned long bin2dec(const char *bin)
{
unsigned long result=0;
for(;*bin;bin++)
{
if((*bin!='0')&&(*bin!='1'))
return -1;
result=result*2+(*bin-'0');
if(result<=0) return -1;
}
return result;
}


/*
*
* Code principale
*
*/
void loop() {

/*
Recuperation de la valeur du potentiometre
Vu que j'ai des valeurs allant de 0 a 900 ...
J'applique une petite formule pour n'avoir que des valeurs entre 0 et 30
(ce qui implique que nous n'ayons que 30 enregistrements possibles de code)
*/
choice = (int)(ceil(analogRead(choicePin)*0.1 / 3));

choice = choice >= nbRecords ? nbRecords-1 : choice;
oled.clearDisplay();

/*
*
* J'affiche ici le code selectionne (s'il y en a un), et le nombre d'enregistrements
* interceptes
*/
oled.setTextColor(WHITE);
oled.writeFillRect(0,10,128,5,BLACK);
oled.setCursor(0,2);
oled.println( choice < nbRecords ? "Code : " + String(bin2dec(tabRecords[choice])) : "Aucun code disponible");
oled.setCursor(0,20);
oled.print("Dyrk.org");
oled.setCursor(90,20);
oled.print(nbRecords > 0 ? choice+1 : 0);
oled.print(" / ");
oled.print(String(nbRecords));


if (receiver.available() && ! isInTab(dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()))) {
Serial.println(receiver.getReceivedValue());
digitalWrite(Led, HIGH);
tabRecords[nbRecords] = malloc(sizeof(char)*30);
strcpy (tabRecords[nbRecords],dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()));
++nbRecords;
receiver.resetAvailable();
}

//Un signal est envoye en permanence, mais n'est reellement envoye que lorsque le bouton fait contact
if (choice < nbRecords){
sender.send(tabRecords[choice]);
}

oled.display();
}

 

 

Fonctionnement

Le fonctionnement est assez rudimentaire :
Chaque code reçu est automatiquement enregistré.
L'appareil peut enregistrer 30 codes uniques !
Ensuite, avec le potentiomètre, vous pouvez sélectionner le code que vous souhaitez envoyer.
Lorsque vous avez sélectionné un code, il vous suffit d'appuyer sur le bouton pour que celui-ci soit envoyé !

La vidéo

Bien que minimaliste, cette vidéo vous montrera l'assemblage final, que j'ai mis dans un boitier plastique. C'est assez rustique (je ne suis vraiment pas doué pour les finitions esthétiques).
Mais ça fait le job !

Bon visionnage, et pensez à vous abonner !

 

 

Conclusion

Il s'agit là d'un bricolage ludique à faire chez soi pour s'amuser, ou pour faire une blague à des amis / famille.
Je ne souhaite en aucun cas que vous ne l'utilisiez avec de mauvaises intentions, il s'agit réellement d'un outil qui pourrait s'avérer dangereux.
Je vous invite pour tous vos équipements à vous renseigner un peu plus sur la sécurité des codes émis par radio-fréquence. À l'heure actuelle, le mieux reste ce qui est fait dans le domaine de l'automobile avec le "rolling code" ... je ne dis pas que c'est "LA SOLUTION", mais que c'est ce qui est fait de mieux ...

 

 

 

{Edit}

 

Suite à plusieurs demandes de personnes m'ont dit avoir eu des difficultés à compiler, je vous joins
des infos complémentaires.

 

 

Liens :
https://github.com/sui77/rc-switch
https://github.com/adafruit/Adafruit_SSD1306

37 comments

  • bonjour,

    pour le dessin, tout y est dans http://fritzing.org/download/

     

    • Merci pour l’info ;)

      • Bonsoir,

        quelqu’un a t’il la solution car quand je  compile cela me mais l’erreure

        le défaut pour la compilation est   spray’/342’in program

        je remercie a l’avance celui ou celle qui a une compilation qui fonctionne me donner la compile.

  • JePrefereResterAnnonyme

    Salut, par tout hasard on ne peux pas utiliser la clé TV de l’IMSI Catcher pour récupérer le binaire ?

    • Normalement si ;)
      Une antenne TNT couvre un bon nombre de fréquence donc ça doit pouvoir le faire.
      Cela dit, je n’ai pas essayé de coupler un Arduino à une antenne TNT, donc je n’irais pas m’avancer jusqu’à dire que si tu
      souhaites passer par un Arduino c’est faisable.

  • Salut à tous !

    Les antennes TNT sont calibré sur les fréquence de la TNT soit 471 Mhz et 694 Mhz.

    Je pense qu’il est préférable de faire avec un bout de fils d’environ 15cm.

    ou bien acheter une antenne fouet 433 Mhz mais pour la bricole je pense le bout de fils fera le taff avec la puissance d’émission des télécommande on vas taper à 20-30m champ libre sans problème.

    pour info le 433Mhz (en automatisme) et voué à disparaitre qui est remplacé par que 868Mhz (en automatisme) qui sera voué à disparaitre…..

    Super petit montage en tous cas toujours agréable de te lire

    Arduino +1 !!!!

    :)

    Bonne journée à vous

  • Merci pour ce tuto :)

    Avec un hackrf One, on peut très facilement ouvrir une voiture qui fonctionne avec une clé en 433 Mhz ..

  • Impossible de compiler le code sans erreurs…

    apparement il faut aussi installer Adafruit, mais malgré cela ca passe pas :(

    peux tu donner les versions que tu utilise ?

  • Bonjour,

    J’ai trouvé votre site internet vraiment par hasard.

    Il est de très grande qualité, je vous remercie.

    Je suis retraité depuis quelques mois , je m’intéresse à Arduino (j’essaie de comprendre …)

    J’ai un portail électrique, je vais donc tenter de faire votre test !

    Pouvez-vous svp me donner la valeur du potentiomètre.

    Je vais commander ensuite le marériel.

    Je vous remercie pour tout ce travail!

    • Bonjour,

      J’ai trouvé votre site.

      Il est de très grande qualité, je vous remercie.

      Je suis retraité depuis quelques mois , je m’intéresse à Arduino (j’essaie de comprendre …)

      J’ai un portail électrique, je vais donc tenter de faire votre test !

      Pouvez-vous svp me donner le programme car celui sur le site ne fonctionne pas et la valeur du potentiomètre.

      Je vais commander ensuite le marériel.

      Je vous remercie a l’avance Mr Bar

  • Bonjour,

    ayant les composants sous la main je voulais essayer mais je n’arrive pas à compiler votre code. Serait-il possible de l’avoir par mail directement ?

     

    En vous remerciant.

    • Coucou Flv,

      Désolé je n’ai pas vraiment compris ta demande ?
      Le code est déjà là.
      L’envoyer par mail signifierait simplement vous renvoyer ce que tu as déjà.

      Bonne journée et bon Weekend ;)

      Dyrk

      • Bonsoir,

        arf, j’ai pourtant quelques erreurs à la compilation et j’avoue ne pas m’y connaître assez dans le domaine pour y remédier, je ne fais que des choses simplistes avec mon Arduino Mega.

         

        Voici ce que j’ai :

        [pastacode lang="cpp" manual="C%3A%5CUsers%5C10%5CDocuments%5CArduino%5C433_grab%5C433_grab.ino%3A14%3A27%3A%20warning%3A%20invalid%20conversion%20from%20'void*'%20to%20'char**'%20%5B-fpermissive%5D%0A%0A%20char%20**tabRecords%20%3D%20malloc(sizeof(char*)%20*%2030)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%0A%0AC%3A%5CUsers%5C10%5CDocuments%5CArduino%5C433_grab%5C433_grab.ino%3A15%3A25%3A%20warning%3A%20ISO%20C%2B%2B%20forbids%20converting%20a%20string%20constant%20to%20'char*'%20%5B-Wwrite-strings%5D%0A%0A%20char%20*%20datas%20%20%20%20%20%20%20%20%20%20%3D%20%22%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%0A%0AC%3A%5CUsers%5C10%5CDocuments%5CArduino%5C433_grab%5C433_grab.ino%3A%20In%20function%20'void%20loop()'%3A%0A%0AC%3A%5CUsers%5C10%5CDocuments%5CArduino%5C433_grab%5C433_grab.ino%3A84%3A38%3A%20warning%3A%20invalid%20conversion%20from%20'void*'%20to%20'char*'%20%5B-fpermissive%5D%0A%0A%20%20%20%20%20%20%20tabRecords%5BnbRecords%5D%20%3D%20%20malloc(sizeof(char)*30)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5E%0A%0AC%3A%5CUsers%5C10%5CAppData%5CLocal%5CTemp%5CccpH8Xak.ltrans1.ltrans.o%3A%20In%20function%20%60main'%3A%0A%0A%3Cartificial%3E%3A(.text.startup%2B0x752)%3A%20undefined%20reference%20to%20%60dec2binWzerofill(unsigned%20long%2C%20unsigned%20int)'%0A%0A%3Cartificial%3E%3A(.text.startup%2B0x7f2)%3A%20undefined%20reference%20to%20%60dec2binWzerofill(unsigned%20long%2C%20unsigned%20int)'%0A%0Acollect2.exe%3A%20error%3A%20ld%20returned%201%20exit%20status%0A%0Aexit%20status%201%0AErreur%20de%20compilation%20pour%20la%20carte%20Arduino%2FGenuino%20Mega%20or%20Mega%202560%0A" message="" highlight="" provider="manual"/]

         

        Si possible de m’aider avec cela je suis preneur, autrement j’essayerais de me documenter et de creuser d’avantage.

         

        En vous remerciant.

      • Bonjour,

        J’ai beau essayer de retourner le code dans tous les sens impossible de trouver des solutions au  :

         

        warning: invalid conversion from ‘void*’ to ‘char**’ [-fpermissive]

        char **tabRecords = malloc(sizeof(char*) * 30);

        warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

        char * datas = «  »;

        warning: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]

        tabRecords[nbRecords] = malloc(sizeof(char)*30);

         

        • bonjour est ce que quelqun a réussi a compiler sens cette erreur

           

          warning: invalid conversion from ‘void*’ to ‘char**’ [-fpermissive]

          char **tabRecords = malloc(sizeof(char*) * 30);

          ~~~~~~^~~~~~~~~~~~~~~~~~~~

          warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

          char * datas = «  »;

          ^~

          ‘char* dec2binWzerofill(long unsigned int, unsigned int)’ used but never defined

          static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);

          ^~~~~~~~~~~~~~~~

          je suis a fond dans ce projet mais je bloc j’ai besoin d’aide. Mérci

  • hello someone could request this problem?

    • merci au auteurs originaux !!!! j’ai un peu bricolé mais ça marche

      voici un code qui fonctionne avec arduino uno et ecran lcd 20X4 (mettre l’adresse de votre lcd)

      IDE arduino 1.8.12 sous mageia 7

      copiez le code:

      =================================================================

      #include <Wire.h>
      #include <LiquidCrystal_I2C.h>

      #include <RCSwitch.h>

      static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);
      LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display

      RCSwitch receiver = RCSwitch();
      RCSwitch sender = RCSwitch();
      char **tabRecords = malloc(sizeof(char*) * 30);
      char * datas = «  »;
      int Led = 12;
      int nbRecords = 0;
      int choicePin = 1;
      int choice = 0;

      void setup() {
      Serial.begin(9600);
      lcd.init(); // initialize the lcd
      receiver.enableReceive(0);
      sender.enableTransmit(7);
      pinMode(Led, OUTPUT);
      lcd.backlight();
      lcd.setCursor(3,0);
      lcd.print(« salut le monde! »);
      lcd.setCursor(2,1);
      lcd.print(« SNIFFER 433.92 MHz! »);
      lcd.setCursor(0,2);
      lcd.print(« Arduino LCM IIC 2004 »);
      lcd.setCursor(2,3);
      lcd.print(« travail de Thierry! »);
      delay(2000);
      }

      /*
      *
      * Verifie que le code n’a pas deje ete enregistre
      *
      */

      bool isInTab(char *rec){
      for (int i = 0; i < nbRecords; i++){
      if (strcmp(tabRecords[i], rec) == 0){
      return true;
      }
      }
      return false;
      }

      /*
      *
      *
      * Converti une chaine de caractere binaire en
      * une valeur décimale
      *
      */

      unsigned long bin2dec(const char *bin)
      {
      unsigned long result=0;
      for(;*bin;bin++)
      {
      if((*bin!=’0′)&&(*bin!=’1′))
      return -1;
      result=result*2+(*bin-‘0’);
      if(result<=0) return -1;
      }
      return result;
      }
      static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength) {
      static char bin[64];
      unsigned int i=0;

      while (Dec > 0) {
      bin[32+i++] = ((Dec & 1) > 0) ? ‘1’ : ‘0’;
      Dec = Dec >> 1;
      }

      for (unsigned int j = 0; j< bitLength; j++) {
      if (j >= bitLength – i) {
      bin[j] = bin[ 31 + i – (j – (bitLength – i)) ];
      } else {
      bin[j] = ‘0’;
      }
      }
      bin[bitLength] = ‘\0’;

      return bin;
      }

      /*
      *
      * Code principale
      *
      */
      void loop() {
      lcd.clear();
      /*
      Recuperation de la valeur du potentiometre
      Vu que j’ai des valeurs allant de 0 a 900 …
      J’applique une petite formule pour n’avoir que des valeurs entre 0 et 30
      (ce qui implique que nous n’ayons que 30 enregistrements possibles de code)
      */
      choice = (int)(ceil(analogRead(choicePin)*0.1 / 3));

      choice = choice >= nbRecords ? nbRecords-1 : choice;

      /*
      *
      * J’affiche ici le code selectionne (s’il y en a un), et le nombre d’enregistrements
      * interceptes
      */

      lcd.setCursor(0,0);
      lcd.print( choice < nbRecords ? « Code: » + String(bin2dec(tabRecords[choice])) : « Aucun code disponible »);
      lcd.setCursor(0,1);
      lcd.print(receiver.getReceivedValue());
      lcd.setCursor(0,2);
      lcd.print(« Dyrk.org »);
      lcd.setCursor(0,3);
      lcd.print(nbRecords > 0 ? choice+1 : 0);
      lcd.print( » / « );
      lcd.print(String(nbRecords));

      if (receiver.available() && ! isInTab(dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()))) {
      Serial.println(receiver.getReceivedValue());
      digitalWrite(Led, HIGH);
      tabRecords[nbRecords] = malloc(sizeof(char)*30);
      strcpy (tabRecords[nbRecords],dec2binWzerofill(receiver.getReceivedValue(), receiver.getReceivedBitlength()));
      ++nbRecords;
      receiver.resetAvailable();
      }

      //Un signal est envoye en permanence, mais n’est reellement envoye que lorsque le bouton fait contact
      if (choice < nbRecords){
      sender.send(tabRecords[choice]);
      }
      delay(100);

      }

  • Hello, article très intéressant.
    Dés que je reçois le matériel, je vais tester cela :)
    Mon objectif n’est pas de lire les codes des garages mais de créer un convertisseur Bluetooth – 433.92MhZ afin de pouvoir ouvrir la porte de garage avec mon smartphone :D

    Penses-tu que cela soit réalisable ?

    La télécommande à décoder est une Doitrand ‘ts2de’.

    Cordialement

     

  • La fonction dec2binWzerofill declarée au début du code n’est jamais définie. Par conséquent quand isInTab y fait appel, le compilateur crash parce-que cette fonction n’existe pas.

    Il manque  une partie du code en fait.

    • My mistake, dec2binWzerofill est une fonction de RCSwitch.h

    • Bon ben je re-confirme.

      Il manque un bout de code.

      Il faut rajouter à la fin du code la définition de dec2binWzerofill:

      static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength) {
      static char bin[64];
      unsigned int i=0;

      while (Dec > 0) {
      bin[32+i++] = ((Dec & 1) > 0) ? ‘1’ : ‘0’;
      Dec = Dec >> 1;
      }

      for (unsigned int j = 0; j< bitLength; j++) {
      if (j >= bitLength – i) {
      bin[j] = bin[ 31 + i – (j – (bitLength – i)) ];
      } else {
      bin[j] = ‘0’;
      }
      }
      bin[bitLength] = ‘\0’;

      return bin;
      }

  • c’est bien jolie mais sa fonctionne pas ton code?? une mise a jours serais super.

    • Bonsoir quelqu’un a t-il trouvé la solution pour que ce code compile,même pour le deuxième.

      le premier ne compile pas tout court sans défaut .

      le deuxième ne compile pas car erreur pour cette ligne

      bin [ j ] = bin [ 31 + i – ( j – ( bitLength – i ) ) ] ;

      et le défaut pour la compilation est          stray’/342’in program

      merci de votre aide.

  • Bonsoir,

    Je suis dans le même ca que Nico :

    le premier ne compile pas tout court sans défaut .

    le deuxième ne compile pas car erreur pour cette ligne

    bin [ j ] = bin [ 31 + i – ( j – ( bitLength – i ) ) ] ;

    et le défaut pour la compilation est          stray’/342’in program

    Etant au stade de découverte sur Arduino, je ne suis pas en mesure de corriger ce type de code.

    (Actuellement sur Arduino UNO)

    Si quelqu’un aurait une solution et pouvait nous aider. 🙌

    En vous en remercient d’avance.

    Bonne soirée,

    Cordialement

     

  • Salut ! Comment brancher un émetteur récepteur NRF905 à la place des deux autres ?

    faudra t’il changer quelque chose dans le code ?

    merci !

  • Bonjour. voila un code qui se compile sans souci avec arduino 1.8.13.

    #include <LiquidCrystal_I2C.h>
    #include <RCSwitch.h>
    #include <Wire.h>

    RCSwitch mySwitch = RCSwitch();
    LiquidCrystal_I2C lcd(0x27, 20, 4);

    void setup() {
    Serial.begin(9600);
    mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
    lcd.begin ();
    }

    void loop() {
    lcd.backlight();
    if (mySwitch.available()) {
    output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol());

    lcd.setCursor(0,0);
    lcd.print(« value: « );
    lcd.setCursor(7,0);
    lcd.print(mySwitch.getReceivedValue());

    lcd.setCursor(0,1);
    lcd.print(« delai: « );
    lcd.setCursor(7,1);
    lcd.print(mySwitch.getReceivedDelay());

    lcd.setCursor(0,2);
    lcd.print(« longu: »);
    lcd.setCursor(7,2);
    lcd.print(mySwitch.getReceivedBitlength());

    lcd.setCursor(0,3);
    lcd.print(« Proto: « );
    lcd.setCursor(7,3);
    lcd.print(mySwitch.getReceivedProtocol());
    mySwitch.resetAvailable();
    }
    }

    static const char* bin2tristate(const char* bin);
    static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);

    void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw, unsigned int protocol) {

    if (decimal == 0) {
    Serial.print(« Unknown encoding. »);
    } else {
    const char* b = dec2binWzerofill(decimal, length);
    Serial.print(« Decimal: « );
    Serial.print(decimal);
    Serial.print( » (« );
    Serial.print( length );
    Serial.print(« Bit) Binary: « );
    Serial.print( b );
    Serial.print( » Tri-State: « );
    Serial.print( bin2tristate( b) );
    Serial.print( » PulseLength: « );
    Serial.print(delay);
    Serial.print( » microseconds »);
    Serial.print( » Protocol: « );
    Serial.println(protocol);
    }

    Serial.print(« Raw data: « );
    for (unsigned int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(« , »);
    }
    Serial.println();
    Serial.println();
    }

    static const char* bin2tristate(const char* bin) {
    static char returnValue[50];
    int pos = 0;
    int pos2 = 0;
    while (bin[pos]!=’\0′ && bin[pos+1]!=’\0′) {
    if (bin[pos]==’0′ && bin[pos+1]==’0′) {
    returnValue[pos2] = ‘0’;
    } else if (bin[pos]==’1′ && bin[pos+1]==’1′) {
    returnValue[pos2] = ‘1’;
    } else if (bin[pos]==’0′ && bin[pos+1]==’1′) {
    returnValue[pos2] = ‘F’;
    } else {
    return « not applicable »;
    }
    pos = pos+2;
    pos2++;
    }
    returnValue[pos2] = ‘\0’;
    return returnValue;
    }

    static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength) {
    static char bin[64];
    unsigned int i=0;

    while (Dec > 0) {
    bin[32+i++] = ((Dec & 1) > 0) ? ‘1’ : ‘0’;
    Dec = Dec >> 1;
    }

    for (unsigned int j = 0; j< bitLength; j++) {
    if (j >= bitLength – i) {
    bin[j] = bin[ 31 + i – (j – (bitLength – i)) ];
    } else {
    bin[j] = ‘0’;
    }
    }
    bin[bitLength] = ‘\0’;

    return bin;
    }

  • petite erreur le code compilable sous arduino 1.18.3 est celui la:

    #include <LiquidCrystal_I2C.h>
    #include <RCSwitch.h>
    #include <Wire.h>

    RCSwitch mySwitch = RCSwitch();
    LiquidCrystal_I2C lcd(0x27, 20, 4);

    void setup() {
    Serial.begin(9600);
    mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
    lcd.begin ();
    }

    void loop() {
    lcd.backlight();
    if (mySwitch.available()) {
    output(mySwitch.getReceivedValue(), mySwitch.getReceivedBitlength(), mySwitch.getReceivedDelay(), mySwitch.getReceivedRawdata(),mySwitch.getReceivedProtocol());

    lcd.setCursor(0,0);
    lcd.print(« value: « );
    lcd.setCursor(7,0);
    lcd.print(mySwitch.getReceivedValue());

    lcd.setCursor(0,1);
    lcd.print(« delai: « );
    lcd.setCursor(7,1);
    lcd.print(mySwitch.getReceivedDelay());

    lcd.setCursor(0,2);
    lcd.print(« longu: »);
    lcd.setCursor(7,2);
    lcd.print(mySwitch.getReceivedBitlength());

    lcd.setCursor(0,3);
    lcd.print(« Proto: « );
    lcd.setCursor(7,3);
    lcd.print(mySwitch.getReceivedProtocol());
    mySwitch.resetAvailable();
    }
    }

    static const char* bin2tristate(const char* bin);
    static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength);

    void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw, unsigned int protocol) {

    if (decimal == 0) {
    Serial.print(« Unknown encoding. »);
    } else {
    const char* b = dec2binWzerofill(decimal, length);
    Serial.print(« Decimal: « );
    Serial.print(decimal);
    Serial.print( » (« );
    Serial.print( length );
    Serial.print(« Bit) Binary: « );
    Serial.print( b );
    Serial.print( » Tri-State: « );
    Serial.print( bin2tristate( b) );
    Serial.print( » PulseLength: « );
    Serial.print(delay);
    Serial.print( » microseconds »);
    Serial.print( » Protocol: « );
    Serial.println(protocol);
    }

    Serial.print(« Raw data: « );
    for (unsigned int i=0; i<= length*2; i++) {
    Serial.print(raw[i]);
    Serial.print(« , »);
    }
    Serial.println();
    Serial.println();
    }

    static const char* bin2tristate(const char* bin) {
    static char returnValue[50];
    int pos = 0;
    int pos2 = 0;
    while (bin[pos]!=’\0′ && bin[pos+1]!=’\0′) {
    if (bin[pos]==’0′ && bin[pos+1]==’0′) {
    returnValue[pos2] = ‘0’;
    } else if (bin[pos]==’1′ && bin[pos+1]==’1′) {
    returnValue[pos2] = ‘1’;
    } else if (bin[pos]==’0′ && bin[pos+1]==’1′) {
    returnValue[pos2] = ‘F’;
    } else {
    return « not applicable »;
    }
    pos = pos+2;
    pos2++;
    }
    returnValue[pos2] = ‘\0’;
    return returnValue;
    }

    static char * dec2binWzerofill(unsigned long Dec, unsigned int bitLength) {
    static char bin[64];
    unsigned int i=0;

    while (Dec > 0) {
    bin[32+i++] = ((Dec & 1) > 0) ? ‘1’ : ‘0’;
    Dec = Dec >> 1;
    }

    for (unsigned int j = 0; j< bitLength; j++) {
    if (j >= bitLength – i) {
    bin[j] = bin[ 31 + i – (j – (bitLength – i)) ];
    } else {
    bin[j] = ‘0’;
    }
    }
    bin[bitLength] = ‘\0’;

    return bin;
    }

     

  • Bonjour,

    J’ai trouvé votre site internet.

    Il est de très grande qualité, je vous remercie.

    Je suis retraité depuis quelques mois , je m’intéresse à Arduino (j’essaie de comprendre …)

    J’ai un portail électrique, je vais donc tenter de faire votre test !

    Pouvez-vous svp me donner la valeur du potentiomètre et le programme pour l’Arduino Uno car celui sur le site ne fonctionne pas.

    Je vais commander ensuite le marériel.

    Je vous remercie pour tout ce travail!

  • Bonjour,
    Je viens de réaliser le montage. À part certain PIN inversé dans le schéma tout est Niquel.
    par Contre pour le code , un bon nombre de messages d’erreurs s’affiche  :
    Ci-joint les messages d’erreur , pouvez-vous m’aider?

     

    ATTENTION : La catégorie ‘Sensor’ dans la bibliothèque SHT31 n’est pas valide. Définition sur : ‘Uncategorized’
    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228\sketch_feb27a20210228.ino:10:27: warning: invalid conversion from ‘void*’ to ‘char**’ [-fpermissive]

    char **tabRecords = malloc(sizeof(char*) * 30);

    ^

    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228\sketch_feb27a20210228.ino:11:25: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

    char * datas = «  »;

    ^

    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228\sketch_feb27a20210228.ino: In function ‘void loop()’:

    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228\sketch_feb27a20210228.ino:104:38: warning: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]

    tabRecords[nbRecords] = malloc(sizeof(char)*30);

    ^

    C:\Users\Zoltane\AppData\Local\Temp\ccgV3rDd.ltrans1.ltrans.o: In function `loop’:

    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228/sketch_feb27a20210228.ino:101: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’

    C:\Users\Zoltane\Desktop\Impression 3D et DIY\ouverture portail\sketch_feb27a20210228/sketch_feb27a20210228.ino:105: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’

    collect2.exe: error: ld returned 1 exit status

    Plusieurs bibliothèque trouvées pour « Adafruit_SSD1306.h »
    Utilisé : C:\Users\Zoltane\Documents\Arduino\libraries\Adafruit_SSD1306
    Non utilisé : C:\Users\Zoltane\Documents\Arduino\libraries\Adafruit_SSD1306_Wemos_Mini_OLED
    exit status 1
    Erreur de compilation pour la carte Arduino/Genuino Uno

     

    Merci par avance.

  • Larose Jean Claude

    Gros problème de compilation à chaque tentative  »

     

    C:\Users\jean_\Documents\change/change.ino:100: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’

    C:\Users\jean_\Documents\change/change.ino:104: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’

    collect2.exe: error: ld returned 1 exit status

    Plusieurs bibliothèque trouvées pour « Adafruit_SSD1306.h »
    Utilisé : C:\librairies\libraries\Adafruit_SSD1306
    Non utilisé : C:\Program Files (x86)\Arduino\libraries\Adafruit_SSD1306
    Plusieurs bibliothèque trouvées pour « RCSwitch.h »
    Utilisé : C:\librairies\libraries\rc-switch-master
    Non utilisé : C:\Program Files (x86)\Arduino\libraries\rc-switch-master
    exit status 1
    Erreur de compilation pour la carte Arduino Uno

     

    Merci de m’aider

  • Bonjour,
    Je débute sous Arduino. J’essaye votre code et j’ai cette erreur pouvez- vous m’aider merci

    C:\Users\herve\AppData\Local\Temp\cc5SfnCg.ltrans0.ltrans.o: In function `loop’:
    C:\Users\herve\Desktop\sketch_nov04a/sketch_nov04a.ino:100: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’
    C:\Users\herve\Desktop\sketch_nov04a/sketch_nov04a.ino:104: undefined reference to `dec2binWzerofill(unsigned long, unsigned int)’
    collect2.exe: error: ld returned 1 exit status
    exit status 1
    Erreur de compilation pour la carte Arduino Uno

Laisser une réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site est protégé par reCAPTCHA et le GooglePolitique de confidentialité etConditions d'utilisation appliquer.