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++;
}
}
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);
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
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++;
}
}
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.
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++;
}
}