L'arche de Noé a été faite par un amateur, et le Titanic par des professionnels. Et un plombier professionnel voulait faire l'évacuation de l'évier de ma cuisine dans les tubes d'aération du vide sanitaire... Je ne fais pas forcément confiance aux professionnels.
Maintenant surcharger loop quand il y a des fonctions de type t.update, c'est pas terrible. Je pense que c'est à cela qu'il est fait allusion.
Pour moi, et tant que l'on ne m'a pas démontré le contraire, je pense que le calcul doit être fait d'un côté ou d l'autre, et cela revient presque au même. Si on a un calcul long à faire, que l'on bloque d'un côté ou de l'autre bloquera tout au final. Il faut gérer correctement l'ensemble.
L'essentiel (si les fonctions d'interruptions ne sont pas réentrantes) est que l'on ait fini le calcul de l'interruption avant un nouveau déclenchement.
Maintenant pour le programme en cours, il peut fonctionner en basse vitesse du moteur, et les conditions actives peuvent êtres plus nombreuse et donc rallonger le temps du programme et le faire bloquer. Mais dans ce cas on risque plus d'avoir une mesure fausse.
A basse vitesse, quelques ISR déborderont, mais à haute voit cela ne se voit pas, et quand on va vite, les ISR déborderont systématiquement et plus aucun temps n'est accordé à loop().
Pour le savoir, il suffit de mettre une sortie à HIGH en débit d'ISR, et à LOW en fin d'ISR. Avec un analyseur logique, on voit tout de suite si les ISR débordent. Sans analyseur à 10€ (petite pub pour placer ce produit fort utile dans ce type de situation), on peut utiliser LED_BUILTIN ou une autre led. Tant qu'elle ne brille pas fort, on a du temps dans loop. On arrive à la moitié du temps dans l'ISR si la led brille autant si on inverse son HIGH et son LOW.
En basse vitesse ce qu'il y a derrière
if (!reedVal) { //if reed switch is closed
est négligeable. Et ce doit être la majorité du temps. Si ce qu'il y a derrière est important et prend 10ms, tant qu'elle est faiblement appelée, cela ne se voit pas. Elle va manger 10 interruptions. Mais quand on tourne plus vite on ne peut plus manger ces 10 intervalles.
Il y a des choses quand même bizarres:
if (!reedVal) { //if reed switch is closed
On dirait que l'incrémentation se fait quand le relais est fermé. A priori, on devrait avoir une incrémentation sur un front et pas sur un niveau. Non?
Ca sert à quelque chose?
Si il ne faut pas que reedCounter soit négatif, c'est raté! Il manque une partie du programme. A priori pour un compteur d'impulsions, j'aurais pris un entier non signé.
Pas si on n'a pas fait avant la mesure du temps libre.