Question sur les interruptions et l'envoi de données web

Question sur les interruptions dans un programme de station météorologique avec interruptions pour pluviomètre et anémomètre /

Mon programme remplit une adresse IP sur mon réseau local. Malheureusement, j'ai perdu quelques informations sur le pluviomètre, je n'ai pas trouvé la cause, mais en augmentant le temps de rafraîchissement, j'ai réalisé que ce problème venait de l'occupation du processeur et que même en ayant ces 2 interruptions, ça ne protégeait pas moi de la perte d'information tout en actualisant les données sur Ethernet.
Quelqu'un at-il une expérience de ce problème ????

Ci-joint le morceau provocateur de code ces erreurs:

void writeResponse (EthernetClient & client, JsonObject & json) {
client.println ("HTTP / 1.1 200 OK");
client.println ("Content-Type: application / json");
client.println ("Connexion: fermer");
client.println ("Refresh: 5"); // rafraîchit la page automatiquement toutes les 60 secondes
client.println ();

json.prettyPrintTo (client);
}

hello
si je comprends ton problème:
pendant l'envoi de ta trame, s'il y a interruption, tu perds des données.

Pourquoi ne pas interdire les interruptions pour la durée de l'envoi?

capter l'intensité de la pluie ou du vent nécessite t'il que ce soit fait sur interruption?

je suppose que tu veux le faire cycliquement, mais ce ne doit pas être au millionième de seconde.

Le bug est ligne 42 et il me semble que votre fil rouge est mal câblé...

enfin c’est ce que je vois

:slight_smile:

Blague à part... vous pensez nous avoir donné assez d’info?

Je ne veux perdre aucun des basculements du pluviomètre, je voudrais éventuellement que le rafraîchissement des données web soit légèrement décalé, s'il il y une impulsion vers basculement du pluviomètre sinon je perds 0.23 mm de pluie....
Je n'ai pas mis tout mon car il est trop lourd..... mais possible en pièces jointes....??

il n'est pas possible de prévoir à l'avance quand va avoir lieu l'interruption.
donc pas possible de différer l'envoi de la chaine

client.println ("Refresh: 5"); la c'est toutes les 5 secondes que tu "rafraichit" ta page, non ?

et pourquoi ne pas "rafraichir ta page que après une interruption

Oui if faut que je creuse de ce coté

L’interruption va interrompre la partie web donc je ne suis pas sûr de quel est votre problème.

Quand vous arrivez à la demande web, faites une section critique ou vous dupliquez les variables utilisées dans l’ISR et remettez le compteur à zéro puis sortez de la section critique et utilisez la copie des données pour votre page web. Utilisez aussi les techniques AJAX pour minimiser le flux vers votre page web.

S'il s'agit d'un pluviomètre à augets basculants comme les modèles J Richard, la détection peut se faire lors de la bascule, avec une brève interruption (qu'il ne faut pas rater au passage), mais aussi par la présence/absence de l'auget en position basculée de l'un ou l'autre des deux cotés, cet état n'est pas un transitoire donc ça laisse le temps de le mesurer.

En fait je ne comprenais pas pourquoi je perdais un certain nombre de bascule d'augets.... et en augmentant le temps de refresh à 60s, je me suis rendu compte que je ne les perdais pas...
Dans mon code j'ai 2 interruption une pour l’anémomètre et une pour le pluviomètre.
Est-ce que le changement d'ordre de ces 2 interruptions permettrait d’être plus fiable pour le pluviomètre??

Je pensais que le refresh était interrompu par une interruption ce qui ne semble pas être le cas. J'ai l'impression que le processeur termine son refresh avant de pendre en compte l'interruption...

Je joins mon code en PJ..

Je ne reçois pas les notifications des réponses, bien que j'ai coché cette option???

point de code

mon code

AWS_Basic_Web_Server_Json__variables_V3.5.ino.ino (13.8 KB)

ICI tu trouveras ce qui suit

Notes and Warnings
Note
Inside the attached function, delay() won’t work and the value returned by millis() will not increment. Serial data received while in the function may be lost. You should declare as volatile any variables that you modify within the attached function. See the section on ISRs below for more information.

ou sur GG, tu tapes "interruption et millis()"...

dans tes "isr", incrémente ton compteur et traite le résultat dans le reste du code

Merci pour ta réponse...

Aujourd'hui j'ai beaucoup de vent, les pertes de données du pluviomètre sont fréquentes...
Je vais essayer d'inverser les interruptions entre le pluviomètre et l’anémomètre, car si j'ai bien compris, l'interruption sur le digital 2 est prioritaire par rapport au 3.

Peux-tu me dire le rôle réel de cli(); et de sei(); Servent-ils bien à permettre une réinitialisation du Timer1, et si c'est le cas quel doit être la fréquence de réinitialisation.

Je les utilise comme ceci:

attachInterrupt(digitalPinToInterrupt(Pluvio_Pin), isr_rg, FALLING);
attachInterrupt(digitalPinToInterrupt(WindSensor_Pin), isr_rotation, FALLING);

cli();// Disable Interrupts
// Setup the timer intterupt for 0.5 second
Timer1.initialize(500000);
Timer1.attachInterrupt(isr_timer);

sei();// Enable Interrupts

dfgh:
dans tes "isr", incrémente ton compteur et traite le résultat dans le reste du code

C'est bien ce que je fais ici si je ne trompe pas???

// Interruption du gestionnaire de routine qui est déclenchée lorsque l'on détecte de la pluie
void isr_rg() {
if ((millis() - contactTime) > 3 ) { // Déclenchement du signal du Pluviometre
contactTime = millis();
}
}

// interrupteur pour incrementer le nombre de rotation pour la vitesse du vent
void isr_rotation () {
if ((millis() - contactBounceTime) > 15 ) { // Déclare le contact valide de l'interrupteur pour la vitesse du vent
rotations++;
contactBounceTime = millis();
}
}

void isr_rotation ()
{
rotations++; //ici, l'isr sera la plus courte possible
}

et dans le code

if (rotation>0){

if ((millis() - contactBounceTime) > 15 ) { // Déclare le contact valide de l'inter pour la vitesse du vent

contactBounceTime = millis();rotation=0;
}
}

pendant que ton prg est dans l'isr, il peut s'en passer des choses, donc l'isr le plus courte possible.
pas de calcul ou de comparaison.
et dans l'isr, pas de millis() non plus.

cli(); interdit les interruptions
ensuite tu initialises ton timer, puis tu "attaches" ton "isr_timer"
sei(); autorise les interruptions

en faisant comme cela, tu te mets à l'abri d'un appel de l'isr pendant que tu l'initialises.

Merci pour ta réponse, je ne pensais pas que l'on puisse autant réduire le code de l' ISR...

Je m'y mets de ce pas....