Arduino - variable de depart forcée ?

Salut à tous,

deja un grand merci à tous pour l'aide apportée jusqu'a present.
mon programme se termine, j'aurais certainement une derniere requete qui serait de verifier si tout est en ordre.
en attendant voici ma question du jour :wink:

j'ai un programme (pour ceux qui connaissent ça va etre simple) qui mesure le temps entre 2 fronts descendants sur 2 capteurs qui sont sur un arbre tournant.

je mesure ce temps, pas de soucis, puis avec des masselottes centrifuges le capteur du haut va se dephaser en tournant par rapport au capteur du bas.

pour ce faire (merci sdfg) je mesure le temps entre les 2 tops, ça me donne une variable "delta"

 delta = fin_opto - fin_rupteur;

j'initialise cette variable delta que je souhaite figer entre 1 et 300 trs/min

 if (( (vitesse1>1) && (vitesse1<300) ))
  {
    vitesse2 = ((delta/1000000)*360)/(1/(vitesse1/60));;
}

je fige cette valeur pour ensuite la soustraire à l'angle trouvé une fois que la vitesse de l'arbre est superieure à 300 trs/min

Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)) - vitesse2);

ma question est la suivante, existe t-il une fonction qui me simplifierait la vie pour eviter d'initialiser la valeurs vitesse 2, et de dire immédiatement que jusqu'a 300tr/min je suis à 0 sur ce resultat final et que je ne souhaite observer que la différence ?

sais pas si je suis bien clair là ... peut etre que mon explication manque de variables nommées ...

mon soucis est le suivant, si mon initialisation se fait mal j'ai des petites variations après 300 tr/min

en fait mon soucis pourrait etre d'ailleurs simplifié si je disait :
=> entre 250 et 300 trs/min tu figes une valeur de vitesse 2 et tu n'y reviens plus même si je reviens dans la plage 250-300

c'est possible ça ?

merci !!

//potard sur a0 broche centrale
//les 2 autre pin sur 5v et ground
//sabertooth port S1 sur 8 arduino
//moteur sur m1a et m1b
//0v sabertooth sur ground

//RUPTEUR ET OUTPUT
//UN FIL SUR BORNE 2
//UN FIL SUR 5V

//capteur optique ET INPUT
//D0 SUR BORNE 3

//capteur optique si input_pullup
//UN FIL SUR BORNE 2
//UN FIL SUR gnd

#include <SoftwareSerial.h>
#include <SabertoothSimplified.h>
#define NOT_AN_INTERRUPT -1

SoftwareSerial SWSerial(NOT_A_PIN, 8); //Pin 8 utilisé pour communiquer avec la Sabertooth
SabertoothSimplified ST(SWSerial); //librairie sabertooth

//commande moteur
const int potar = A0;  //la broche pour régler la vitesse


//rupteur
const byte PIN_SIGNAL = 2; 
volatile unsigned long last_micros;

//optique
const byte PIN_SIGNAL1 = 3;
unsigned long periode2 = 0;
unsigned long periode3 = 0;
volatile unsigned long last_micros1;

//dephasage
float dephasage = 0;


//COMMUN DEBOUNCING TIME
long debouncing_time = 15; //Debouncing Time in Milliseconds

//angle came
int buttonState = 0;
int lastButtonState = 0;
long temps_total = 0;
int angle2 = 0;
int angle4 = 0;
int angle6 = 0;
int angle8 = 0;
const int angle_total = 360;
long p1 = 0;
long p2 = 0;
long p3 = 0;
long p4 = 0;
long p5 = 0;
long p6 = 0;
long p7 = 0;
long p8 = 0;
int compteur =0;

volatile byte compteur_ticks   = 0;
volatile byte compteur_optique = 0;
//unsigned long  previousMicros  = 0;
//unsigned long  previousMicros1 = 0;
float periode=0;
float periode1=0;
float  vitesse1=0;
float  vitesse2=0;
float  vitesse3=0;
void debounceInterrupt1() {compteur_optique++;}
//void debounceInterrupt()  {compteur  ++;}
unsigned long  previousMicros  = micros();
unsigned long  previousMicros1 = micros();
unsigned long  fin_rupteur     = 0;
unsigned long  fin_opto        = 0;
float  delta           = 0;

/** Fonction setup() */

void tick() {
  

fin_rupteur = micros();
 
   
}


void debounceInterrupt() {
  if((long)(micros() - last_micros) >= debouncing_time*100) {
    tick();
    last_micros = micros();
  }
}

void setup () {

     Serial.begin(115200);
     SWSerial.begin(38400);
     /* Met la broche en sortie */  
  pinMode(PIN_SIGNAL, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), debounceInterrupt, FALLING);  
pinMode(PIN_SIGNAL1, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL1), debounceInterrupt1, FALLING);  

}

void loop() {
  int vitesse = analogRead(potar);

 ST.motor(1,vitesse /8);

  periode2 = pulseIn(PIN_SIGNAL1, LOW, 1000000);
  periode3 = pulseIn(PIN_SIGNAL1, HIGH, 1000000);
     Serial.print("vitesse optique ");
vitesse1 = 60000000 / (periode2+periode3);
  Serial.println(vitesse1);
  
 
 
   if (compteur_optique >= 1)
  {
    if (fin_rupteur > 0) 
    {
      fin_opto = micros();
    }        
      periode1 = micros() - previousMicros1;
    previousMicros1 = micros();
    compteur_optique = 0;
  }
  if (fin_opto > 0 )
  {
    delta = fin_opto - fin_rupteur;
     fin_rupteur = 0;
    fin_opto = 0;
  }
  
   if (( (vitesse1>1) && (vitesse1<300) ))
  {
    vitesse2 = ((delta/1000000)*360)/(1/(vitesse1/60));;
    Serial.print("vitesse2 ");
    Serial.println(vitesse2);         
  }
  
Serial.print("delta ");
Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)) - vitesse2);
   Serial.println(" ");

    delay(100);
   
      }

hello
pas facile à suivre ton texte.

de ce que je comprends

if ( vitesse 1>300)
{ faire les calculs;}
else
{ ne pas les faire;}

ma question est la suivante, existe t-il une fonction qui me simplifierait la vie pour eviter d'initialiser la valeurs vitesse 2, et de dire immédiatement que jusqu'a 300tr/min je suis à 0 sur ce resultat final et que je ne souhaite observer que la différence ?

C'est vrai que ce n'est pas très clair. Tu peux imaginer un truc comme ça :

vitesse2 = delta*(vitesse1>300);

Je ne sais pas si ça marche en C : Si le test (vitesse1>300) est false ça renvoie 0, si le test est true, ça renvoie 1 * delta
Si cette syntaxe est correcte en C, tu peux l'adapter à ton problème.

En C on peut utiliser cette syntaxe:

vitesse2 = (vitesse1>300)? delta:  maConstantePourVitesseFaible;

ce qui est équivalent à un:

if (vitesse1>300){
   vitesse2 = delta;
} else {
  vitesse2 = maConstantePourVitesseFaible;
}

merci à vous !

je vais essayer ça et vous tiens au courant !!