from machine import Pin, I2C, ADC
from ssd1306 import SSD1306_I2C
import time
BUTTON_PIN = 3
LED_PIN = 28
POT_PIN = 26
I2C_SCL_PIN = 1
I2C_SDA_PIN = 0
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
led = Pin(LED_PIN, Pin.OUT)
pot = ADC(POT_PIN)
i2c = I2C(0, scl=Pin(I2C_SCL_PIN), sda=Pin(I2C_SDA_PIN), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
running = False
start_ticks = 0
elapsed_ms = 0
last_button_state = 1
reset_latched = False
last_reset_msg_time = 0
show_reset_msg_ms = 1000
def format_time(ms):
minutes = ms // 60000
remaining = ms % 60000
seconds = remaining // 1000
millis = remaining % 1000
return "{:02d}:{:02d}.{:03d}".format(minutes, seconds, millis)
def update_display(show_reset=False):
oled.fill(0)
oled.text("Chronometre", 0, 0)
state_text = "EN COURS" if running else "ARRETE"
oled.text("Etat: " + state_text, 0, 12)
time_text = format_time(elapsed_ms)
oled.text("Temps: " + time_text, 0, 24)
if show_reset:
oled.text("REMIS A ZERO", 0, 52)
oled.show()
led.value(0)
update_display()
while True:
now = time.ticks_ms()
current_button_state = button.value()
if current_button_state == 0 and last_button_state == 1:
if not running:
start_ticks = now
running = True
else:
elapsed_ms = elapsed_ms + time.ticks_diff(now, start_ticks)
running = False
last_button_state = current_button_state
if running:
current_elapsed = time.ticks_diff(now, start_ticks)
elapsed_ms_display = elapsed_ms + current_elapsed
else:
elapsed_ms_display = elapsed_ms
led.value(1 if running else 0)
pot_value = pot.read_u16()
if pot_value > 65000 and not reset_latched:
running = False
elapsed_ms = 0
reset_latched = True
last_reset_msg_time = now
update_display(show_reset=True)
time.sleep_ms(100)
elif pot_value < 65000:
reset_latched = False
if last_reset_msg_time != 0 and time.ticks_diff(now, last_reset_msg_time) < show_reset_msg_ms:
update_display(show_reset=True)
else:
update_display(show_reset=False)
time.sleep_ms(20)