from machine import Pin, I2C, ADC
import ssd1306
import time
import onewire, ds18x20
# ---------------- I2C (OLED) ----------------
i2c = I2C(0, scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ---------------- DS18B20 ----------------
dat = Pin(15)
ow = onewire.OneWire(dat)
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
# ---------------- Button ----------------
button = Pin(14, Pin.IN, Pin.PULL_UP)
# ---------------- Battery ----------------
adc = ADC(26)
# ---------------- TIME SET (CHANGE THIS) ----------------
START_HOUR = 18 # 👈 set your current time
START_MIN = 35
START_SEC = 0
start_ticks = time.ticks_ms()
def get_time():
elapsed = time.ticks_diff(time.ticks_ms(), start_ticks) // 1000
sec = START_SEC + elapsed
minute = START_MIN + sec // 60
hour = START_HOUR + minute // 60
sec = sec % 60
minute = minute % 60
hour = hour % 24
return hour, minute, sec
# ---------------- Variables ----------------
screen = 0
last_press = 0
last_activity = time.ticks_ms()
message = "Hello Arthi!"
# ---------------- Functions ----------------
def read_temp():
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
return ds.read_temp(rom)
def read_voltage():
raw = adc.read_u16()
voltage = (raw / 65535) * 3.3
battery_voltage = voltage * 3 # simulate 0–9V
return battery_voltage
def draw_screen():
oled.fill(0)
if screen == 0:
h, m, s = get_time()
oled.text("Time", 0, 0)
oled.text("{:02}:{:02}:{:02}".format(h, m, s), 0, 20)
elif screen == 1:
temp = read_temp()
oled.text("Temp", 0, 0)
oled.text(str(round(temp, 1)) + " C", 0, 20)
elif screen == 2:
volt = read_voltage()
oled.text("Battery", 0, 0)
oled.text("{:.2f} V".format(volt), 0, 20)
if volt < 6.5:
oled.text("LOW!", 0, 40)
elif screen == 3:
oled.text("Message", 0, 0)
oled.text(message, 0, 20)
oled.show()
# ---------------- Main Loop ----------------
while True:
# Button press
if button.value() == 0:
if time.ticks_diff(time.ticks_ms(), last_press) > 300:
screen = (screen + 1) % 4
last_press = time.ticks_ms()
last_activity = time.ticks_ms()
# Auto dim
if time.ticks_diff(time.ticks_ms(), last_activity) > 30000:
oled.contrast(0)
else:
oled.contrast(255)
draw_screen()
time.sleep(0.2)