def Reception_Donnees_I2C():
global Hydrometrie, Temperature, Luminosite
Hydrometrie = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
Temperature = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
Luminosite = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
print Hydrometrie
print Temperature
print Luminosite
En faite, je récupère 3 variables en RF 433MHz via la carte Mega 2560 qui sont des données de température, d’hydrométrie et de luminosité de mes capteurs, je les stocke dans la mémoire de la 2560 et je l’envoie par I2C lorsque le maitre(PcDuino), le demande… Mais voila le problème, je reçoit en retour dans le terminal, une valeur qui ne correspond a rien qui est 5. J’ai vérifié a l’analyseur I2C, la carte 2560 envoi bien un 5 au lieu des valeurs qu’elle a en mémoire… Elle a bien les bonnes valeurs dans ses variables car je les récupères avec un serial.print et elles sont OK… Je n’y comprend plus rien…
Pouvez vous m’aider a trouver ce qui ne va pas dans mon code.
Re,
il y a une chose aussi, que j'ai retiré pour mes derniers tests mais, j'arrive bien à communiquer dans le sens PcDuino vers Arduino mais pas l'inverse...
j'ai envoyé une trame I2C de 2 octets, ce qui correspond à l'adresse de l'Arduino et un octet commandant un relais et cela fonctionne. Par contre, un wire.write depuis l'Arduino vers le Pc Duino me retourne des valeurs mauvaises...
Bjr,
Le capteur d'hydrometrie est inclus au capteur de temperature donc il devrait fonctionner ensemble... Sur l'arduino, j'ai bien les 3 valeurs qui sont envoyé avec ce morceau de code:
void requestEvent()
{
// Attends la demande du PcDuino pour envoyer les données en I2C
Wire.write(Hydrometrie);
Wire.write(Temperature);
Wire.write(Luminosite);
Serial.println("Envoi des donnees au PcDuino");
Serial.println(Hydrometrie);
Serial.println(Temperature);
Serial.println(Luminosite);
} // Fin du void requestEvent()
et coté PcDuino
def Reception_Donnees_I2C():
global Hydrometrie, Temperature, Luminosite
Hydrometrie = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
Temperature = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
Luminosite = i2c.read_byte(Pcb_Relayage) # Lit un octet sur la carte relayage
Serial.println(Hydrometrie)
Serial.println(Temperature)
Serial.println(Luminosite)
Par contre, je ne reçois que la dernière valeur qui est 79 (79% de luminosité) sur les 3 variables. et lorsque je regarde a l'analyseur réseau, le PcDuino fait bien sa demande de requête mais il apparait 0x4F qui correspond à 79, apres plus de 2mS après la requête... Je ne comprend plus rien...
En clair, j'envoie côté Arduino mes deux données d'un seul coup sous forme de String, avec un nombre de caractères fixes (12 au total) et je découpe cette chaine côté pcDuino.
J'ai fait ça pour des questions de performance: ça prend moins de temps de faire un envoi global plutôt que plusieurs envois séparés.
J’obtiens une seule valeur en sortie, celle ci est correcte, je n’avais pas bien mis l’adresse de l’esclave… Mais comment fait tu si tu as plusieurs esclave, juste avant de les utiliser, tu fais un open ?
sur mes 2 autres valeurs, j’obtiens ce message :
Bon, j'obtiens une liste de valeur coté pcduino comme celle ci
[73, 255, 255]
par contre, le 73 est la 3eme valeur envoyé par l'arduino et les 2 autres sont mauvaises...
j'utilise le code suivant cote PcDuino:
value = i2c.read(3) #Read 3 byte
print value
et cote arduino
void requestEvent()
{
Wire.write(Hydrometrie);
Wire.write(Temperature);
Wire.write(Luminosite);
Serial.println("Envoi des donnees au PcDuino");
Serial.println(Hydrometrie);
Serial.println(Temperature);
Serial.println(Luminosite);
} // Fin du void requestEvent()
Ca y est, c'est bon, j'ai bien le résultat voulu. Un grand merci pour l'aide que vous m'avez apporté...
Pour ceux à qui cela intéresse, je met mon code a disposition...
Coté Arduino:
#define Nombre_Octets_A_Recevoir 3
byte Temperature;
byte Luminosite;
byte Hydrometrie;
byte Data[Nombre_Octets_A_Recevoir];
...
void setup()
{
Wire.begin(Adr_PCB_Relayage); // Active I2C en esclave
Wire.setClock(200000L); // Configure la vitesse a 200 kHz comme le PcDuino
Wire.onReceive(receiveEvent); // register event
Wire.onRequest(requestEvent); // register event
...
}
void requestEvent()
{
Data[0] = Hydrometrie;
Data[1] = Temperature; // double sur 4 octets
Data[2] = Luminosite;
Wire.write(Data,Nombre_Octets_A_Recevoir);
Serial.println("Envoi des donnees au PcDuino");
Serial.println(Data[0]);
Serial.println(Data[1]);
Serial.println(Data[2]);
} // Fin du void requestEvent()
Coté PcDuino:
def Reception_Donnees_I2C():
global Hydrometrie, Temperature, Luminosite, value
value = i2c.read(3) #Read 3 bytes
print value