extention entree sortie 2 arduino une ou plus I2C

bonjour, est ce possible de mettre 2 voir plus "arduino uno" en i2c

pour :

sur une "ecran + clavier"
sur la deuxieme entre sortie " capteur led ........"

et d'autre autre pour ex capteur rfid moteur ......

j'ai trouver ceci pour faire une extension "MCP23017"

mais je souhaiterais que ce soit avec des arduino uno

merci

cordialement

Bonjour,
si la question est "est il possible de raccorder plusieurs modules i2c à mon arduino ?"
la réponse est "oui, l'interface i2c a été créée pour cela"

y a t'il un tuto expliquant cette procedure car je ne comprend pas comment faire

que doit-je mettre dans la maître et dans l'esclave dans l'exemple de " esclave a un écran LCD 2 x 16 et un clavier " 4 ligne 3 colonne

car dans les explication que j'ai trouve ils parlent de "reader ou sender" alors que si j'ai un clavier et un ecran sur l'esclave il doit etre les 2

clavier sur esclave --- > master "analyse" master ----> ecran sur esclave

chemas ci joint

ou est ce que je doit mettre clavier et capteur sur esclave et ecran , led ... sur maitre ?

merci encore de votre aide

regardes les exemples master_reader et master_sender de la librairie Wire

oui j'ai fait ceci je l'ai meme tester avec mes 2 uno mais je ne voit pas comment l'appliquer dans mon cas

j'ai meme essayer ceci sans succé car je ne c'est pas quoi mettre dans l'arduino esclave " celle ou LCD est connecter"

de base c'est prevu pour un : PCF8574P

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

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

void setup()
{
 lcd.init();                      // initialize the lcd 

 // Print a message to the LCD.
 lcd.backlight();
 lcd.print("Hello, world!");
}

void loop()
{
}

Il serait bien aimable et bienvenu de lire ou relire la charte ainsi que de consulter le sujet sur la façon d'écrire les messages, ces deux éléments se trouvent en tête des messages du forum.

Ensuite, fort de ces nouvelles informations, il serait judicieux que vous éditiez, au moyen du bouton dédié à cet effet dans la fenêtre de rédaction de sujet, les messages contenant du code afin d'insérer les dits codes entre les balises idoïnes.

Merci pour votre infinie bienveillance.

ou est ce que je dois

tu ne dois rien tu peux désigner l'un ou l'autre comme maître :

si le 1er est maître, il va :

  • dire au 2ème quels sont les états ses boutons (les boutons du 1er)
  • demander au 2ème, ce qu'il doit afficher sur ses leds (les leds du 1er)

si le 2ème est maître, il va :

  • demander au 1er quels sont les états ses boutons (les boutons du 1er)
  • dire au 1er ce qu'il doit afficher sur ses leds (les leds du 1er)

la mise en œuvre de la liaison i2c n'est pas des plus simples, je te conseille de procéder par étapes
en commençant par le 2ème

bonjour merci pour cet explication

je viens de tester master envoi donne a slave pour alumer led "sa fonctionne :

maitre :

#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
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(2); // 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
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(3); // Envoi un 0
Wire.endTransmission(); // Arreter la transmission
delay(2000); // Attendre 2s
}

esclave :

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

const int L1 = 2; // broche 2 du micro-contrôleur se nomme maintenant : L1
const int L2 = 3;
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
pinMode(L2, 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.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
}
if(x == 2)
{
digitalWrite(L2, HIGH); // allumer L1
}
if(x == 3)
{
digitalWrite(L2, LOW); // eteindre L1
}
}

donc la je suis dans le cas 1 "je pense "

par contre j'essaye d'ajouter un retour mais la plus rien ne fonctionne code :

maitre :

#include <Wire.h>

const int T1 = 3; // led pour retour
void setup()
{
Wire.begin(0); // Rejoindre le bus I2C (je lui donne une adresse pour le retour)
Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee
pinMode(T1, OUTPUT);
}

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
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(2); // 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
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(3); // Envoi un 0
Wire.endTransmission(); // Arreter la transmission
delay(2000); // Attendre 2s
}



//partie du retour

// 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 == 11)
{
digitalWrite(T1, HIGH); // allumer L1
}
if(x == 10)
{
digitalWrite(T1, LOW); // eteindre L1
}
}

esclave :

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

const int L1 = 2; // broche 2 du micro-contrôleur se nomme maintenant : L1
const int L2 = 3;
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
pinMode(L2, 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.println(x); // afficher ce chiffre sur l'interface serie
if(x == 1)
{
digitalWrite(L1, HIGH); // allumer L1



//test retour
Wire.beginTransmission(0); // Envoyer vers device #4
Wire.write(10); // Envoi un 10
Wire.endTransmission(0); // Arreter la transmission


}
if(x == 0)
{
digitalWrite(L1, LOW); // eteindre L1


//test retour
Wire.beginTransmission(0); // Envoyer vers device #4
Wire.write(11); // Envoi un 11
Wire.endTransmission(0); // Arreter la transmission


}
if(x == 2)
{
digitalWrite(L2, HIGH); // allumer L1
}
if(x == 3)
{
digitalWrite(L2, LOW); // eteindre L1
}
}

cordialement

master envoi donne a slave pour alumer led "ça fonctionne"

très bon début !

par contre j'essaye d'ajouter un retour mais là plus rien ne fonctionne

le master reste le master, le slave reste le slave :

  1. le master fait sa demande au slave en utilisant le fonction Wire.requestFrom()
  2. le slave reçoit la demande du maître dans la fonction Wire.onRequest()
  3. le slave envoie la réponse par Wire.write()
  4. le master vérifie l’existence d'une réponse par Wire.available()
  5. le master lit la réponse par Wire.read()