import time
from machine import SoftI2C, Pin, ADC
from machine_i2c_lcd import I2cLcd
time.sleep(0.1)
# ---------------- LCD ----------------
i2c = SoftI2C(scl=Pin(26), sda=Pin(27), freq=400000)
lcd = I2cLcd(i2c, 0x27, 4, 20)
# ---------------- ADC ----------------
adc = ADC(28)
VREF = 3.3
ADC_MAX = 65535
# ---------------- SWITCHES ----------------
s1 = Pin(16, Pin.IN, Pin.PULL_UP)
s2 = Pin(17, Pin.IN, Pin.PULL_UP)
s3 = Pin(18, Pin.IN, Pin.PULL_UP)
s4 = Pin(19, Pin.IN, Pin.PULL_UP)
# ---------------- RANGE SELECTION ----------------
def get_r_known():
if not s1.value():
return "100 Ohms" # 0–100Ω range
elif not s2.value():
return "1k Ohms" # 100Ω–1kΩ
elif not s3.value():
return "10k Ohms" # 1kΩ–10kΩ
elif not s4.value():
return "100k Ohms" # 10kΩ–100kΩ
else:
return None
# ---------------- ADC VOLTAGE ----------------
def read_voltage():
raw = adc.read_u16()
return (raw / ADC_MAX) * VREF
# ---------------- RESISTANCE CALC ----------------
def measure_resistance():
r_known = get_r_known()
if r_known is None:
return None, None
v_out = read_voltage()
# invalid region checks (avoid divide errors / saturation)
if v_out <= 0.001 or v_out >= (VREF - 0.001):
return r_known, None
r_unknown = r_known * (v_out / (VREF - v_out))
return r_known, r_unknown
# ---------------- DISPLAY ----------------
def display(r_known, r_unknown):
lcd.clear()
# Line 1: Resistance
lcd.move_to(0, 0)
if r_unknown is None:
lcd.putstr("Resistance:")
else:
lcd.putstr("Resistance: " + str(int(r_unknown)))
# Line 2: Range
lcd.move_to(0, 1)
if r_known is None:
lcd.putstr("Range: NONE")
else:
lcd.putstr("Range: " + r_known)
# ---------------- MAIN LOOP ----------------
while True:
r_known, r_unknown = measure_resistance()
display(r_known, r_unknown)
time.sleep(3)Unknown Resistor