Yes ... just use ...
RequestTemperatures ();
GetTempCByIndex ();
and Drop GetAddress and Bitmap.setresolution calls.
I still don't think you need to keep the wind speed in real time.
The Isr_rotation routine continues to increment the rotations in proportion to the wind speed.
The Isr_timer routine marks 2.5 seconds of interval (5 interruptions of half a second) to see how many rotations occurred in that time frame.
How about storing the number of rotations that happened in the last 2.5 second interval and keeping it in real time instead of calculating the wind rotations * 1.448406. This is a timely floating-point calculation and takes too much time, you don't really need to spend every 2.5 seconds. Thus, change the volatile float varaiable to another unsigned volatile intervalRotationCount int. Now in the isr_timer you can simply move the rotations to IntervalRotationCount after 5 interruptions instead of doing the floating-point calculation.
When you are ready to actually need wind speed inside the loop just calculate before using it.
Wind speed = IntervalRotationCount * 1.448406;
Now your processor may have more time to actually capture the rain events. But it is just a suggestion.
In the rare case that you are actively servicing isr_timer and you get a pin3 change, interrupts have been disabled by the prior interrupt and you will miss the event.
You can add sei() to the start of isr_timer to prevent this. Worst case you might alter your wind speed by a fraction but they are not that accurate anyway as wind is not stable anyway.
Question... Do you need a pullup on pin 3?
============================================= Translated --> Traduit
Oui ... juste utiliser ...
RequestTemperatures ();
GetTempCByIndex ();
et Drop GetAddress et Bitmap.setresolution appels.
Je ne pense toujours pas que vous devez garder la vitesse du vent en temps réel.
La routine Isr_rotation continue d'incrémenter les rotations proportionnellement à la vitesse du vent.
La routine Isr_timer marque 2,5 secondes d'intervalle (5 interruptions d'une demi-seconde) pour voir combien de rotations ont eu lieu pendant cette période.
Que diriez-vous de stocker le nombre de rotations qui se sont produites dans le dernier intervalle de 2,5 secondes et de le garder en temps réel au lieu de calculer les rotations du vent * 1.448406. C'est un calcul en temps réel à virgule flottante et prend trop de temps, vous n'avez pas vraiment besoin de passer toutes les 2,5 secondes. Ainsi, modifiez le flottant volatil varaiable à un autre intervalRotationCount int volatile non signé. Maintenant, dans l'isr_timer, vous pouvez simplement déplacer les rotations vers IntervalRotationCount après 5 interruptions au lieu de faire le calcul en virgule flottante.
Lorsque vous êtes prêt à réellement avoir besoin de la vitesse du vent dans la boucle, calculez juste avant de l'utiliser.
Vitesse du vent = IntervalRotationCount * 1.448406;
Maintenant, votre processeur peut avoir plus de temps pour capturer les événements de pluie. Mais ce n'est qu'une suggestion.
Dans les rares cas où vous entretenez activement isr_timer et que vous obtenez un changement de pin3, les interruptions ont été désactivées par l'interruption précédente et l'événement vous manquera.
Vous pouvez ajouter sei () au début de isr_timer pour éviter cela. Dans le pire des cas, vous pourriez modifier la vitesse de votre vent d'une fraction, mais ils ne sont pas si précis que cela car le vent n'est pas stable de toute façon.
Question ... Avez-vous besoin d'un pullup sur la broche 3?