Bravo !
Bon, petite explication :
Les barrières doivent se fermer après une attente de quelques secondes. Si je teste uniquement l'état de la zone, je ne fais que relancer le démarrage du délai d'attente. Donc, je ne vais faire démarrer ce délai d'attente que lors de la première fois que je me rends compte que la zone est occupée. Pour cela, je regarde s'il y a transition de la valeur d'occupation sur la zone. C'est ce que font les quelques lignes de code que tu sembles ne pas avoir comprises. J'espère que maintenant, tout est clair.
Dans l'article, j'avais expliqué mais ce n'était peut-être pas aussi clair :
La fonction loop n’est pas compliquée à comprendre. Elle surveille l’état de la zone PN et agit en conséquence. Si la zone PN est libre, il suffit d’arrêter le clignotement des feux et d’ouvrir les barrières. Si la zone PN est occupée, son état passe de false à true et il faut alors faire l’inverse et fermer les barrières. Or on veut attendre un petit délai avant de fermer les barrières, c’est pourquoi on compare l’état de la zone avec son état précédent de manière à lancer l’attente que s’il y a eu changement d’état. Si on ne faisait pas cela, alors on relancerait indéfiniment le délai à attendre et il ne serait jamais terminé pour manœuvrer les barrières. Le mouvement des barrières est obtenu grâce à la méthode write(posServo).
Je vais regarder ton code mais il ressemble déjà plus à ce que j'avais publié.
Pour résumer, tout fonctionne comme tu le souhaites avec en plus ce petit rebond des barrières que permet SMS, c'est bien cela ?
Tu vas pouvoir tester les cas particuliers : refoulement, circulation dense, etc. mais je pense que tu ne devrais pas avoir de problème sauf cas très particulier qui serait par nature non réaliste.
Bravo pour ta persévérance.