[Tuto] Utiliser 2 Arduinos en série

Utiliser 2 Arduinos en série

Le but de ce montage est d’ allumer une LED connectée à un Arduino en la commandant depuis le second Arduino. Ce montage va utiliser le réseau I2C du Arduino.

 Composants nécessaires :

 composants

Pour mettre en réseau les 2 Arduinos, nous allons utiliser l’interface I2C du Arduino. Le réseau I2C fonctionne sur le principe Maître / Esclave. Il peut y avoir un seul maître par réseau et plusieurs esclaves (chaque esclave a un identifiant). Cette interface nécessite 2 fils le SDA (Broche Analog A4) et SCL (Broche Analog A5). Grâce au réseau I2C, il est possible de connecter différentes cartes électroniques ou simple circuit intégré (« puce ») facilement comme le montre le schéma suivant :

schema i2c On voit sur ce schéma que pour fonctionner les éléments du réseau doit être alimenté par la même alimentation. Pour simplifier ceci, nous allons alimenter le Arduino donnant la commande (qui sera le maître) avec le Arduino allumant la LED (qui sera l’esclave).

 Principe du montage :

Le montage va cette fois-ci se décomposer en 2 parties :

  • Le Arduino esclave: Le Arduino esclave aura une LED et sa résistance câblée entre sa sortie digital 2 et le GND. Il utilisera sa sortie 5V pour alimenter le Arduino maître.

  • Le Arduino maître : Le Arduino maître reçoit son alimentation du Arduino esclave sur son entrée Vin.

 Pour terminer la bonne connexion de l’alimentation, il reste à connecter entre eux les GND des 2 arduinos.

 Pour établir la connexion entre ces 2 Arduinos, il va être nécessaire de raccorder les signaux SDA/SCL:

  • Entre la borne Analog 4 (SDA) du Arduino maître et la borne Analog 4 du Arduino esclave

  • Entre la borne Analog 5 (SCL) du Arduino maître et la borne Analog 5 du Arduino esclave

2 arduino en serie_scéma

Réalisation du montage :

 Pour le Arduino esclave, ce montage est le même que le montage « Allumer une LED »

Pour le Arduino maître, uniquement des connexions avec le Arduino esclave.

2 arduino en serie_bb

Montage

Programmation du montage :

La programmation de ce montage s’appuie sur la librairie Wire. Comme c’est une librairie, pour utiliser ces fonctions, il faudra écrire «Wire.nomdelafonction » .Elle contient les fonctions suivantes :

  • begin(X) : Initialise la liaison I2C. Se place dans la section « setup ». Le paramètre X est l’adresse de la carte esclave. Pour le maître le paramètre reste vide.

  • RequestFrom(X, Y) : Commande utilisée par le maître pour demander des informations aux esclaves (requête). Le paramètre X est l’adresse de l’esclave. Le paramètre Y est le nombre d’octets demandé.

  • beginTransmission(X) : Commande utilisée par le maître pour démarrer une transmission avec l’esclave de l’adresse X.

  • endTransmission() : Commande utilisée par le maître pour clore une transmission.

  • Write(X) : Commande utilisée par l’esclave pour répondre le message X à une demande du maître.

  • Available() : Renvoi le nombre d’octet disponible pour la lecture. C’est une fonction très intéressante pour savoir s’il y a des messages en attente de lecture.

  • Read() : Lit les message en attente sur le bus. Attention : La fonction read lit caractère par caractère.

  • OnReceive(X) : C’est une commande destinée uniquement à l’esclave qui va être appelée lorsqu’il y a des messages à lire la fonction X.

  • onRequest() : C’est une commande destinée uniquement à l’esclave qui va être appelée lorsqu’il y a une requête du maître.

 Le programme va lui aussi être coupé en 2, un pour chaque Arduino.

 ATTENTION : Il faut déconnecter les Arduinos durant la programmation !

 Programme du Arduino Esclave :

 Le Arduino esclave définit qu’il a une sortie sur digital 2. Il dit que son adresse est la numéro 4. Il va attendre de recevoir le chiffre 1 sur l’interface I2C pour allumer la LED. Quand il reçoit 0 il éteint la LED.

#include <Wire.h> // Librairie pour la communication I2C

const int L1 = 2; // broche 2 du micro-contrôleur se nomme maintenant : L1

void setup()
{
Wire.begin(4); // Rejoindre le bus à l'adresse #4
Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee
Serial.begin(9600); // Demarrer la liaison serie avec le PC
pinMode(L1, OUTPUT); // L1 est une broche de sortie
}

void loop()
{
delay(100);
}

// Fonction qui s execute si quelque chose est present sur l interface
void receiveEvent(int howMany)
{
int x = Wire.read(); // recevoir un chiffre
Serial.println(x); // afficher ce chiffre sur l'interface serie
if(x == 1)
{
digitalWrite(L1, HIGH); // allumer L1
}
if(x == 0)
{
digitalWrite(L1, LOW); // eteindre L1
}
}

Programme du Arduino Maître :

Le Arduino maître envoie un 1 sur l’interface I2C, attend 1 seconde, envoi un 0 sur l’interface I2C, attend 2 secondes et recommence à l’infini.

#include <Wire.h>

void setup()
{
Wire.begin(); // Rejoindre le bus I2C (Pas besoin d adresse pour le maitre)
}

void loop()
{
//contenu du programme
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(1); // Envoi un 1
Wire.endTransmission(); // Arreter la transmission
delay(1000); // Attendre 1s
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(0); // Envoi un 0
Wire.endTransmission(); // Arreter la transmission
delay(2000); // Attendre 2s
}

Il reste à brancher le Arduino pour compiler le programme et le téléverser.

Une fois terminé cela nous donne :

led OFF

LED éteinte

led ON

LED allumée

série

Interface série

Pour aller plus loin :

Il est possible de rendre autonome le montage en lui ajoutant un coupleur de pile. Il est aussi possible de modifier les temps allumés et éteints. On peut remplacer les temps par un bouton poussoir ce qui ferait un système de bouton déporté.

40 réflexions au sujet de « [Tuto] Utiliser 2 Arduinos en série »

  1. Bonjour, j’essaye de faire communiquer 2 Arduinos, votre TUTO m’a beaucoup aidé.
    J’ai modifié pour pouvoir faire clignoter une led sur la broche 13, mais sans succés.
    Je vous joins les 2 programmes effectués, il sont similaire au votre.
    Pouvez-vous me dire ou est mon erreur.
    Cordialement.

    //************MAITRE*****************
    #include
    //com3
    int led = 13;
    int i=0;

    void setup()
    {
    Serial.begin(9600);
    pinMode(led, OUTPUT);
    Wire.begin();
    }
    void loop()
    {
    //contenu du programme
    Wire.beginTransmission(4); // Envoyer vers device #4
    Wire.write(1); // Envoi un 1
    Wire.endTransmission(); // Arreter la transmission
    delay(2000); // Attendre 2s
    Serial.println(« envoi 1 »);
    i=0;
    while (i!=10)
    {
    Serial.print(« i : « );
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    Wire.beginTransmission(4); // Envoyer vers device #4
    Wire.write(0); // Envoi un 0
    Wire.endTransmission(); // Arreter la transmission
    delay(2000); // Attendre 2s
    Serial.println(« envoi 0 »);
    i=0;
    while (i!=10)
    {
    Serial.print(« i : « );
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }

    }

    //******ESCLAVE*********
    #include // Librairie pour la communication I2C
    //com4
    int led = 13;
    int i=0;

    void setup()
    {
    Wire.begin(4); // Rejoindre le bus à l’adresse #4
    Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee
    Serial.begin(9600); // Demarrer la liaison serie avec le PC
    pinMode(led, OUTPUT);
    }
    void loop()
    {
    delay(100);
    }
    // Fonction qui s execute si quelque chose est present sur l interface
    void receiveEvent(int howMany)
    {
    int x = Wire.read(); // recevoir un chiffre
    Serial.print(« x = « );
    Serial.println(x); // afficher ce chiffre sur l’interface serie
    if(x == 1)
    {
    Serial.println(« LED pour x=1 »);
    i=0;
    while (i!=10)
    {
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    }
    if(x == 0)
    {
    Serial.println(« LED pour x=0 »);
    i=0;
    while (i!=10)
    {
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    }
    }

  2. Bonjour, j’essaye de faire communiquer 2 Arduinos, votre TUTO m’a beaucoup aidé.
    J’ai modifié pour pouvoir faire clignoter une led sur la broche 13, mais sans succés.
    Je vous joins les 2 programmes effectués, il sont similaire au votre.
    Pouvez-vous me dire ou est mon erreur.
    Cordialement.

    //************MAITRE*****************
    #include
    //com3
    int led = 13;
    int i=0;

    void setup()
    {
    Serial.begin(9600);
    pinMode(led, OUTPUT);
    Wire.begin();
    }
    void loop()
    {
    //contenu du programme
    Wire.beginTransmission(4); // Envoyer vers device #4
    Wire.write(1); // Envoi un 1
    Wire.endTransmission(); // Arreter la transmission
    delay(2000); // Attendre 2s
    Serial.println(« envoi 1 »);
    i=0;
    while (i!=10)
    {
    Serial.print(« i : « );
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    Wire.beginTransmission(4); // Envoyer vers device #4
    Wire.write(0); // Envoi un 0
    Wire.endTransmission(); // Arreter la transmission
    delay(2000); // Attendre 2s
    Serial.println(« envoi 0 »);
    i=0;
    while (i!=10)
    {
    Serial.print(« i : « );
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }

    }

    //******ESCLAVE*********
    #include // Librairie pour la communication I2C
    //com4
    int led = 13;
    int i=0;

    void setup()
    {
    Wire.begin(4); // Rejoindre le bus à l’adresse #4
    Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee
    Serial.begin(9600); // Demarrer la liaison serie avec le PC
    pinMode(led, OUTPUT);
    }
    void loop()
    {
    delay(100);
    }
    // Fonction qui s execute si quelque chose est present sur l interface
    void receiveEvent(int howMany)
    {
    int x = Wire.read(); // recevoir un chiffre
    Serial.print(« x = « );
    Serial.println(x); // afficher ce chiffre sur l’interface serie
    if(x == 1)
    {
    Serial.println(« LED pour x=1 »);
    i=0;
    while (i!=10)
    {
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    }
    if(x == 0)
    {
    Serial.println(« LED pour x=0 »);
    i=0;
    while (i!=10)
    {
    Serial.println(i);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    ++i;
    }
    }
    }

  3. Ok pour les liens, mais ma question est toujours la même, je n’arrive pas à faire clignoter la led dans le programme ESCLAVE suivant mon premier message ou il manqué la librairie WIRE.
    Bonne soirée.
    Marc.

    • Bonjour,

      Pour commencer, avez-vous essayé de mettre le contenu de la fonction receiveEvent dans le loop sur le programme esclave? Est-ce que le programme maître fonctionne correctement?

      • Bonjour, après plusieurs recherches sur les sites, j’ai remarqué :
        que la fonction void receiveEvent(int howMany) et en fait une interruption et qu’il est recommandé qu’elle soit la plus courte possible, qu’elle ne comporte pas de delay ni millis puisque le programme s’arrête, et que si on veut utiliser le paramètre reçu dans l’esclave il faut la déclarer en variable volatile.
        Je vous joins les 2 programmes modifiés qui cette fois ci fonctionne correctement.
        Salutations.

        //************MAITRE*****************
        #include // Librairie pour la communication I2C
        //com3
        int led = 13;
        int i=0;

        void setup()
        {
        Serial.begin(9600);
        pinMode(led, OUTPUT);
        Wire.begin();
        }
        void loop()
        {
        //contenu du programme
        delay(2000); // Attendre 2s
        Wire.beginTransmission(4); // Envoyer vers device #4
        Wire.write(1); // Envoi un 1 a l’esclave
        Wire.endTransmission(); // Arreter la transmission
        Serial.println(« Envoi 1 a l’esclave »);
        i=0;
        while (i!=6)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(500);
        ++i;
        }
        delay(2000); // Attendre 2s
        Wire.beginTransmission(4); // Envoyer vers device #4
        Wire.write(0); // Envoi un 0 a l’esclave
        Wire.endTransmission(); // Arreter la transmission
        Serial.println(« Envoi 0 a l’esclave »);
        i=0;
        while (i!=6)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(500);
        ++i;
        }
        }
        //*****************************************

        //******ESCLAVE*********
        #include // Librairie pour la communication I2C
        //com4
        int led = 13;
        int i=0;

        volatile int x=2; // déclaration variable volatile = stockée en RAM

        void setup()
        {
        Serial.begin(9600); // Demarrer la liaison serie avec le PC
        pinMode(led, OUTPUT);
        Wire.begin(4); // Rejoindre le bus à l’adresse #4
        Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee

        }
        void loop()
        {
        if(x == 1)
        {
        Serial.print( » Recu du maitre x = « );
        Serial.println(x); // afficher ce chiffre sur l’interface serie
        Serial.println( » LED pour x=1″);
        i=0;
        while (i!=10)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(250);
        digitalWrite(led, LOW);
        delay(250);
        ++i;
        }
        x=2;
        }
        if(x == 0)
        {
        Serial.print( » Recu du maitre x = « );
        Serial.println(x); // afficher ce chiffre sur l’interface serie
        Serial.println( » LED pour x=0″);
        i=0;
        while (i!=10)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(250);
        digitalWrite(led, LOW);
        delay(250);
        ++i;
        }
        x=2;
        }
        }
        // Fonction qui s execute si quelque chose est present sur l interface
        void receiveEvent(int howMany)
        {
        x = Wire.read(); // recevoir un chiffre
        }
        //************************************************

  4. Ok pour les liens, mais ma question est toujours la même, je n’arrive pas à faire clignoter la led dans le programme ESCLAVE suivant mon premier message ou il manqué la librairie WIRE.
    Bonne soirée.
    Marc.

    • Bonjour,

      Pour commencer, avez-vous essayé de mettre le contenu de la fonction receiveEvent dans le loop sur le programme esclave? Est-ce que le programme maître fonctionne correctement?

      • Bonjour, après plusieurs recherches sur les sites, j’ai remarqué :
        que la fonction void receiveEvent(int howMany) et en fait une interruption et qu’il est recommandé qu’elle soit la plus courte possible, qu’elle ne comporte pas de delay ni millis puisque le programme s’arrête, et que si on veut utiliser le paramètre reçu dans l’esclave il faut la déclarer en variable volatile.
        Je vous joins les 2 programmes modifiés qui cette fois ci fonctionne correctement.
        Salutations.

        //************MAITRE*****************
        #include // Librairie pour la communication I2C
        //com3
        int led = 13;
        int i=0;

        void setup()
        {
        Serial.begin(9600);
        pinMode(led, OUTPUT);
        Wire.begin();
        }
        void loop()
        {
        //contenu du programme
        delay(2000); // Attendre 2s
        Wire.beginTransmission(4); // Envoyer vers device #4
        Wire.write(1); // Envoi un 1 a l’esclave
        Wire.endTransmission(); // Arreter la transmission
        Serial.println(« Envoi 1 a l’esclave »);
        i=0;
        while (i!=6)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(500);
        ++i;
        }
        delay(2000); // Attendre 2s
        Wire.beginTransmission(4); // Envoyer vers device #4
        Wire.write(0); // Envoi un 0 a l’esclave
        Wire.endTransmission(); // Arreter la transmission
        Serial.println(« Envoi 0 a l’esclave »);
        i=0;
        while (i!=6)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(500);
        digitalWrite(led, LOW);
        delay(500);
        ++i;
        }
        }
        //*****************************************

        //******ESCLAVE*********
        #include // Librairie pour la communication I2C
        //com4
        int led = 13;
        int i=0;

        volatile int x=2; // déclaration variable volatile = stockée en RAM

        void setup()
        {
        Serial.begin(9600); // Demarrer la liaison serie avec le PC
        pinMode(led, OUTPUT);
        Wire.begin(4); // Rejoindre le bus à l’adresse #4
        Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee

        }
        void loop()
        {
        if(x == 1)
        {
        Serial.print( » Recu du maitre x = « );
        Serial.println(x); // afficher ce chiffre sur l’interface serie
        Serial.println( » LED pour x=1″);
        i=0;
        while (i!=10)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(250);
        digitalWrite(led, LOW);
        delay(250);
        ++i;
        }
        x=2;
        }
        if(x == 0)
        {
        Serial.print( » Recu du maitre x = « );
        Serial.println(x); // afficher ce chiffre sur l’interface serie
        Serial.println( » LED pour x=0″);
        i=0;
        while (i!=10)
        {
        Serial.print( » i :  » );
        Serial.println(i);
        digitalWrite(led, HIGH);
        delay(250);
        digitalWrite(led, LOW);
        delay(250);
        ++i;
        }
        x=2;
        }
        }
        // Fonction qui s execute si quelque chose est present sur l interface
        void receiveEvent(int howMany)
        {
        x = Wire.read(); // recevoir un chiffre
        }
        //************************************************

  5. bonjour
    je viens de tester votre bout de code
    fonctionne super
    mon probleme
    je souhaite envoyer de mon maitre 4 variables:
    heureAlarme=10;
    minuteAlarme=45;
    heureFin=12;
    minuteFin=10;
    les chiffres sont des exemples
    et les recuperer sur mon esclave pour les traiter
    avez vous un bout de code pour m’aider car novice.
    merci

    • Bonjour,

      Côté maître, vous devez faire passer vos variables via les commandes Wire.print. Je vous conseilles de mettre une annonce de variable Wire.print(« heureAlarme »); puis sa valeur Wire.print(x);

      Côté esclave, vous utiliserez une détection sur le Wire.read avec un switch case.

      • merci d’avoir repondu,
        j’ai du mal a suivre
        car je doit envoyer vers l’esclave
        la variable heuredeb
        la variable minutedeb
        puis
        la varieble heurefin
        la variable minutefin

        je les recupere sur l’esclave et les stocke sur le pas
        1 de l’eeprom
        2 de l’eeprom
        3 de l’eeprom
        4 de l’eeprom
        a partir de la je sait faire car le programme que jutilise
        marche
        au secours

          • actuellement j’ai stocke avec write.eeprom(1,10) pour l’heure
            write.eeprom(2,45) pour la minute
            write.eeprom(3,12) pour l’heure fin
            write.eeprom(4,45) pour la minute fin

            il s’agit d’horaires de depart d’un cycle de balises pour radio orientation
            je les parametre la veille et les installe le lendemain tranquilement en les posant je les allume et dans le void setup je vais relire ces données avec read.eeprom
            ce qui fait que les balise demarrent toute a la bonne heure et s’arrettent a l’heure de temps de course maximum autorisé
            j’utilise l’ide arduino pour recharger le soir les balises
            trop contraignant pour un utilisateur basic.
            donc j’ai un module specifique appele balise depart. avec afficheur et des boutons poussoirs pour choisir et incrementer des heures et des minutes facilement et en raccordant selon votre principe je souhaite telecharger par un bouton transfert sur 5 balise de course
            merci

          • une precision
            chaque « balise » est equipee d’une horloge ds1307 donc pas de mise a l’heure
            les 4 variables sont utilisees dans un if(rtc.hour = heureAlarme et rtc.minute= minuteAlarme)
            alors m’a boucle de fonctionnement emission balise demarre idem pou heureFine minuteFin qui arretent tout
            c’est donc la fonction envoi du maitre vers le ou les esclaves (si necessaire 1 apres l’autre car je leur donnerai la meme adresse i2c)
            que je n’arrive pas a comprendre
            car d’apres votre code je ne reussi que l’envoi d’une variable
            merci un bout de code d’explication (maitre et esclave) serait le bienvenu pour me depatouiller.

        • Il faut que vous alliez mettre dans le maitre:

          Wire.beginTransmission(4); // Selection de la balise
          Wire.write(heuredeb); // Envoi de heuredeb
          Wire.write(minutedeb); // Envoi de minutedeb
          Wire.write(heurefin); // Envoi de heurefin
          Wire.write(minutefin); // Envoi de minutefin
          Wire.endTransmission(); // Arreter la transmission

          Ceci est à faire en changeant le 4 pour chaque balise

          Coté esclave (balise):

          Dans le setup
          Wire.begin(4); // Rejoindre le bus à l’adresse #4
          Wire.onReceive(receiveEvent);
          Dans le loop
          int heuredeb = Wire.read();
          int minutedeb = Wire.read();
          int heurefin = Wire.read();
          int minutefin = Wire.read();

          • merci finalement c’est tout simple
            je ne voyait pas cela de cette facon
            je vais tester sur mon montage et je vous tiens au courant
            encore une fois merci de m’avoir enlevé cette epine du pied
            cordialement

          • nickel
            j’ai teste tout est OK
            mon esclave stocke les 4 variables dans la 24c16 et tout fonctionne en autonome apres separation maitre esclave
            de plus en effectuant la routine avec 5 adresses
            telechargement possible des 5
            merci encore

  6. bonjour
    je viens de tester votre bout de code
    fonctionne super
    mon probleme
    je souhaite envoyer de mon maitre 4 variables:
    heureAlarme=10;
    minuteAlarme=45;
    heureFin=12;
    minuteFin=10;
    les chiffres sont des exemples
    et les recuperer sur mon esclave pour les traiter
    avez vous un bout de code pour m’aider car novice.
    merci

    • Bonjour,

      Côté maître, vous devez faire passer vos variables via les commandes Wire.print. Je vous conseilles de mettre une annonce de variable Wire.print(« heureAlarme »); puis sa valeur Wire.print(x);

      Côté esclave, vous utiliserez une détection sur le Wire.read avec un switch case.

      • merci d’avoir repondu,
        j’ai du mal a suivre
        car je doit envoyer vers l’esclave
        la variable heuredeb
        la variable minutedeb
        puis
        la varieble heurefin
        la variable minutefin

        je les recupere sur l’esclave et les stocke sur le pas
        1 de l’eeprom
        2 de l’eeprom
        3 de l’eeprom
        4 de l’eeprom
        a partir de la je sait faire car le programme que jutilise
        marche
        au secours

          • actuellement j’ai stocke avec write.eeprom(1,10) pour l’heure
            write.eeprom(2,45) pour la minute
            write.eeprom(3,12) pour l’heure fin
            write.eeprom(4,45) pour la minute fin

            il s’agit d’horaires de depart d’un cycle de balises pour radio orientation
            je les parametre la veille et les installe le lendemain tranquilement en les posant je les allume et dans le void setup je vais relire ces données avec read.eeprom
            ce qui fait que les balise demarrent toute a la bonne heure et s’arrettent a l’heure de temps de course maximum autorisé
            j’utilise l’ide arduino pour recharger le soir les balises
            trop contraignant pour un utilisateur basic.
            donc j’ai un module specifique appele balise depart. avec afficheur et des boutons poussoirs pour choisir et incrementer des heures et des minutes facilement et en raccordant selon votre principe je souhaite telecharger par un bouton transfert sur 5 balise de course
            merci

          • une precision
            chaque « balise » est equipee d’une horloge ds1307 donc pas de mise a l’heure
            les 4 variables sont utilisees dans un if(rtc.hour = heureAlarme et rtc.minute= minuteAlarme)
            alors m’a boucle de fonctionnement emission balise demarre idem pou heureFine minuteFin qui arretent tout
            c’est donc la fonction envoi du maitre vers le ou les esclaves (si necessaire 1 apres l’autre car je leur donnerai la meme adresse i2c)
            que je n’arrive pas a comprendre
            car d’apres votre code je ne reussi que l’envoi d’une variable
            merci un bout de code d’explication (maitre et esclave) serait le bienvenu pour me depatouiller.

        • Il faut que vous alliez mettre dans le maitre:

          Wire.beginTransmission(4); // Selection de la balise
          Wire.write(heuredeb); // Envoi de heuredeb
          Wire.write(minutedeb); // Envoi de minutedeb
          Wire.write(heurefin); // Envoi de heurefin
          Wire.write(minutefin); // Envoi de minutefin
          Wire.endTransmission(); // Arreter la transmission

          Ceci est à faire en changeant le 4 pour chaque balise

          Coté esclave (balise):

          Dans le setup
          Wire.begin(4); // Rejoindre le bus à l’adresse #4
          Wire.onReceive(receiveEvent);
          Dans le loop
          int heuredeb = Wire.read();
          int minutedeb = Wire.read();
          int heurefin = Wire.read();
          int minutefin = Wire.read();

          • merci finalement c’est tout simple
            je ne voyait pas cela de cette facon
            je vais tester sur mon montage et je vous tiens au courant
            encore une fois merci de m’avoir enlevé cette epine du pied
            cordialement

          • nickel
            j’ai teste tout est OK
            mon esclave stocke les 4 variables dans la 24c16 et tout fonctionne en autonome apres separation maitre esclave
            de plus en effectuant la routine avec 5 adresses
            telechargement possible des 5
            merci encore

  7. Bonjour,
    votre code ma aider pour faire communiquer 2 arduinos mais je ne sais pas comment faire pour ajouter un capteur de temperature, lire cette valeur par un arduino et l’afficher avec l’autre sur un LCD.
    Merci

  8. Bonjour,
    votre code ma aider pour faire communiquer 2 arduinos mais je ne sais pas comment faire pour ajouter un capteur de temperature, lire cette valeur par un arduino et l’afficher avec l’autre sur un LCD.
    Merci

Laisser un commentaire

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