from machine import Pin, ADC
import time
# Configuration materiel
# Bouton poussoir
BUTTON_PIN = 14
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_DOWN)
# LED d'etat
LED_PIN = 15
led = Pin(LED_PIN, Pin.OUT)
led.value(0) # eteinte au depart
# Potentiometre
POT_PIN = 26
pot = ADC(POT_PIN)
# Variables de chronometre
running = False
previous_button_state = 0
start_time = 0
elapsed_ms = 0
reset_already_triggered = False
POT_MAX_THRESHOLD = 1000 # Wokwi: valeur max du slider ~1023
def format_time(ms):
"""Convertit un temps en ms en mm:ss:ccc"""
minutes = ms // 60000
seconds = (ms % 60000) // 1000
millis = ms % 1000
return "{:02d}:{:02d}.{:03d}".format(minutes, seconds, millis)
def handle_button():
"""Gere le bouton avec detection de front montant"""
global running, previous_button_state, start_time, elapsed_ms
current_state = button.value()
# Detection de front montant (0 -> 1)
if current_state == 1 and previous_button_state == 0:
# Toggle de l'etat du chronometre
if not running:
start_time = time.ticks_ms() - elapsed_ms
running = True
print(">> CHRONOMETRE DEMARRE")
else:
elapsed_ms = time.ticks_diff(time.ticks_ms(), start_time)
running = False
print(">> CHRONOMETRE ARRETE")
previous_button_state = current_state
def handle_pot_reset():
"""Reinitialise le chronometre si le potentiometre est presque au max"""
global elapsed_ms, running, reset_already_triggered, start_time
value = pot.read_u16()
# Wokwi potentiometre: 0-1023, on utilise comme 0-65535
# Convertir pour comparaison
normalized_value = (value * 65535) // 1023
if normalized_value >= POT_MAX_THRESHOLD * 65:
if not reset_already_triggered:
elapsed_ms = 0
running = False
start_time = time.ticks_ms()
reset_already_triggered = True
print(">> RESET effectue! Potentiometre = {}".format(value))
else:
reset_already_triggered = False
# Boucle principale
print("\n===== Chronometre IoT =====")
print("Bouton GP14: Demarrer/Arreter")
print("Potentiometre GP26: Reinitialiser")
print("="*26)
last_display_time = 0
while True:
now = time.ticks_ms()
handle_button()
if running:
elapsed_ms = time.ticks_diff(now, start_time)
# LED allumee si en cours
led.value(1 if running else 0)
handle_pot_reset()
# Affichage periodique
if time.ticks_diff(now, last_display_time) >= 300:
state_text = "EN COURS" if running else "ARRETE "
print("Temps: {} [{}]".format(format_time(elapsed_ms), state_text))
last_display_time = now
time.sleep_ms(10) # Frequence d'echantillonnage