import time
from machine import Pin, I2C
# I2C OLED setup
i2c = I2C(0, scl=Pin(17), sda=Pin(16))
OLED_ADDR = 0x3C
# Minimal 5x8 font for a few characters (A-Z, space)
font = {
'A': [0x7C, 0x12, 0x11, 0x12, 0x7C],
'D': [0x7F, 0x41, 0x41, 0x22, 0x1C],
'E': [0x7F, 0x49, 0x49, 0x49, 0x41],
'G': [0x3E, 0x41, 0x49, 0x49, 0x7A],
'I': [0x00, 0x41, 0x7F, 0x41, 0x00],
'N': [0x7F, 0x02, 0x0C, 0x10, 0x7F],
'O': [0x3E, 0x41, 0x41, 0x41, 0x3E],
'R': [0x7F, 0x09, 0x19, 0x29, 0x46],
'S': [0x46, 0x49, 0x49, 0x49, 0x31],
'T': [0x01, 0x01, 0x7F, 0x01, 0x01],
'U': [0x3F, 0x40, 0x40, 0x40, 0x3F],
'Y': [0x03, 0x04, 0x78, 0x04, 0x03],
' ': [0x00, 0x00, 0x00, 0x00, 0x00]
}
# OLED commands
def oled_cmd(cmd):
i2c.writeto(OLED_ADDR, b'\x00' + bytes([cmd]))
def oled_data(data):
i2c.writeto(OLED_ADDR, b'\x40' + bytes([data]))
def oled_init():
for cmd in [0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00,
0x40, 0x8D, 0x14, 0x20, 0x00, 0xA1, 0xC8,
0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB,
0x40, 0xA4, 0xA6, 0xAF]:
oled_cmd(cmd)
def oled_clear():
for page in range(8):
oled_cmd(0xB0 + page)
oled_cmd(0x00)
oled_cmd(0x10)
for _ in range(128):
oled_data(0x00)
def oled_set_cursor(x, y):
oled_cmd(0xB0 + y) # page
oled_cmd(0x00 + (x & 0x0F)) # lower column
oled_cmd(0x10 + (x >> 4)) # upper column
def oled_print(text, x=0, y=0):
oled_set_cursor(x, y)
for char in text.upper():
for byte in font.get(char, font[' ']):
oled_data(byte)
oled_data(0x00) # space between characters
# GPIO setup
btn_attend = Pin(13, Pin.IN, Pin.PULL_UP) # Button between pin 13 and GND
led_green = Pin(10, Pin.OUT)
# Initialize OLED and show welcome message
oled_init()
oled_clear()
oled_print("PRESS BUTTON", 0, 0)
while True:
if btn_attend.value() == 0: # Button pressed (active LOW)
time.sleep(0.05) # Debounce delay
if btn_attend.value() == 0:
oled_clear()
oled_print("YOUR", 0, 0)
oled_print("ATTENDANCE", 0, 1)
oled_print("IS", 0, 2)
oled_print("REGISTERED", 0, 3)
led_green.on()
# Wait for button release to avoid multiple triggers
while btn_attend.value() == 0:
time.sleep(0.05)
time.sleep(2)
oled_clear()
oled_print("PRESS BUTTON", 0, 0)
led_green.off()
time.sleep(0.1)