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 : Charles Grassin


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, 13:30

  • #2 Fire_Blaim

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

    on September 12 2018, 16:51

  • #3 splinter

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

    on February 20 2019, 18: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, 20:38

  Retour aux projets

Projets connexes