import machine
import utime
import math
import os
# --- PINEK (A rajzod alapján) ---
ntc_pin = machine.ADC(26)
relay_pin = machine.Pin(15, machine.Pin.OUT) # GP15 (20. láb)
led_pump = machine.Pin(14, machine.Pin.OUT) # GP14 (19. láb)
# 5db Hőfok LED: GP16, 17, 18, 19, 20
led_pins = [machine.Pin(i, machine.Pin.OUT) for i in range(16, 21)]
szivattyu_led_pin = machine.Pin(9,machine.Pin.OUT)
btn_plus = machine.Pin(11, machine.Pin.IN, machine.Pin.PULL_UP)
btn_set = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP)
btn_minus = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
# --- VÁLTOZÓK ---
start_temp, stop_temp, offset = 30, 40, 0.0
mode = 0 # 0:Üzem, 1:Start-állít, 2:Stop-állít, 3:Kalibráció
szivattyu_fut = False
last_measure = 0
last_btn_type = 0
last_btn_time = 0
def save_all():
try:
with open("settings.txt", "w") as f:
f.write(f"{start_temp},{stop_temp},{offset}")
print(f">>> MENTVE: Start:{start_temp} Stop:{stop_temp} Offset:{round(offset,1)}")
except: pass
def load_all():
global start_temp, stop_temp, offset
try:
if "settings.txt" in os.listdir():
with open("settings.txt", "r") as f:
d = f.read().split(",")
start_temp, stop_temp, offset = int(d[0]), int(d[1]), float(d[2])
print(f">>> BETÖLTVE: Start:{start_temp} Stop:{stop_temp} Offset:{offset}")
except:
print(">>> Alapértékek betöltve")
load_all()
"""
/// a pikon élesben ez kell
def get_ntc_temp():
total = 0
for _ in range(20):
total += ntc_pin.read_u16()
utime.sleep_ms(2)
avg = total / 20
if avg >= 65530: avg = 65530
# 3.3V -> NTC -> GP26 -> 10k -> GND bekötéshez
res_ntc = 10000.0 * (65535.0 / avg - 1.0)
try:
steinhart = math.log(res_ntc / 10000.0) / 3380.0
steinhart += 1.0 / (25.0 + 273.15)
return (1.0 / steinhart) - 273.15
except: return -99.0
"""
def get_temp():
raw = ntc_pin.read_u16()
if raw < 100: raw = 100
if raw > 65400: raw = 65400
# Wokwi 3-lábas modulhoz (NTC a GND felé)
res = 10000.0 * (raw / (65535.0 - raw))
try:
# B=3950 Wokwihoz, valóságban 3380
st = math.log(res / 10000.0) / 3950.0
st += 1.0 / (25.0 + 273.15)
return (1.0 / st) - 273.15 + offset
except: return -99.0
print("--- RENDSZER INDUL ---")
while True:
t_ms = utime.ticks_ms()
# --- GOMBOK ELŐ-FIGYELÉSE (Belépéshez) ---
if mode == 0:
if btn_plus.value() == 0:
last_btn_type = 1; last_btn_time = t_ms; utime.sleep_ms(200)
if btn_minus.value() == 0:
last_btn_type = 2; last_btn_time = t_ms; utime.sleep_ms(200)
# BELÉPÉS: Ha megnyomod a SET-et és előtte volt FEL vagy LE
if btn_set.value() == 0:
if utime.ticks_diff(t_ms, last_btn_time) < 2000:
if last_btn_type == 2: mode = 1; print(">>> MÓD: LIMIT (START)")
if last_btn_type == 1: mode = 3; print(">>> MÓD: KALIBRÁCIÓ")
last_btn_time = 0; utime.sleep_ms(500)
# --- 1 & 2 MÓD: LIMIT ÁLLÍTÁS ---
if mode == 1 or mode == 2:
if btn_set.value() == 0:
mode += 1
if mode > 2: save_all(); mode = 0
else: print(">>> MÓD: LIMIT (STOP)")
utime.sleep_ms(400)
# Érték növelés/csökkentés
if btn_plus.value() == 0:
if mode == 1 and start_temp < 45: start_temp += 5
if mode == 2 and stop_temp < 45: stop_temp += 5
utime.sleep_ms(250)
if btn_minus.value() == 0:
if mode == 1 and start_temp > 25: start_temp -= 5
if mode == 2 and stop_temp > 25: stop_temp -= 5
utime.sleep_ms(250)
# Villogtatás a beállítás alatt
for i, lp in enumerate(led_pins):
target = start_temp if mode == 1 else stop_temp
lp.value(1 if (25+i*5 == target and (t_ms//200)%2) else 0)
# --- 3 MÓD: KALIBRÁCIÓ ---
elif mode == 3:
if btn_set.value() == 0: save_all(); mode = 0; utime.sleep_ms(500)
if btn_plus.value() == 0: offset += 0.1; utime.sleep_ms(250) # ms eredetileg 150
if btn_minus.value() == 0: offset -= 0.1; utime.sleep_ms(250) # ms eredetileg 150
step = int(abs(offset * 10)) % 5
for i, lp in enumerate(led_pins):
if offset > 0: lp.value(1 if (i == step and (t_ms//150)%2) else 0)
elif offset < 0: lp.value(1 if (i == (4-step) and (t_ms//150)%2) else 0)
else: lp.value(1 if (i == 2 and (t_ms//400)%2) else 0)
# --- 0 MÓD: ÜZEMMÓD (Normál működés) ---
else:
# 1. LED-ek: Jelzik a két beállított határértéket
for i, lp in enumerate(led_pins):
lepcso = 25 + (i * 5)
lp.value(1 if (lepcso == start_temp or lepcso == stop_temp) else 0)
# 2. Mérés és vezérlés
if utime.ticks_diff(t_ms, last_measure) > 1000:
akt = get_temp()
# akt = get_ntc_temp()
last_measure = t_ms
# Relé logika (Hiszterézis)
if not szivattyu_fut and akt >= stop_temp:
szivattyu_fut = True
print("RELÉ BEKAPCSOL")
elif szivattyu_fut and akt <= start_temp:
szivattyu_fut = False
print("RELÉ KIKAPCSOL")
# Fizikai kimenetek frissítése
relay_pin.value(1 if szivattyu_fut else 0)
led_pump.value(1 if szivattyu_fut else 0)
szivattyu_led_pin.value(1 if szivattyu_fut else 0)
print(f"Hofok: {round(akt,1)} C | Start:{start_temp} Stop:{stop_temp} | Rele:{'BE' if szivattyu_fut else 'KI'}")
utime.sleep_ms(20)