'''
Referentie: CVO-P1-Evaluatie opdracht 2
Functie programma: thermostaat die via een relay een verwarming aanstuurt.
Via de rotary encoder en een button kunnen een aantal doelvariabelen
aangepast worden die verschijnen op OLED-schermen. Deze doelvariabelen
bepalen dan de werking van de thermostaat.
Het programma werkt in temperatuur simulatie-modus.
Het programma bevat ook code die
geactiveerd kan worden ingeval een echte temperatuursensor wordt gebruikt.
Auteur: Frank DIERICK (met hulp van CoPilot en ChatGTP)
Datum: januari 2026
'''
# main.py
import time
from machine import Pin, I2C
import globals
import rotary_encoder
from thermostaat import updateVerwarming, verwarmingActief
from ssd1306 import SSD1306_I2C
from oled_display import display_scherm_1
from scherm2 import handleScherm2
from scherm3 import handleScherm3
import temperatuur # simulatie module Wokwi
# ---------------------------------------------------------
# I2C + OLED INITIALISATIE
# ---------------------------------------------------------
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
u8g2 = SSD1306_I2C(128, 64, i2c)
# ---------------------------------------------------------
# RELAY INITIALISATIE (active-low)
# ---------------------------------------------------------
globals.pinRelay = Pin(23, Pin.OUT)
globals.pinRelay.value(1) # start UIT
# ---------------------------------------------------------
# ROTARY ENCODER + BUTTONS
# ---------------------------------------------------------
rotary_encoder.initEncoder()
buttonScreen = Pin(17, Pin.IN, Pin.PULL_UP)
buttonSim = Pin(16, Pin.IN, Pin.PULL_UP)
lastButtonScreen = 1
lastButtonSim = 1
# ---------------------------------------------------------
# SIMULATIE
# ---------------------------------------------------------
simTemperaturen = [5.0, 8.0, 15.0, 23.0, 25.0, 27.0, 30.0]
simIndex = 0
# ---------------------------------------------------------
# STARTWAARDEN
# ---------------------------------------------------------
globals.schermNu = 1
globals.simActive = True
globals.cursorScherm2 = 2
globals.cursorScherm3 = 2
globals.editModeScherm2 = False
globals.editModeScherm3 = False
# ---------------------------------------------------------
# HOOFDLOOP
# ---------------------------------------------------------
while True:
# -----------------------------
# Knoppen detecteren (edge)
# -----------------------------
screenNow = buttonScreen.value()
simNow = buttonSim.value()
buttonScreenClicked = (lastButtonScreen == 1 and screenNow == 0)
buttonSimClicked = (lastButtonSim == 1 and simNow == 0)
lastButtonScreen = screenNow
lastButtonSim = simNow
# -----------------------------
# Simulatie toggelen
# -----------------------------
if buttonSimClicked:
globals.simActive = not globals.simActive
print("=== SIM STATUS GEWIJZIGD →", "ACTIEF" if globals.simActive else "PAUZE", "===")
# -----------------------------
# Metingen & logica (alleen als simulatie actief)
# -----------------------------
if globals.simActive:
# Simulatie loopt over lijst van temperaturen
globals.tempSim = simTemperaturen[simIndex]
globals.tempNu = globals.tempSim
simIndex = (simIndex + 1) % len(simTemperaturen)
updateVerwarming()
print(
"TempSim: {:.1f} TempNu: {:.1f} Relay: {} SimActive: {}".format(
globals.tempSim,
globals.tempNu,
"Aan" if verwarmingActief() else "Uit",
globals.simActive
)
)
# -----------------------------
# Encoder één keer uitlezen
# -----------------------------
encoder = rotary_encoder.readEncoder()
# -----------------------------
# Schermweergave
# -----------------------------
if globals.schermNu == 1:
if buttonScreenClicked:
globals.schermNu = 2
else:
display_scherm_1(u8g2, globals.simActive)
elif globals.schermNu == 2:
handleScherm2(u8g2, encoder, buttonScreenClicked)
elif globals.schermNu == 3:
handleScherm3(u8g2, encoder, buttonScreenClicked)
# -----------------------------
# Rust voor CPU + encoder
# -----------------------------
time.sleep_ms(80)
Loading
ds18b20
ds18b20