Fixer une variable

Bonjour

Je souhaite programmer un anémomètre à l'aide d'un interrupteur ILS (interrupteur à lames souples aussi appelé reed). J'ai bien mes valeurs de vitesse qui défilent dans le port série mais je souhaite envoyer la vitesse sur internet. Jusqu'ici, pas de problème. Le problème se pose quand j'accède à la page de mon serveur. En effet, vu que la vitesse n'est une valeur constante, la page n'arrive pas à charger car l'arduino veut toujour prendre la valeur la plus récente. Du coup, quand je souhaite accéder à ma page, l'arduino prend une valeur mais le temps qu'il l'affiche il prend la valeur la plus récente et du coup j'ai toujours le message d'erreur de mon navigateur. J'ai testé avec une valeur fixe (0) en ne fesant pas tournet mon anémomètre et la il me l'affiche.

Je voudrais donc savoir si il est possible de fixer une variable pour un certain temps.

Merci

// A simple web server that always just says "Hello World"

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 ethernet;

int compteurfm = 0;                                  // compteur de fronts montants
int nbrtour = 0;                                     // variable du nombre de tour
unsigned long compte_temps;                          // variable contenant le temps
int increm_temps = 1;     



void setup(){
{ 
  ethernet.setup(mac, ip, port);
}
{  pinMode (2, INPUT);
  attachInterrupt (0, anemometre, RISING);           // capteur de front montant
  Serial.begin(9600);                                // configuration de la transmission
}
}

  

void loop(){

   delay(1000);
   float vitesse = (((nbrtour/1.23)+0.93)*3.6);
  Serial.print(vitesse);           // calcul de la vitesse du vent et envoie sur serial
  Serial.println (" km/h");
  
  nbrtour = 0;
  
  compteurfm = 0;
  
  
  
  
  {
  if (ethernet.serviceRequest())
  {
    ethernet.print(vitesse);
    ethernet.respond();
  }
  delay(100);
}}

void anemometre()
{
  compteurfm++;
  if (compteurfm >4)
  {
    compteurfm = 0;
  }
  
  if (compteurfm == 4)    // car 4 fronts montants = 1 tour
  {
    nbrtour++;
  }
}

tahsc: j'ai toujours le message d'erreur de mon navigateur.

qui dit quoi ?

Qui dit temps d'attente dépassé.

Il faut enfait que je puisse actualiser ma variable vitesse au bout d'un certain temps pour pas que l'arduino l'actualise en permanence. J'ai essayé avec "delay()" mais sans succès.

bonjour, ton void anemometre() est appelé ou dans ton loop?

il faut stocker ta variable dans une autre via millis() par exemple. toutes les x millis, tu remets a jour cette variable et tu l'appelles via ethernet.print(vitesse);

En fait void anémomètre sert juste pour le attachInterrupt

Et j'ai pas trop compris ce que tu as dit : comment utilise t'on millis()?

merci

Personne ne peut m'aider?

ben on t'as donné des pistes, donc exploites les ;) millis() http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Rien compris à ton histoire de variable à fixer (fixer ???)

Est-ce que la valeur envoyée sur Serial est correcte?

Je pense que ce qu'il veut c'est que le taux de rafraichissement de sa variable soit plus long que celui de l'affichage de sa page internet.

C'est pourquoi il faut ralentir le calcul de la variable en introduisant un délay non bloquant pour le reste, d'ou l'utilisation de la fonction millis à mettre en oeuvre

;)

Bonjour et merci de vos réponses

Pour ceux qui n'ont pas compris c'est exactement ce que infobarque à dit : toutes les x millis, je voudrais remettre à jour ma variable vitesse.

J'ai donc essayé en utilisant Millis, mais dans mon port série, toutes les 15 secondes j'ai des valeurs de vitesse énormes qui apparaissent et ma page web ne ve toujours pas s'afficher. Je pense qu'il faudrais que je ferme le millis juste après "float vitesse = (((nbrtour/1.23)+0.93)*3.6);" mais si je fais sa, il me dit que vitesse n'est pas déclaré pour le serial.print et le ethernet.print .

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 ethernet;

int compteurfm = 0;                                  // compteur de fronts montants
int nbrtour = 0;                                     // variable du nombre de tour
unsigned long compte_temps;                          // variable contenant le temps
int increm_temps = 1;     
long interval = 15000; 
long previousMillis = 0;


void setup(){
{ 
  ethernet.setup(mac, ip, port);
}
{  pinMode (2, INPUT);
  attachInterrupt (0, anemometre, RISING);           // capteur de front montant
  Serial.begin(9600);                                // configuration de la transmission
}
}

  

void loop(){

    unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) {
   
    previousMillis = currentMillis;    
  delay(1000);
   float vitesse = (((nbrtour/1.23)+0.93)*3.6);
  Serial.print(vitesse);           // calcul de la vitesse du vent et envoie sur serial
  Serial.println (" km/h");
  
  nbrtour = 0;
  
  compteurfm = 0;
  
  
  
  
  {
  if (ethernet.serviceRequest())
  {
    ethernet.print(vitesse);
    ethernet.respond();
  }
  delay(100);
}}}

void anemometre()
{
  compteurfm++;
  if (compteurfm >4)
  {
    compteurfm = 0;
  }
  
  if (compteurfm == 4)    // car 4 fronts montants = 1 tour
  {
    nbrtour++;
  }
}

Comment faire?

Bonjour, Avant d'aller plus loin, il faut :

if(currentMillis - previousMillis > interval) {

une accolade fermante } et non

{
if (ethernet.serviceRequest())

comme dans ton programme

tu mélange un peu tout je pense.
le schéma est le suivant

on met à zéro le compteur vitesse et vitesse_stockage par exemple au départ
setup…
loop
si le temps est > à 15s on calcule la vitesse et on la stock dans une variable (vitesse_stockage par exemple)
et on appelle calcul vitesse vent
si le temps < 15s vitesse_stockage = vitesse_stockage

si on appelle via le navigateur
on affiche vitesse_stockage
fin loop

calcul vitesse vent…
fin calcul vitesse vent…
après, à toi de définir un temps de calcul et faire la conversion en fonction.
tu ne peux pas appeler une variable qui sert en calcul en permanence, sinon ca tourne en boucle, c’est ce qui se passe.
donc ton interruption ne sert pas à grand chose.

EDIT :
bien vu le { Icare :wink:

Merci je pense que c’est bon mais c’est juste ma fonction de calcul vitesse qui ne fonctionne pas

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 ethernet;

int compteurfm = 0;                                  // compteur de fronts montants
int nbrtour = 0;                                     // variable du nombre de tour
unsigned long compte_temps;                          // variable contenant le temps
int increm_temps = 1;     
long interval = 20000; 
long previousMillis = 0;

float calculVitesse(){
  
  (((nbrtour/1.23)+0.93)*3.6);
  
}

float vitesse = 0;
float vitessestok = 0;






void setup(){
{ 
  ethernet.setup(mac, ip, port);
}
{  pinMode (2, INPUT);
  attachInterrupt (0, anemometre, RISING);           // capteur de front montant
  Serial.begin(9600);                                // configuration de la transmission
}}


  

void loop(){

    unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) {
   
    previousMillis = currentMillis;    
  delay(1000);
   vitessestok=calculVitesse();
calculVitesse();}
  
  if(currentMillis - previousMillis < interval) {
   vitessestok = vitessestok; }
  Serial.print(vitessestok);           // calcul de la vitesse du vent et envoie sur serial
  Serial.println (" km/h");
  
  nbrtour = 0;
  
  compteurfm = 0;
  
  
  
  
   
  if (ethernet.serviceRequest())
{
    ethernet.print(vitessestok);
    ethernet.respond();
  }
  delay(100);
}

void anemometre()
{
  compteurfm++;
  if (compteurfm >4)
  {
    compteurfm = 0;
  }
  
  if (compteurfm == 4)    // car 4 fronts montants = 1 tour
  {
    nbrtour++;
  }
}

tu mets au pti bonheur la chance ton code?

prends un papier et un crayon fais ton diagramme pour y voir plus clair et aprè tu fais ton code, par ce que là............. faut te suivre

Le delay dans la boucle millis est perturbateur.

Le test if (currentMillis - previousMillis < interval) sert à quoi? Pour moi il est inutile car correspond au else du premier

Comme le dit infobarquee, pose d’abord ton process avant de faire n’importe quoi.

C’est bon tout fonctionne à merveille

Merci beaucoup pour votre précieuse aide :wink: