Plusieurs actions simultanées

Bonjour,

Tout nouveau sur le forum et débutant en arduino, je sollicite votre aide sur le petit bous de code ci-dessous.

Je vous explique mon objectif :

  • je souhaite comparer deux prise de valeur d'une photorésistance l'intervalle entre les deux mesure est définie par la valeur d'un potentiomètre qui vas de 0 à 1023.
    Si la valeur de la seconde mesure est supérieure à la valeur de la première mesure plus une marge définie dans la variable Delta alors je réalise une action X.
    Je souhaiterais que la valeur "delta" soit incrémentée ou décrémenté par un bouton Plus et un bouton moins.

Mon problème :
le code ci-dessous fonctionne.
toutefois, si j'augmente le delais entre deux mesure à par exemple 1 seconde, j'utilise delay(valpot) durant tout la seconde qui s'écoule, impossible d'utiliser les bouton + ou - pour régler mon delta.
J'ai lu et essayé sans succès de remplacer mon delay en utilisant des temps mais je n'arrive pas à m'en sortir.

Auriez vous une idée ?

Merci par avance.

int EntreeRes = 0; // Connection de la résistance de 10K pour le pulldown port a0
int ValeurINIT; // variable de stockage de la valeur de la Photorésistance
int ValeurCOMP; // variable de stockage de la valeur de la Photorésistance à comparer avec ValeurINIT
int Potar = 2;    // Potentiomètre sur le port digital 0
int ValPotar = 0;       // variable de stockage de la valeur du Potentiomètre

int delta = 10; // Marge de tolérance de la Photorésistance devrai être réglée via BtPlus ou BTMoins
int pos=0;


const int BPPlus = 3; // broche 3 du micro-contrôleur se nomme maintenant : BP 
const int BPMoins = 4; // broche 4 du micro-contrôleur se nomme maintenant : BP 





void setup(void) {
    Serial.begin(9600);
    pinMode(BPPlus, INPUT); // BP est une broche d'entree
      pinMode(BPMoins, INPUT); // BP est une broche d'entree 

  
  
}
void loop(void) {
 
PlusMoins();
Potar();
LectureINIT();     


}


void PlusMoins() {

 

int tplus = digitalRead(BPPlus ); // Lecture de l'entree BP et sockage du résultats dans test 
if(tplus==HIGH) // Si test est à l'état bas 
{ 
Serial.println ("PLUS"); 
delta = delta+1;
Serial.print ("Delta actuel : "); 
Serial.println (delta);
 
} 


int tmoins = digitalRead(BPMoins ); // Lecture de l'entree BP et sockage du résultats dans test 
if(tmoins==HIGH) // Si test est à l'état bas 
{ 
Serial.println ("MOINS"); 
delta = delta-1;
Serial.print ("Delta actuel : ");
Serial.println (delta); 

} 
}



void Potar() {

ValPotar = analogRead(Potar);    // Lecture du Potentiomètre
  Serial.print("Valeur1 Potar = ");
  Serial.println(ValPotar ); //Utilisable pour un delay…
}


void LectureINIT(){
  
 

  ValeurINIT = analogRead(EntreeRes)+delta;  //Lecture de la photorésistance et affectation à val
  Serial.print("Valeur de référence = ");
  Serial.println(ValeurINIT); // the raw analog reading


delay(ValPotar);


ValeurCOMP = analogRead(EntreeRes);  //Lecture de la photorésistance et affectation à val 
Serial.print("Valeur de comparaison = ");
  Serial.println(ValeurCOMP ); // the raw analog reading


if (ValeurCOMP > ValeurINIT) {

Serial.println ("TEST....");

}

}

Bonjour,

Je te conseille de te pencher sur les interruptions du Timer 1, tu devrais y trouver ton bonheur. Grossièrement, c'est un timer que tu règles à une certaine valeur et auquel tu indique d'appeler une méthode lorsque il s'est écoulé.

Tu peux ainsi gérer le reste de ton programme sans t'en soucier.

À plus,

--
N.

Le problème, c'est l'utilisation de delay() qui est une fonction bloquante.
Pour contourner ce problème, il faut faire des temporisation non bloquante en utilisant la fonction millis() .
Un bon exemple est disponible dans l'IDE arduino c'est BlinkWithoutDelay

Autrement un autre exemple là Commande on_for - #25 by fdufnews - Français - Arduino Forum, mais d'un abord peut être plus compliqué.

Il y a aussi cette librairie [Lib] SoftTimer - Une lib pour faciliter les taches périodique ou liées au temps - Réalisations et Projets Finis - Arduino Forum

Merci pour vos réponse.
j'ai donc refais un essai cela fonctionne :slight_smile:

j'ai compris mon problème. je travaille sur un simulateur (SIM) et la notion de (ms) n'est pas compté pareil ?!? du coup en fait 1000ms dans le programme c'est plus ou moins 15 secondes....
J'ai téléversé le programme sur l'arduino lui même et tout marche....

Au cas ou voici mon petit code que je vais améliorer.

int EntreeRes = 0; // Connection de la résistance de 10K pour le pulldown port a0
int ValeurINIT; // variable de stockage de la valeur de la Photorésistance
int ValeurCOMP; // variable de stockage de la valeur de la Photorésistance à comparer avec ValeurINIT
int Pot = 2;    // Potentiomètre sur le port digital 0
int ValPotar = 0;       // variable de stockage de la valeur du Potentiomètre
int led = 13;

int delta = 10;

int pos=0;


long previousMillis = 0;        // will store last time LED was updated
long interval = 0;           // interval at which to blink (milliseconds)



const int BPPlus = 3; // broche 3 du micro-contrôleur se nomme maintenant : BP 
const int BPMoins = 4; // broche 4 du micro-contrôleur se nomme maintenant : BP 



unsigned long currentMillis;
unsigned long temps;
unsigned long lastTemps;



void setup() {
    Serial.begin(9600);
    pinMode(BPPlus, INPUT); // BP est une broche d'entree
      pinMode(BPMoins, INPUT); // BP est une broche d'entree 
       pinMode(led, OUTPUT); 

  
  
}
void loop() {
 
  currentMillis = millis();
 

// temps = millis();
// Serial.print (temps); 



PlusMoins();
Potar();

LectureINIT();     


}


void PlusMoins() {

 

int tplus = digitalRead(BPPlus ); // Lecture de l'entree BP et sockage du résultats dans test 
if(tplus==HIGH) // Si test est à l'état bas 
{ 
Serial.println ("PLUS"); 
delta = delta+1;
Serial.print ("Delta actuel : "); 
Serial.println (delta);
delay (100);
 
} 


int tmoins = digitalRead(BPMoins ); // Lecture de l'entree BP et sockage du résultats dans test 
if(tmoins==HIGH) // Si test est à l'état bas 
{ 
Serial.println ("MOINS"); 
delta = delta-1;
Serial.print ("Delta actuel : ");
Serial.println (delta);
delay (100);

} 
}



void Potar() {
  
  

ValPotar = analogRead(Pot);    // Lecture du Potentiomètre
   //Serial.println("Valeur1 Potar = ");
  //Serial.println(ValPotar ); //Utilisable pour un delay…
  
  interval = ValPotar;
}


void LectureINIT(){
  
 

  ValeurINIT = analogRead(EntreeRes);  //Lecture de la photorésistance et affectation à val
  Serial.print("Valeur de reference = ");
  Serial.println(ValeurINIT); // the raw analog reading




 //Serial.println(currentMillis ); // the raw analog reading
 //Serial.println(previousMillis ); // the raw analog reading
 //Serial.println(interval); // the raw analog reading



if(currentMillis - previousMillis > interval) {
  
  // delay(5000);

ValeurCOMP = analogRead(EntreeRes);  //Lecture de la photorésistance et affectation à val 
Serial.print("Valeur de comparaison = ");
  Serial.println(ValeurCOMP ); // the raw analog reading

 previousMillis = currentMillis;


ValeurINIT = ValeurINIT + delta;
Serial.print("Valeur de reference plus delta  ");
Serial.print(delta);
Serial.print("=  ");
Serial.println(ValeurINIT); // the raw analog reading

if (ValeurCOMP > ValeurINIT) {

 Serial.println ("Photo....");

digitalWrite(led, HIGH);   // set the LED on
delay(5000);
digitalWrite(led, LOW);   // set the LED on

 }



}

  
}