########## DIGITAL MANUFACTURING ##########
# PIKACHU Project - Smart Chronometer for Competition
# Auteur: Youssef Slama (corrigé par ChatGPT)
# Description:
# - La voiture passe devant le capteur à ultrasons (distance < 50 cm) → le chronomètre démarre
# - Le capteur ignore les détections pendant 2 minutes (pour éviter un arrêt prématuré)
# - Après 2 minutes, si la voiture repasse (distance < 50 cm) → le chronomètre s’arrête
###########################################
from machine import Pin
import time
# --- Configuration des broches TRIG / ECHO ---
trig = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)
# --- Variables globales ---
threshold = 50 # Seuil en cm pour détecter la voiture
min_time_ms = 2 * 60 * 1000 # 2 minutes en millisecondes
timer_running = False
start_ticks = 0
ready_to_stop = False
# --- Mesure de la distance ---
def measure_distance():
# Envoi d'une impulsion TRIG de 10 µs
trig.value(1)
time.sleep_us(10)
trig.value(0)
# Attente du début du signal ECHO (avec timeout)
start = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), start) > 1000000:
return -1 # Timeout 1 seconde
t1 = time.ticks_us()
# Attente de la fin du signal ECHO (avec timeout)
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), t1) > 1000000:
return -1
t2 = time.ticks_us()
# Calcul distance en cm
duration = time.ticks_diff(t2, t1)
distance = (duration * 0.0343) / 2
time.sleep_ms(2000)
return round(distance, 2)
# --- Boucle principale ---
print("Systeme prêt. En attente de la voiture...")
while True:
distance = measure_distance()
if distance == -1:
print("Timeout mesure")
time.sleep_ms(100)
continue
print("Distance:", distance, "cm")
current_ticks = time.ticks_ms()
# --- Démarrage du chrono ---
if not timer_running and distance < threshold:
start_ticks = current_ticks
timer_running = True
ready_to_stop = False
print("🚗 Départ détecté → Chrono démarré !")
# --- Après 2 minutes, autoriser l’arrêt ---
if timer_running and not ready_to_stop:
if time.ticks_diff(current_ticks, start_ticks) >= min_time_ms:
ready_to_stop = True
print("✅ 2 minutes écoulées, prêt à arrêter le chrono à la prochaine détection.")
# --- Arrêt du chrono ---
if timer_running and ready_to_stop and distance < threshold:
elapsed_ms = time.ticks_diff(current_ticks, start_ticks)
elapsed_s = elapsed_ms / 1000.0
print("🏁 Arrivée détectée → Temps de course:", elapsed_s, "s")
timer_running = False
ready_to_stop = False
print("Système réinitialisé. Prêt pour la prochaine course.")
time.sleep(3) # pause avant nouvelle détection
time.sleep_ms(200)