Arduino, probleme avec float

Salut à tous,

j'ai un petit soucis dans mon programme.
J'utilise des float pour mes calculs, mais j'ai une valeur qui doit depasser 100.
quand ça depasse 100 la valeur repart de 0 :o

j'ai tenté de remplacer float par unsigned long ou autre mais ça ne fonctionne pas

comment je pourrais depasser 100 avec un float ?

merci d'avance

Le site Arduino indique :

Floating-point numbers can be as large as 3.4028235E+38 and as low as -3.4028235E+38. 
They are stored as 32 bits (4 bytes) of information.

Donc normalement, aucun problème pour dépasser 100. Ton problème doit venir de ton code, que tu vas poster pour obtenir de l'aide...

merci pour ta reponse, voici le programme

//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() {
  
// compteur++; /*incremente à chaque signal LOW*/
      // if(compteur % 4 ==0){ /*si le resultat est divisible par 4 on passe à la suite*/

fin_rupteur = micros();
 //static unsigned long previousMicros = 0; /*static  variable conservée entre 2 appels à la fonction / initialisation qu'une seule fois */
 unsigned long currentMicros = micros(); /*le nombre de microSecondes depuis le début du programme */
  
  /* Calcul le temps écoulé depuis le précédent front */
 periode = currentMicros - previousMicros; /*le nombre de microSecondes depuis la dernière interruption*/
  
  /* Met à jour la variable pour la prochaine interruption */
  previousMicros = currentMicros; /*on se souvient du nombre de microSecondes depuis le début du programme*/


//}       
}


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<550) ))
  {
    vitesse2 = (((delta/1000000)*360)/(1/(vitesse1/60))/10);;
    Serial.print("vitesse2 ");
    Serial.println(vitesse2);
  }
  Serial.print("delta t ");
Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)));
   Serial.println(" ");
Serial.print("delta ");
Serial.println(((delta/1000000)*360)/(1/(vitesse1/60)) - vitesse2);
   Serial.println(" ");

    delay(500);
      
     // lit l'état actuel du bouton poussoir et le mémorise dans la variable
  buttonState = digitalRead(PIN_SIGNAL);
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (buttonState != lastButtonState) {
    
  /* Mesure la durée de la période */
p1 = pulseIn(PIN_SIGNAL, LOW);
 // Serial.print("p1: ");
   //    Serial.println(p1);
  }
       
    if (buttonState != lastButtonState){
p2 = pulseIn(PIN_SIGNAL, HIGH);
   //  Serial.print("p2: ");
  //  Serial.println(p2);
  }
    
       if (buttonState != lastButtonState){
    p3 = pulseIn(PIN_SIGNAL, LOW);
   //  Serial.print("p3: ");
  //  Serial.println(p3);
  }
    
       if (buttonState != lastButtonState){
    p4 = pulseIn(PIN_SIGNAL, HIGH);
   //  Serial.print("p4: ");
   // Serial.println(p4);
   }
    
     if (buttonState != lastButtonState){
  p5 = pulseIn(PIN_SIGNAL, LOW);
    // Serial.print("p5: ");
   // Serial.println(p5);
   }
    
     if (buttonState != lastButtonState){
  p6 = pulseIn(PIN_SIGNAL, HIGH);
    // Serial.print("p6: ");
  //  Serial.println(p6);
  }
    
     if (buttonState != lastButtonState){
  p7 = pulseIn(PIN_SIGNAL, LOW);
    // Serial.print("p7: ");
   // Serial.println(p7);
   }
    
     if (buttonState != lastButtonState){
   p8 = pulseIn(PIN_SIGNAL, HIGH);
    // Serial.print("p8: ");
   // Serial.println(p8);
   }
    
    // affiche le temps total
   temps_total = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8;
  // Serial.print("temps total: ");
       // Serial.println(temps_total);
        
    // affiche l'angle inter fermé
      angle2 = (p2 * angle_total) / (temps_total) ;
      Serial.print("angle 2: ");
        Serial.println(angle2);

         // affiche l'angle inter fermé
      angle4 = (p4 * angle_total) / (temps_total) ;
      Serial.print("angle 4: ");
        Serial.println(angle4);

         // affiche l'angle inter fermé
      angle6 = (p6 * angle_total) / (temps_total) ;
      Serial.print("angle 6: ");
        Serial.println(angle6);

         // affiche l'angle inter fermé
      angle8 = (p8 * angle_total) / (temps_total) ;
      Serial.print("angle 8: ");
        Serial.println(angle8);
     
      }

C'est un peu long, peux-tu préciser la variable qui pose problème ?

j'ai fait quelques tests, c'est cette ligne qui fini par poser probleme :

delta = fin_opto - fin_rupteur;

au bout d'un moment les valeurs sont tres proches et ça fini par donner du negatif ....

mon programme à bien fonctionné pendant quelques temps et là d'un coup ça deconne .... bon ... je ne sais pas trop quoi faire là ...

A quoi correspond cette variable ?
Tu peux mettre un test sur son signe et traiter le cas négatif.
Ou tu peux mettre un seuil de précision :

if (abs(delta)<seuil) { actions; }

ah oui, c'est justement ce que je cherchais !

pour le reste il faut que je continue d'investiguer .... c'es moyen mon affaire

la variable en question calcul le temps entre 2 tops representés par 2 capteurs, et je souhaite mesurer l'angle entre ces 2 tops (car cet angle varie en fonction de la vitesse)

c'est chaud pour moi qui ne connait pas encore bien la prog :slight_smile:

Alors bonne chance
Lis des tutos : pour apprendre, c'est un bon moyen

interessant ce que tu me dis là, j'avais comme projet de mettre au propre ce programme, j'ai d'ailleurs commencé et ça se passe mieux, je vais regarder en detail ce que du decris

pour la suite je tente de recuperer les valeurs en live pour en sortir un graphique, autre paire de manches ... :o

mais il existe des progs tout prêt, voir peut être processing qui parait pas mal

merci !

Bonjour,
Initialise tes float(s) de la manière suivantes:

float  variable = 0.0;

et tes long(s) de la manière suivantes:

unsigned long variable  = 0L;