import machine, time
from machine import Pin, ADC, I2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
# Pin setup
SAFE_LED = Pin(18, Pin.OUT)
DANGER_LED = Pin(5, Pin.OUT)
RELAY = Pin(23, Pin.OUT)
BUZZER = Pin(19, Pin.OUT)
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB) # full 0-3.3V range
# LCD Setup (20x4)
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
lcd = I2cLcd(i2c, 0x27, 4, 20)
# ---- AI Predictor Variables ----
baseline_samples = []
baseline_mean = 0
baseline_var = 0
trained = False
def train_ai():
global baseline_mean, baseline_var, trained
lcd.clear()
lcd.putstr("Training AI...")
time.sleep(1)
for i in range(20): # Collect 20 safe samples
val = pot.read()
baseline_samples.append(val)
time.sleep(0.1)
baseline_mean = sum(baseline_samples) / len(baseline_samples)
baseline_var = sum((x - baseline_mean)**2 for x in baseline_samples) / len(baseline_samples)
trained = True
lcd.clear()
lcd.putstr("AI Training Done")
time.sleep(2)
lcd.clear()
def ai_predict(current_value):
if not trained:
return "Not trained"
# Simple range-based AI rule
if current_value > 3.0: # Above 3A = risk
return "RISK"
return "SAFE"
# ---- Convert Potentiometer Reading to Current (0-10A) ----
def read_current():
raw = pot.read() # 0 – 4095 (12-bit ADC)
current = (raw / 4095.0) * 10.0 # scale to 0–10 A
return current
# ---- Main Loop ----
train_ai()
while True:
current = read_current()
prediction = ai_predict(current)
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("AI Prediction Mode")
lcd.move_to(0,1)
lcd.putstr("Current: {:.2f} A".format(current))
lcd.move_to(0,2)
lcd.putstr("Prediction: {}".format(prediction))
if prediction == "RISK":
SAFE_LED.value(0)
DANGER_LED.value(1)
RELAY.value(0) # cut off power
BUZZER.value(1)
lcd.move_to(0,3)
lcd.putstr("Alert Send To Phone")
print("MOBILE ALERT: Insulation failure risk detected!")
else:
SAFE_LED.value(1)
DANGER_LED.value(0)
RELAY.value(1)
BUZZER.value(0)
lcd.move_to(0,3)
lcd.putstr("System Stable")
time.sleep(1)