Comparaison millis() + variable

Bonjour, je post ici en dernier recours car j'aime bien me creuser la tête jusqu'au bout avant de demander de l'aide.

Voila je réalise un petit projet de LAP MONITORING sur Arduino.
J'ai déjà codé et réalisé les émetteurs IR a base d'un Digispark Attiny85 + Resi 220 + Led IR, de ce coté aucun soucis.

En revanche coté réception et traitement donnée je pagaie sur un truc qui me parait logique et simple mais qui ne veut pas fonctionner.
Je suis quasiment sur que l'erreur est vraiment toute bête.

Ce que je souhaiterais c'est que mon récepteur IR basé sur une Atmega 2560 scan en permanence la broche digital ou est branché le récepteur IR. (Jusqu'ici ca fonctionne)
Ensuite je voudrais qu'il reconnaisse l'adresse envoyée par l'émetteur que j'ai défini en amont.
(Ca fonctionne aussi)
Que si la voiture franchi pour la première fois la ligne d'arrivée ca rempli simplement une variable de temps + une variable de nombre de tour.(Ca fonctionne encore pour l'instant)
Et que lorsque la voiture refranchi la ligne a ce moment on soustrait le temps stocké avant en variable au millis() actuel pour en déduire le temps que la voiture a mis a faire le tour, par contre (et c'est la ou sa bloque) pour éviter que le récepteur lise plusieurs fois le code pendant le laps de temps ou la voiture passe sous le portique infrarouge je voulais mettre une condition qui dis que:
Si lorsque la voiture est détectée, le temps actuel (millis()) - le temps au tour d'avant est supérieur a 5sec alors tu peux enregistrer le passage, si c'est moins, on fait rien.

Mon problème c'est que une fois que le TOUR_ACTUEL_RAPH passe a 1, il m'enregistre le passage a chaque émission du code soit tout les 50ms.

J'ai tenté un peu tout ce que mon petit niveau savait faire mais je suis bloqué.
Voici le code je suis ouvert a toutes remarques/critiques tant qu'elles font avancer.

En vous remerciant.

#define DECODE_NEC
#define INFO
#include <Arduino.h>
#include "PinDefinitionsAndMore.h"
#include <IRremote.hpp>

unsigned long TOUR_ACTUEL_RAPH = 0; //TOIUR EN COURS POUR LE COUREUR RAPH.

unsigned long T1_RAPH; //TEMPS AU MOMENT DE FRANCHIR LA LIGNE DE DEPART DE RAPH.
unsigned long T2_RAPH; //TEMPS AU MOMENT DU FRANCHISSAGE DE LA LIGNE DE RAPH.

const int RAPH = 0x01;
const int  SAM = 0x02;
const int NICO = 0x03;
const int JOHN = 0x04;
const int OIVIER = 0x05;

void setup()

{
  Serial.begin(115200);
  // Just to know which program is running on my Arduino
  Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_IRREMOTE));

  // Start the receiver and if not 3. parameter specified, take LED_BUILTIN pin from the internal boards definition as default feedback LED
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

  Serial.print(F("Ready to receive IR signals of protocols: "));
  printActiveIRProtocols(&Serial);
  Serial.print(F("at pin "));
  Serial.println(IR_RECEIVE_PIN);
}

void loop()

{
  if (IrReceiver.decode())
  {
    if (IrReceiver.decodedIRData.address == RAPH)
    {
      if (TOUR_ACTUEL_RAPH == 0)
      {
        Serial.println("RAPH franchi la ligne de départ");
        TOUR_ACTUEL_RAPH = 1;
        T1_RAPH = millis();
      }
      if (TOUR_ACTUEL_RAPH >= 1 && millis() - T1_RAPH > 5000);
      {
        T2_RAPH = (millis() - T1_RAPH);
        Serial.print("RAPH a franchi la ligne et termine le tour ");
        Serial.print(TOUR_ACTUEL_RAPH);
        Serial.print(" en ");
        Serial.print(T2_RAPH);
        Serial.println(" SEC");
        TOUR_ACTUEL_RAPH = TOUR_ACTUEL_RAPH + 1;
        T1_RAPH = T2_RAPH;
      }
    }
  }
}

Bonsoir

Voici le code je suis ouvert a toutes remarques/critiques tant qu'elles font avancer.

le code non indenté et mal balisé est peu lisible, il sera peu lu.....

Lire ici la procdure pour publier correctement le code dans le corps des messages

https://forum.arduino.cc/t/les-bonnes-pratiques-du-forum-francophone/861014#utilisation-de-quelques-outils-1

Désolé j'avais mal compris le tuto.
C'est fait.

Bonjour,

Le problème est que T1_RAPH est un temps (millis() ) alors que T2_RAPH est une durée (différence de deux temps) et tu affectes T2_RAPH à T1_RAPH. Il faut que tes deux variables soient des temps.

      if (TOUR_ACTUEL_RAPH >= 1 && millis() - T1_RAPH > 5000);
      {
        T2_RAPH = millis();
        Serial.print("RAPH a franchi la ligne et termine le tour ");
        Serial.print(TOUR_ACTUEL_RAPH);
        Serial.print(" en ");
        Serial.print(T2_RAPH - T1_RAPH);
        Serial.println(" SEC");
        TOUR_ACTUEL_RAPH = TOUR_ACTUEL_RAPH + 1;
        T1_RAPH = T2_RAPH;
      }

Bonsoir,
peut-être en ajoutant un drapeau

//initialisation
bool RAPHtermine = 0;

    if (TOUR_ACTUEL_RAPH >= 1 && !RAPHtermine && millis() - T1_RAPH > 5000);
      {
// on ajoute
RAPHtermine =  1;
      }

Edit : vu la réponse de Kamil, je n'ai pas du comprendre la question. :face_with_hand_over_mouth:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.