from machine import Pin, ADC, I2C
from ssd1306 import SSD1306_I2C
import utime
BTN_PIN = 7
LED_PIN = 0
POT_PIN = 28
SDA_PIN = 16
SCL_PIN = 13
OLED_W = 128
OLED_H = 64
OLED_ADR = 0x3C
RESET_THRESHOLD = 65535
button = Pin(BTN_PIN, Pin.IN, Pin.PULL_UP)
led = Pin(LED_PIN, Pin.OUT)
pot = ADC(Pin(POT_PIN))
i2c = I2C(0, sda=Pin(SDA_PIN), scl=Pin(SCL_PIN), freq=400_000)
oled = SSD1306_I2C(OLED_W, OLED_H, i2c, addr=OLED_ADR)
running = False
start_ms = 0
elapsed_ms = 0
last_btn = button.value()
pot_reset_done = False
def ms_to_hms(ms):
total_s, ms_part = divmod(ms, 1000)
minutes, seconds = divmod(total_s, 60)
return minutes, seconds, ms_part // 10
def update_oled(mins, secs, cs, state_str, reset_msg=False):
oled.fill(0)
oled.text("CHRONOMETRE", 14, 0, 1)
oled.text("{:02d}:{:02d}.{:02d}".format(mins, secs, cs), 24, 22, 1)
oled.text("Etat: " + state_str, 0, 42, 1)
if reset_msg:
oled.text("RESET !", 36, 54, 1)
oled.show()
update_oled(0, 0, 0, "Arrete")
while True:
btn_val = button.value()
if last_btn == 1 and btn_val == 0:
if running:
elapsed_ms += utime.ticks_diff(utime.ticks_ms(), start_ms)
running = False
led.off()
else:
start_ms = utime.ticks_ms()
running = True
led.on()
last_btn = btn_val
pot_val = pot.read_u16()
if pot_val >= RESET_THRESHOLD:
if not pot_reset_done:
elapsed_ms = 0
running = False
led.off()
update_oled(0, 0, 0, "Arrete", reset_msg=True)
utime.sleep_ms(1000)
pot_reset_done = True
else:
pot_reset_done = False
if running:
current_ms = elapsed_ms + utime.ticks_diff(utime.ticks_ms(), start_ms)
else:
current_ms = elapsed_ms
mins, secs, cs = ms_to_hms(current_ms)
update_oled(mins, secs, cs, "En cours" if running else "Arrete")
utime.sleep_ms(50)