j'ai récupéré un code (capteur de pression atmosphérique ...)
que j'ai modifié pour pouvoir afficher la pression sur 11 leds entre haute et basse pression
une sorte de barregraphe ... cela marche ...
mais j'aurais aimé aussi pouvoir détecter un changement de pression ...
si pendant un interval de temps si la pression diminue ou augmente ...
sur 2 autres leds ...
j'ai mis 30 min comme période (eventime1) et en utilisant millis()
mais cela ne marche pas a priori ...
en modifiant ma valeur (evenTime1) j'ai pu voir que les valeurs
previousTime1 et currentTime etait toujours identiques ...
en principe cela ne devrait pas
y a un bug mais je ne vois pas ou
ah j'ai peut être trouvé quelque chose ^^
c'est que j'utilise 4 if a la suite en repetant 4 fois previousTime1 = currentTime;
mon code était trop long
j'ai mis uniquement la fonction concernée par le problème et non tout le code
je réutilise la variable "pression" gérée par une autre fonction.
Bonjour, si je comprend bien tu es dans une fonction qui est appelée depuis la loop. En fait en plus d'avoir plusieurs fois le même if (ce qui n'est pas un bug mais inutile) ça sera toujours vrai car a l'appel de cette fonction previous time est initialisé a 0 et currenttime le temps en millisecondes depuis le démarrage du programme, avec un delay de 2000 ça sera certainement toujours > a 5000.
Pour attendre 30min, il faut que eventtime soit égal a 30601000 millisecondes.
Deux corrections donc :
initialiser previoustime dans la loop, passer par reference dans la fonction, mettre a jour la valeur
Il faudrait voir comment est appelé changmtPression(), on peut supposer qu'il est appelé périodiquement.
Il faut donc que previousTime1 soit déclaré static si on veut que sa valeur persiste entre les différents appels idem pour previousPression.
int lectureCapteur ()
{
//Read values from the sensor:
pressure = bmp.readPressure();
temperature = bmp.readTemperature();
pressionCap = ((((pressure)/pow((1-((float)(ELEVATION))/44330), 5.255))/100.0))/1.001862;
//Print values to serial monitor:
//Serial.print("Pressure: ");
//Serial.print(pressure, 2);
//Serial.print(" Pa");
//Serial.print("\t");
Serial.print(("Temp: "));
Serial.print(temperature/1.05);
Serial.print(" oC");
Serial.print("\t");
Serial.print("Sea Level Pressure ~ ");
Serial.print(pressionCap, 2);
Serial.println(" hPa");
// delay(2000); //Update every 5 sec
return pressionCap;
}
dans mon code void changmtPression ()
au debut, apres déclaration des variables je mets
currentTime = millis();
previousPression = pressionCap;
donc si je retourne pressionCap et que je la mémorise dans previousPression
si je ne me trompe pas a chaque tour de boucle loop () ...
previous pression et pressionCap sera toujours identique ...
je ne vois pas comment faire concrètement pour la memeoriser
cela marche mieux
mais j'ai encore un tout petit problème ... que je ne comprend pas ...
je rappelle ce que je souhaite faire
pouvoir comparer sur une plage de temps la pression mémorisée ...
... la comparer à la mesure de pression du capteur
et allumer une led (ledDpression si pression diminue de 0.3 pendant la plage de temps)
ou ledPression si la pression augmente de 0.3 pendant la plage de temps ...)
mais j'ai la led ledDression qui reste allumée au démarrage du programme ...
j'ai envoyé l'etat des mes variables et lecture des sorties sur moniteur serie ...
la j'ai pressionCap = 1021.582 et memoirePression = 1021.641
"memoirePression - pressionCap n'est pas supérieur a 0.3
je comprend pas pourquoi la ledDpression reste allumée
ca ne devrait pas si la pression est stable ...
Merci
const char ledPb5= 2;
const char ledPb4= 3;
const char ledPb3= 4;
const char ledPb2= 5;
const char ledPb1= 6;
const char ledPm= 7;
const char ledPh1= 8;
const char ledPh2= 9;
const char ledPh3= 10;
const char ledPh4= 11;
const char ledPh5= 12;
const char ledPpression= 0;
const char ledDpression= 1;
#include <Wire.h>
#include "SPI.h" //Why? Because library supports SPI and I2C connection
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
//Setup connection of the sensor
Adafruit_BMP280 bmp; // I2C
// Variables capteur pression
float pressure; //To store the barometric pressure (Pa)
float temperature; //To store the temperature (oC)
float pressionCap;
int ELEVATION = 18; //PUT HERE THE ELEVATION OF YOUR LOCATION IN METERS
// variable pour gerer le temps + pression
static float memoirePression = pressionCap;
unsigned long currentMillis;
static long previousMillis = 0;
long interval = 3600000; // 1 heure
void setup()
{
bmp.begin(); //Begin the sensor
Serial.begin(9600); //Begin serial communication at 9600bps
pinMode(ledPb5, OUTPUT);
pinMode(ledPb4, OUTPUT);
pinMode(ledPb3, OUTPUT);
pinMode(ledPb2, OUTPUT);
pinMode(ledPb1, OUTPUT);
pinMode(ledPm, OUTPUT);
pinMode(ledPh1, OUTPUT);
pinMode(ledPh2, OUTPUT);
pinMode(ledPh3, OUTPUT);
pinMode(ledPh4, OUTPUT);
pinMode(ledPh5, OUTPUT);
pinMode(ledDpression, OUTPUT);
pinMode(ledPpression, OUTPUT);
}
void loop()
{
currentMillis = millis();
lectureCapteur();
gererTemps();
affichPression ();
affichSerie();
}
int gererTemps ()
{
if((currentMillis >= 0) && (currentMillis <= 500))
// si temps au demarrage du programme compris entre 0 et 500 -> memorisation de la pression
{
memoirePression = pressionCap;
}
if(currentMillis - previousMillis >= interval)
// si interval atteint -> ecriture temps actuel dans temps precedant + memorisation pression
{
previousMillis = currentMillis;
memoirePression = pressionCap;
}
while( currentMillis - previousMillis > 500 )
// tant que Temps actuel - Temps precedant > 500ms ...
{
if( memoirePression - pressionCap > 0.3 )
{
digitalWrite(ledDpression, HIGH);
}
if( memoirePression - pressionCap < 0.3 )
{
digitalWrite(ledDpression, LOW);
}
if( memoirePression + pressionCap > 0.3 )
{
digitalWrite(ledPpression, HIGH);
}
if( memoirePression + pressionCap < 0.3 )
{
digitalWrite(ledPpression, LOW);
}
if(( memoirePression + pressionCap < 0.3 ) || ( memoirePression - pressionCap < 0.3 ))
{
break;
}
}
}
int lectureCapteur ()
{
//Read values from the sensor:
pressure = bmp.readPressure();
temperature = bmp.readTemperature();
pressionCap = ((((pressure)/pow((1-((float)(ELEVATION))/44330), 5.255))/100.0))/1.001862;
delay(2000); //Update every 5 sec
return pressionCap;
}
mais sinon j'ai vu un autre truc ^^
c'est que j'utilisais les sortie D0 et D1 pour ces leds ...
et j'ai vu que c'est lé a la communication serie Rx et Tx
donc je comprend pourquoi j'avais des choses bizarres sur le moniteur serie
a la place j'ai utilisé 2 sorties analogique en tout ou rien ...
merci