J'ai peut-être compris pourquoi les interruptions ne marchent pas : ce n'est pas un problème logiciel mais matériel !
Sur Arduino, les niveaux logiques sont particuliers (un peu différents de ceux de la TTL et du CMOS) :
Un niveau LOW correspond à une tension inférieure à 1,5V.
Un niveau HIGH correspond à une tension supérieure à 3V.
Dans votre test,
int etat=analogRead(canton);
if (etat>100) {
//un train est détecté la valeur lue est supérieure à 15
...
vous décrétez le niveau HIGH à 100 : en proportion sur 1024 pour 5V, 100 correspond à 0,5V. On est en plein dans la plage du niveau bas.
D'ailleurs je ne comprend pas bien à quoi correspond la valeur 15 dans le commentaire.
Ce que vous pouvez faire en analogique, en différenciant 2 tensions faibles, ne peut pas marcher en digital car il faut au moins 3V pour assurer le niveau haut.
Votre montage détecteur IR ne fournit peut-être jamais de niveau haut logique !!!
Cela peut provenir de plusieurs raisons :
- courant trop faible dans la diode émettrice
- distance trop grande entre la diode émettrice et le récepteur
- lumière parasite...
C'est pour cela que j'aime bien travailler en analogique avec ce type de détecteur, ce qui permet l'étalonnage comme je l'indique dans l'article.
Je pense aussi que les interruptions n'apportent pas grand chose dans ce type d'utilisation.
Qu'en pensez-vous ?