Pourquoi ne suis-tu pas le conseil de J-M-L ? Tu réactives tes interruptions bien trop tard !
Par ailleurs ta gestion du temps est complètement fausse.
Ce qui est important, c'est que ta fonction loop() dure un temps précis.
Au départ, tu avais mis 3000 ms.
Cette valeur a une influence sur ta formule de calcul des vitesse :
vitessems=2 * 3.1415 * 0.09 * nbtour;
le coefficient 0.09 est valable pour une certaine durée de la loop().
Tu comptes les interruptions (=le nombre de 1/2 tours) pendant une durée T.
Pour une vitesse de vent donnée, plus T est grand, plus le comptage est grand.
Il convient donc de t'assurer que ce coefficient 0.09 correspond bien à un comptage sur 3 secondes, sinon tu vas obtenir une vitesse, certes, mais erronée.
J-M-L te suggère d'utiliser millis() à la place de delay(). Pourquoi ?
C'est justement pour avoir une cadence de mesure précise.
Donc toute ta boucle loop doit être encadrée par:
unsigned long tprecedent = 0;
void loop()
{
unsigned long tnow= millis();
unsigned long dt = tnow - tprecedent;
if ( dt >= 3000L )
{
tprecedent= tnow;
//
// refaire le calcul du cofficient (0.09) en utilisant dt (qui peut être supérieur à 3000)
...
vitessekm = 2 * 3.1415 * Coefficient_recalculé * nbtour;
// faire diverses choses, selon la vitesse; y compris des attentes par delay() ou tone(...)
// en prenant soin de ne pas dépasser 3 secondes
...
}
}
Nota: il conviendrait également de sauter le 1er comptage, car on ne sait pas combien de temps ce 1er comptage a duré.