Outils pour utilisateurs

Outils du site


challenge2026

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
challenge2026 [2026/03/01 12:42] – créée mistert2challenge2026 [2026/03/16 11:49] (Version actuelle) mistert2
Ligne 1: Ligne 1:
- 
 {{ ::gros_bouton.zip |}} {{ ::gros_bouton.zip |}}
  
 +{{ ::chrono.zip |}}
 +
 +**PROGRAMME POUR LA BARRIERE**
 +
 +<code C++>
 +#include <Wire.h>
 +#include <Servo.h>
 +#include <Adafruit_GFX.h>
 +#include <Adafruit_SSD1306.h>
 +Servo myservo;
 +#define SCREEN_WIDTH 128
 +#define SCREEN_HEIGHT 64
 +#define OLED_RESET    -1
 +#define SCREEN_ADDRESS 0x3C
 +
 +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 +
 +unsigned long prochainDeclenchement = 0;
 +int pos = 0;
 +// Capteurs IR
 +const byte CAPT1 = 2;
 +const byte CAPT2 = 3;
 +const byte FEUVERT = 12;
 +const byte FEUROUGE = 11;
 +// Distance entre capteurs
 +const float DISTANCE_M = 20;
 +
 +// Variables ISR
 +volatile unsigned long t1 = 0;
 +volatile unsigned long t2 = 0;
 +volatile bool capteur1Declenche = false;
 +volatile bool mesurePrete = false;
 +
 +// Anti-rebond
 +volatile unsigned long lastTrig1 = 0;
 +volatile unsigned long lastTrig2 = 0;
 +const unsigned long antiRebondUs = 5000;  // 5 ms
 +
 +// Timeout de mesure
 +const unsigned long timeoutMesureUs = 3000000UL; // 3 s
 +
 +// Filtrage dt
 +const unsigned long dtMinUs = 5000UL;      // 5 ms
 +const unsigned long dtMaxUs = 2000000UL;   // 2 s
 +
 +// Résultats
 +float vitesse_ms = 0.0;
 +float vitesse_kmh = 0.0;
 +
 +// Gestion affichage temporisé
 +unsigned long affichageJusqua = 0;
 +bool afficherResultat = false;
 +
 +void ISR_capteur1() {
 +  unsigned long now = micros();
 +
 +  if (now - lastTrig1 < antiRebondUs) return;
 +  lastTrig1 = now;
 +
 +  t1 = now;
 +  capteur1Declenche = true;
 +  mesurePrete = false;
 +}
 +
 +void ISR_capteur2() {
 +  unsigned long now = micros();
 +
 +  if (now - lastTrig2 < antiRebondUs) return;
 +  lastTrig2 = now;
 +
 +  if (capteur1Declenche && now > t1) {
 +    t2 = now;
 +    mesurePrete = true;
 +    capteur1Declenche = false;
 +  }
 +}
 +
 +void afficheAttente() {
 +  display.clearDisplay();
 +  display.setTextColor(SSD1306_WHITE);
 +
 +  display.setTextSize(1);
 +  display.setCursor(0, 0);
 +  display.println("Mesure vitesse");
 +
 +  display.setTextSize(2);
 +  display.setCursor(10, 22);
 +  display.println("ATTENTE");
 +
 +  display.display();
 +}
 +
 +void afficheVitesse(float vms, float t) {
 +  display.clearDisplay();
 +  display.setTextColor(SSD1306_WHITE);
 +
 +  display.setTextSize(1);
 +  display.setCursor(0, 0);
 +  display.println("Vitesse mesuree");
 +
 +  display.setTextSize(2);
 +  display.setCursor(0, 18);
 +  display.print(vms, 2);
 +  display.println(" cm/s");
 +
 +  display.setTextSize(2);
 +  display.setCursor(0, 42);
 +  display.print(t, 3);
 +  display.println(" sec");
 +
 +  display.display();
 +}
 +
 +void barriere() {
 +  digitalWrite(FEUVERT,LOW);
 +  digitalWrite(FEUROUGE,HIGH);
 +  
 +  Serial.println("Test servo setup -> 0");
 +   for (int i=90;i>0;i--) {
 +    myservo.write(i);
 +    delay(15);
 +  }
 +  
 +  Serial.println("Test servo setup -> 90");
 +  for (int i=0;i<90;i++) {
 +    myservo.write(i);
 +    delay(15);
 +  }
 +
 +  
 +  digitalWrite(FEUROUGE,LOW);
 +  digitalWrite(FEUVERT,HIGH);
 +}
 +
 +void setup() {
 +  randomSeed(analogRead(A0));  // initialise l'aléatoire
 +  prochainDeclenchement = millis() + random(4000, 8000);
 +  Serial.begin(9600);
 +  myservo.attach(6);
 +  myservo.write(0);
 +  delay(500);
 +
 +  
 +  pinMode(CAPT1, INPUT_PULLUP);
 +  pinMode(CAPT2, INPUT_PULLUP);
 +  pinMode(FEUVERT, OUTPUT);
 +  pinMode(FEUROUGE, OUTPUT);
 +  digitalWrite(FEUVERT,HIGH);
 +  digitalWrite(FEUROUGE,LOW);
 +  
 +  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
 +    while (1) {}
 +  }
 +
 +  afficheAttente();
 +  
 +  attachInterrupt(digitalPinToInterrupt(CAPT1), ISR_capteur1, FALLING);
 +  attachInterrupt(digitalPinToInterrupt(CAPT2), ISR_capteur2, FALLING);
 +}
 +
 +void loop() {
 +  bool calculer = false;
 +  unsigned long local_t1 = 0;
 +  unsigned long local_t2 = 0;
 +  bool local_capteur1Declenche = false;
 +
 +   noInterrupts();
 +  if (mesurePrete) {
 +    local_t1 = t1;
 +    local_t2 = t2;
 +    mesurePrete = false;
 +    calculer = true;
 +  }
 +  local_capteur1Declenche = capteur1Declenche;
 +  unsigned long local_t1_en_cours = t1;
 +  interrupts();
 +
 +  
 +
 +  // Timeout si capteur 2 ne vient jamais
 +  if (local_capteur1Declenche) {
 +    if (micros() - local_t1_en_cours > timeoutMesureUs) {
 +      noInterrupts();
 +      capteur1Declenche = false;
 +      interrupts();
 +
 +      Serial.println("Timeout mesure");
 +      afficheAttente();
 +    }
 +  }
 +
 +  if (calculer) {
 +    unsigned long dt_us = local_t2 - local_t1;
 +
 +    if (dt_us >= dtMinUs && dt_us <= dtMaxUs) {
 +      float dt_s = dt_us / 1000000.0;
 +      vitesse_ms = DISTANCE_M / dt_s;
 +      vitesse_kmh = vitesse_ms * 3.6;
 +
 +      Serial.print("t1 = ");
 +      Serial.print(local_t1);
 +      Serial.print(" us, t2 = ");
 +      Serial.print(local_t2);
 +      Serial.print(" us, dt = ");
 +      Serial.print(dt_us);
 +      Serial.println(" us");
 +
 +      Serial.print("Vitesse = ");
 +      Serial.print(vitesse_ms, 3);
 +      Serial.print(" m/s ; ");
 +      
 +
 +      afficheVitesse(vitesse_ms, dt_s);
 +      afficherResultat = true;
 +      affichageJusqua = millis() + 2000;
 +    } else {
 +      Serial.print("Mesure rejetee, dt_us = ");
 +      Serial.println(dt_us);
 +      afficheAttente();
 +      
 +    }
 +  }
 +
 +  if (afficherResultat && millis() >= affichageJusqua) {
 +    afficherResultat = false;
 +    afficheAttente();
 +    if (millis() >= prochainDeclenchement) {
 +
 +      barriere();   // ta fonction
 +      prochainDeclenchement = millis() + random(4000, 8000);
 +    }
 +  }
 +}
 +</code>
  
challenge2026.1772368939.txt.gz · Dernière modification : de mistert2