comment procéder pour que le maître demande l’état des pin à ou aux l'esclave(s)
ex : maitre demande a esclave quel est l'etat de la pin 11 ------> slave repond ma pin 11 est High (1) ou low (0)
actuellement j'arrive a demander a l'esclave de mettre des pin a l’état High (1) ou low (0) comme ceci :
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
}
}
#include <Wire.h>
const int L3 = 3;
void setup()
{
Wire.begin(); // Rejoindre le bus I2C (Pas besoin d adresse pour le maitre)
pinMode(L3, OUTPUT);
Serial.begin(9600); // Demarrer la liaison serie avec le PC
}
void loop()
{
//contenu du programme
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(1); // Envoi un 1
Wire.endTransmission(); // Arreter la transmission
delay(500); // Attendre 1s
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(2); // Envoi un 1
Wire.endTransmission(); // Arreter la transmission
delay(500); // Attendre 1s
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(0); // Envoi un 0
Wire.endTransmission(); // Arreter la transmission
delay(500); // Attendre 2s
//test
Wire.beginTransmission(4); // Envoyer vers device #4
Wire.write(3); // Envoi un 0
Wire.endTransmission(); // Arreter la transmission
delay(500); // Attendre 2s
Wire.requestFrom(4, 2); // request 6 bytes from slave device #2
while(Wire.available()) // slave may send less than requested
{
char c = Wire.read(); // receive a byte as character
Serial.print ("c= ");
Serial.println(c); // print the character
if (c == 'A'){
digitalWrite(L3, HIGH);
delay(1000);
}
else{
digitalWrite(L3, LOW);
}
}
delay(100);
}
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
Wire.onRequest(requestEvent); // register event
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
}
}
void requestEvent()
{
int x = Wire.read(); // recevoir un chiffre
if( x== 0){
Wire.write('10'); // respond with message of 2 bytes
// as expected by master
}
if( x== 1){
Wire.write('11'); // respond with message of 2 bytes
// as expected by master
}
if( x== 2){
Wire.write('12'); // respond with message of 2 bytes
// as expected by master
}
if( x== 3){
Wire.write('13'); // respond with message of 2 bytes
// as expected by master
}
}
Déjà ton maitre ne fait pas de request donc c'est sûr que ton esclave ne répondra jamais ...
Ensuite deux solutions : soit tu renvoi l'état de tous tes pins sur une request et c'est le maitre qui fait le tri, soit tu fais un write() pour lui grosso modo "hey quand je vais te faire une request, renvoi moi le pin n°X" et la tu fais une request et tu renvoi l'état du pin x
Wire.requestFrom(4, 1); // request 6 bytes from slave device #2
while(Wire.available()) // slave may send less than requested
{
int c = Wire.read(); // receive a byte as character
Serial.print ("c= ");
Serial.println(c); // print the character
if (c == 9){
digitalWrite(L3, HIGH);
delay(1000);
}
else{
digitalWrite(L3, LOW);
}
}
delay(500);
}
esclave :
void requestEvent()
{
int x = Wire.read(); // recevoir un chiffre
buttonState = digitalRead(bouton1);
if (buttonState == HIGH) {
Wire.write(9);
}
}
y a t'il une solution plus simple ? ou plus efficace """"pour debutant """"
slave.ino: In function 'void setup()':
slave.ino:14:28: error: invalid conversion from 'void ()()' to 'void ()(int)' [-fpermissive]
In file included from slave.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:67:10: error: initializing argument 1 of 'void TwoWire::onReceive(void ()(int))' [-fpermissive]
void onReceive( void ()(int) );
^
slave.ino: In function 'void receiveEvent()':
slave.ino:37:18: error: 'pinToSend' was not declared in this scope
slave.ino: In function 'void requestEvent()':
slave.ino:47:28: error: 'pinToSend' was not declared in this scope
invalid conversion from 'void ()()' to 'void ()(int)' [-fpermissive]
slave.ino: In function 'void setup()':
slave.ino:13:28: error: invalid conversion from 'void ()()' to 'void ()(int)' [-fpermissive]
In file included from slave.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:67:10: error: initializing argument 1 of 'void TwoWire::onReceive(void ()(int))' [-fpermissive]
void onReceive( void ()(int) );
^
invalid conversion from 'void ()()' to 'void ()(int)' [-fpermissive]