Contrôle de prises DiO avec Arduino

Électronique - 01-08-2017

Avant-propos

DiO est une gamme d'équipements de domotique inter-compatibles, et notamment de prises radio-commandés.

A partir du travail de reverse engineering de "Lstg", j'ai développé une petite bibliothèque Arduino très légère qui permet d'envoyer simplement des commandes à un module DiO. Dans cet article, je vais brièvement expliquer le protocole, avant de détailler l'installation et l'utilisation de ma bibliothèque, et enfin montrer un exemple d'utilisation : l’interrupteur "clap clap".

Principe du protocole

Le protocole de transmission HomeEasy utilise la fréquence 433MHz (réglementée par l’Union internationale des télécommunications), par une modulation ASK.

Une trame HomeEasy est organisée de la manière suivante:

Format d'une trame Homeeasy.

On identifie 4 groupes distincts:

  • Bits 0 à 25: Numéro identifiant l’émetteur (numéro unique généré aléatoirement)
  • Bit 26: Single/Group
  • Bit 27: On/Off
  • Bits 28 à 31: Numéro identifiant de l'appareil
  • Bits 32 à 36: Dim level (facultatif, non supporté par ma bibliothèque)

De plus, il y a des marqueurs de début et de fin de trame. Les bits de données sont encodés sous la forme 0=01 et 1=10 pour une question de résistance aux interférences RF.

L'objectif de la bibliothèque Arduino est donc de lire la commande émise par chaque boutons d'une télécommande, puis de le ré-émettre avec le bon encodage pour pouvoir interagir avec des modules DiO.

Installation et utilisation de ma bibliothèque

Cette bibliothèque implémente une classe DiOremote pour simuler très simplement une télécommande DiO à partir d'une Arduino et d'un module 433MHz. On peut trouver ces modules émission/réception 433MHz autour de 2$ l'ensemble.

Télécharger la bibliothèque

Pour l'ajouter au logiciel Arduino:

  1. Télécharger l'archive.
  2. Décompresser l'archive dans <chemin d'installation d'Arduino>/librairies. On peut également utiliser l'option Croquis > Inclure une bibliothèque > Ajouter la bibliothèque .ZIP et sélectionner l'archive.
  3. Redémarrer le logiciel Arduino.

Un exemple de code qui fait clignoter un module DiO est accessible depuis le menu Fichiers > Exemples > DiOremote. Toutefois, pour pouvoir l'utiliser, il faut impérativement extraire les codes envoyées par la télécommande. Pour cela, suivre la procédure suivante:

  1. Brancher l'Arduino au module de réception 433MHz comme dans l'image suivante.Circuit de réception 433MHz.
  2. Ouvrir l'exemple ReadCommand puis le téléverser sur la carte Arduino.
  3. Placer la télécommande devant le module de réception, ouvrir le moniteur série (Outils > Moniteur Série), et appuyer sur les boutons de la télécommande pour voir les données correspondantes. Dans mon cas:Capture des trames HomeEasy.
  4. Ouvrir le code SendCommand, remplacer le CODE_ON et CODE_OFF par les valeurs de votre télécommande, et tester le résultat en branchant le module TX!Circuit d'émission 433MHz.

Note : j'ai arbitrairement utilisé la pin 2 de l'Arduino dans mes exemples. On peut utiliser toutes les pins sauf 0 et 1.

Cas pratique : interrupteur "clap clap"

Dans le but d'illustrer le fonctionnement de cette bibliothèque, j'ai fait un montage très simple pour contrôler une lampe en tapant dans ses mains. L'état du module DiO basculera à chaque fois que l'on tape deux fois dans ses mains, séparé d'une seconde (+ ou - 500ms). Voici le circuit correspondant:

Circuit de l'interrupteur clap clap.

Voici le code Arduino complet de l'exemple, à programmer sur la carte:

#include <DiOremote.h>

#define TRESHOLD  100
#define PULSE_TIME 250
#define MIN_TIME  500
#define MAX_TIME  1500

const unsigned long ON_CODE  = 1278825104;
const unsigned long OFF_CODE = 1278825088;
DiOremote myRemote = DiOremote(2);

byte state = 0;
unsigned long t0;

void setup(){}

void loop(){
reset:
    delay(MAX_TIME);
    for(;;){
        if(analogRead(A0) > TRESHOLD) {
            t0 = millis();
            delay(PULSE_TIME);
            while(millis() - t0 < MIN_TIME)
              if (analogRead(A0) > TRESHOLD) goto reset;
            while(millis() - t0 < MAX_TIME){
                if(analogRead(A0) > TRESHOLD) {
                    state = !state;
                    if(state) myRemote.send(ON_CODE);
                    else      myRemote.send(OFF_CODE);
                    goto reset;
                }
            }
        }
    }
}

Le résultat est montré dans la vidéo suivante.

Bien entendu, on peut aller beaucoup plus loin avec ce système, et contrôler l'Arduino à travers une interface web par exemple, pour créer un véritable système domotique.

Auteur :


What is on your mind?

  • #1 pixels59

    Formidable,après quelques essais sans succès avec des autres auteurs , là ça marche du premier coup et c'est exactement ce que je cherchais. Bravo et un grand MERçI

    on August 17 2018, 15:30

  • #2 Fire_Blaim

    Meilleur tuto du monde !!!! Fonctionne du premier coup

    on September 12 2018, 18:51

  • #3 splinter

    Superbe, pile ce que je cherchais, Bravo Charles et merci pour cette biblio.

    on February 20 2019, 19:48

  • #4 FLA

    Salut,
    après des heures de recherche comme d'autres personnes je pense, tout marche du premier coup.
    Thanks

    on April 8 2019, 22:38

  • #5 Hugodu21

    Génial! c'est clair détaillé, moi qui cherchais partout des infos sur mes interrupteurs Dio, et en plus ca marche du premier coup, l'explication de la trame c'est top ! Grand merci.

    on December 8 2019, 21:01

  • #6 Peter

    Simple, Clair et fonctionnel. merci pour cette librairie DIO.

    on December 8 2019, 21:43

  • #7 cristigou

    Bonjour
    Bravo pour ce tuto mais....
    Tout est ok avec l'exemple "sendCodeOnOff" mais l'autre exemple "RecordCode" ne va pas. Il n'y a pas"inclure dioremote.h" est ce normal? Même en le rajoutant cela ne va pas. Pouvez vous m'aider? A l'avance merci.

    on March 5 2020, 17:48

  • #8 Author Charles

    @cristigou, non, en principe, pour faire fonctionner "RecordCode", il n'y a rien de particulier à faire, juste brancher correctement le module RX (réception) à l'Arduino, avec la sortie reliée à la pin 2 de l'Arduino. Si ca ne fonctionne pas (aucun code sur le moniteur série en réglant à 9600), il doit y avoir quelque chose qui ne va pas avec le module de reception...

    on March 5 2020, 21:06

  • #9 john

    super la lib merci pour le developpement

    on March 11 2020, 22:37

  • #10 cristigou

    Bonjour
    En fait la broche 2 de mon arduino est hs, sur la 3 c'est ok.
    Autre question: j'ai voulu remplacer l'arduino emetteur par un attiny et cela ne fonctionne pas. J'ai lu, je ne sais plus où ni pour quoi que sur l' attiny il fallait remplacer le timer 0 par le timer 1. Cela peut il être là cause de ce problème?
    Merci pour votre réponse.

    on March 28 2020, 7:49

  • #11 Spifthespa

    Idem pour moi, ça marche parfaitement. Chapeau bas Charles. Merci encore

    on April 6 2020, 14:18

  • #12 Titou

    Bonjour Charles,
    Très bon tuto. En ce qui concerne les dio 2.0 en 866mhz comment faire ?
    Merci d’avance

    on April 19 2020, 18:17

  • #13 Fabien

    Merci pour ce toto, ça marche super bien !

    on December 5 2020, 19:09

  • #14 JJS-56

    Superb, merci.
    Je ce utilise dans un D1 mini avec des Dio 1.0 sans problem

    on January 6 2021, 17:55

  • #15 duclafrite

    génial ! fonctionne parfaitement pour les éléments DIO j'allais perdre patience avec RC-Switch ! merci

    on January 7 2021, 12:09

  • #16 Davy

    Coucou :D
    Pouerk.. avec d'autres sniffer j'arrive avoir le signal de mes vielles chacon... j'essais de faire pareil avec mes chacon dio 1.0 . la télécommande 54760 date code 2004. J'essaie avec tout les tutos que je trouve au sujet de dio et impossible de voir quelques chose.... est ce que ton tuto devrait marcher avec ma commande ? Salutations

    on January 29 2021, 19:32

  • #17 Eric W

    merci !

    on April 4 2021, 20:06

  • #18 Manu

    Bonjour j'ai tenté avec le modèle DIO 54898 mais je n'arrive pas à lire les trames envoyées par la telecommande...

    on May 28 2021, 15:28

  • #19 ESV

    Cela fonctionne aussi sur mon Nano, en réception.
    Mon souci est quand je rajoute les commandes pour contrôler un éclairage DMX, je ne reçois plus les informations de la télécommande CHACON.

    on January 13 2023, 20:49

  • #20 Gui

    Bonjour
    Merci pour ce tuto. Le module 433 MHz correspond il au produit sur ce lien ?
    https://amzn.to/3QTlHkS
    Serait-il possible d’avoir une librairie compatible pour le Raspberry pico ?

    on November 25 2023, 8:20

  • #21 Gui

    Bonjour
    Merci pour ce tuto. Le module 433 MHz correspond il au produit sur ce lien ?
    https://amzn.to/3QTlHkS
    Serait-il possible d’avoir une librairie compatible pour le Raspberry pico ?

    on November 25 2023, 8:21

  • #22 Gui

    Merci pour ce tuto. Le module 433 MHz correspond il au produit sur ce lien ?
    https://amzn.to/3QTlHkS
    Serait-il possible d’avoir une librairie compatible pour le Raspberry pico ?

    on November 25 2023, 8:23

  • #23 Gui

    Merci pour ce tuto. Le module 433 MHz correspond il au produit sur ce lien ?
    https://amzn.to/3QTlHkS
    Serait-il possible d’avoir une librairie compatible pour le Raspberry pico ?

    on November 25 2023, 8:23

  • #24 Gui

    Merci pour ce tuto. Le module 433 MHz correspond il au produit sur ce lien ?
    https://amzn.to/3QTlHkS
    Serait-il possible d’avoir une librairie compatible pour le Raspberry pico ?

    on November 25 2023, 20:30

  • #25 Midame

    J'ai pu trouver les codes de ma télécommande DIO, et en emission ça fonctionne, parfait tuto

    on December 5 2023, 11:25

  • #26 Midame

    J'ai pu trouver les codes de ma télécommande DIO, et en émission ça fonctionne, parfait tuto

    on December 5 2023, 11:26

  Retour aux projets

Projets similaires