Bonjour,
Je fait communiquer deux Arduino sur un bus i2c dans le but de récupérer 2 valeurs (celles de deux sondes de température).
Quand je reçois sur le maitre les caractères d'une seule sonde ça fonctionne impec :
15:46:42.272 -> Valeur reçue de sonde 1: 15.13
Mais quand je reçois sur le maitre les caractères des deux sonde (que je fait appel à ma fonction i2c_data() une seconde fois enfaite) j'ai des caractère curieux que je ne souhaite pas :
15:48:50.401 -> Valeur reçue de sonde 1: 15.13□⸮
15:48:51.412 -> Valeur reçue de sonde 2: 14.93□⸮
CODE MASTER :
void loop()
{
i2c_data(I2C_SLAVE_CHEMINEE, 1, 5);
delay(1000);
i2c_data(I2C_SLAVE_CHEMINEE, 2, 5); // EDIT POUR LE FORUM : si je ne fait appel à cette fonction qu'une fois cela ne m'affiche pas les caractère en plus
delay(1000);
}
String i2c_data(int slave, int code, int size)//(adresse esclave, code pour pointer la bonne sonde, nombres d'octets)
{
Wire.beginTransmission(slave); // envoie du code au slave précisé en amont pour pointer vers la sonde voulu
Wire.write(code); //code
Wire.endTransmission();
Wire.requestFrom(slave, size); // envoie d'une requête au slave de transmettre x* octet (*donné par size)
Serial.print("Valeur reçue de sonde ");Serial.print(code);Serial.print(": ");
int i = 0;
char str[size];
while(Wire.available())
{
str[i] = Wire.read();
i++;
}
Serial.print(str);
Serial.println("");
return str;
}
CODE SLAVE :
void receiveEvents(int numBytes)
{
pointeur_i2c = Wire.read();
}
void requestEvents()
{
if(pointeur_i2c == 1)
{
Serial.print(" - requête pour t1 reçue - ");
Serial.print("Temperature envoyée : ");
char send[7]; // création de la variable qui contiendra le resultat 6 caractères + le \n
dtostrf(temperature1, 5, 2, send);// conversion de la valeur de float à char;
Serial.println(send);
Wire.write(send);
pointeur_i2c = 0;
}
if(pointeur_i2c == 2)
{
Serial.print(" - requête pour t2 reçue - ");
Serial.print("Temperature envoyée : ");
char send[7]; // création de la variable qui contiendra le resultat 6 caractères + le \n
dtostrf(temperature2, 5, 2, send);// conversion de la valeur de float à char;
Serial.println(send);
Wire.write(send);
pointeur_i2c = 0;
}
}
J'ai trouvé :
À la fin de la réception, il faut mettre un 0 dans le dernier élément pour terminer la chaine de caractères.
int i = 0;
char str[size+1];
while(Wire.available())
{
str[i] = Wire.read();
i++;
}
str[i]='\0';
Mais ça ne répond pas à la question : Pourquoi cela fonctionnait il lorsque la fonction n'était appelée qu'une fois ?