Bonjour
Pour mon projet centrale solaire, j'ai mis en place un échange I2C entre un Atmega1284P et un Atmega328P .
Pour cela j'utilise "receiveEvent et requestEvent" OK ca fonctionne.
L'atmega1284P et la carte Maitre, La carte avec l'atmega328P, et l'esclave. c'est une passerelle I2C RS485 pour communiqué avec les onduleurs et le transmetteur de puissance.
J'aimerai mettre en place un TIMEOUT sur les esclaves I2C. C'est a dire que si le maitre n'envoie rien au esclaves ou si la liaison I2C est interrompus, au bout de 2 secondes je monte un bit a "1".
j'utiliserai ce bit si il est a "1" pour arrêter la fonction serial.write(buff,len) et affiché le message d'erreur sur le LCD.
En revanche si la communication I2C reviens, le BIT repasse a "0" et l'esclave fait son boulot normalement.
Vous déclarez un unsigned long derniereCommunication; et un booléen qui sera votre drapeau bool communicationOK = true; et vous les maintenez à jour (derniereCommunication avec la valeur de millis() à chaque réception et passez le drapeau à true)
En début ou fin de loop vous faites
if (communicationOK && (millis() - derniereCommunication >= 2000ul)) {
communicationOK = false;
… // Affichage de l’erreur
}
Le Serial.write() ne devra être fait que si communicationOK est vrai