# main.py - Voor Wokwi ESP32 Simulatie
import network
import urequests
import ujson
import time
from machine import Pin
import neopixel
# --- CONFIGURATIE ---
# 1. Maak een device aan op uw iotsolutions.be website (bv. 'wokwi-demo')
# 2. Kopieer de API Key van dat device en plak deze hieronder.
API_KEY = "b98349bd6e831ad16338d16e63e75044006dd23d4cca0265"
# 3. Vul het IP-adres van uw PC in waarop de Flask server draait.
API_ENDPOINT = "https://iotsolutions.be/api/iot/virus-data"
# Hardware-instellingen (ongewijzigd)
NUM_LEDS = 16
COVID_PIN = 25
GRIEP_PIN = 26
RSV_PIN = 27
# Kleuren voor de verschillende niveaus (R, G, B)
LEVEL_COLORS = {
"low": (0, 100, 0),
"moderate": (255, 100, 0),
"high": (200, 30, 0),
"very_high": (255, 0, 0),
"missing": (0, 0, 0),
"error": (0, 0, 100) # Blauw voor fouten
}
# --- HARDWARE SETUP ---
covid_ring = neopixel.NeoPixel(Pin(COVID_PIN), NUM_LEDS)
griep_ring = neopixel.NeoPixel(Pin(GRIEP_PIN), NUM_LEDS)
rsv_ring = neopixel.NeoPixel(Pin(RSV_PIN), NUM_LEDS)
# --- FUNCTIES ---
def set_ring_color(ring, color):
"""Vult een hele ring met een specifieke kleur."""
for i in range(NUM_LEDS):
ring[i] = color
ring.write()
def connect_wifi():
"""Maakt verbinding met het Wokwi WiFi-netwerk."""
print("Verbinden met Wokwi-GUEST WiFi...")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
if not sta_if.isconnected():
sta_if.connect("Wokwi-GUEST", "")
attempts = 0
while not sta_if.isconnected() and attempts < 20:
attempts += 1
time.sleep(1)
if sta_if.isconnected():
print("WiFi verbonden! IP:", sta_if.ifconfig()[0])
return True
else:
print("WiFi-verbinding mislukt.")
return False
def get_and_update_barometer(station_name):
"""Haalt data op via een POST request en stuurt de LED-ringen aan."""
print(f"\nData ophalen voor station: '{station_name}'...")
# Controleer of de API Key is ingevuld
if "PLAK_HIER" in API_KEY:
print("FOUT: API_KEY is niet ingevuld. Vul de key in bovenaan de code.")
set_all_rings_to_error()
return
headers = {
'Content-Type': 'application/json',
'X-API-KEY': API_KEY
}
payload = {
'station': station_name
}
try:
# Verstuur de POST request
response = urequests.post(API_ENDPOINT, headers=headers, data=ujson.dumps(payload), timeout=10)
if response.status_code == 200:
print("Data succesvol ontvangen.")
data = response.json()
response.close()
if data.get("success"):
virus_data = data.get("data", {})
covid_level = virus_data.get("covid", {}).get("activity_level", "missing")
griep_level = virus_data.get("influenza", {}).get("activity_level", "missing")
rsv_level = virus_data.get("rsv", {}).get("activity_level", "missing")
print(f"Status -> COVID: {covid_level}, GRIEP: {griep_level}, RSV: {rsv_level}")
set_ring_color(covid_ring, LEVEL_COLORS.get(covid_level, LEVEL_COLORS["error"]))
set_ring_color(griep_ring, LEVEL_COLORS.get(griep_level, LEVEL_COLORS["error"]))
set_ring_color(rsv_ring, LEVEL_COLORS.get(rsv_level, LEVEL_COLORS["error"]))
else:
print(f"API Fout: {data.get('error', 'Onbekende fout')}")
set_all_rings_to_error()
else:
print(f"HTTP Fout! Status code: {response.status_code}")
set_all_rings_to_error()
response.close()
except Exception as e:
print(f"Een fout is opgetreden tijdens de request: {e}")
set_all_rings_to_error()
def set_all_rings_to_error():
"""Zet alle ringen op een foutkleur."""
set_ring_color(covid_ring, LEVEL_COLORS["error"])
set_ring_color(griep_ring, LEVEL_COLORS["error"])
set_ring_color(rsv_ring, LEVEL_COLORS["error"])
# --- HOOFDPROGRAMMA ---
if connect_wifi():
# 1. Start met het ophalen van de data voor België
print("\n--- Initiële status voor België ---")
get_and_update_barometer("België")
# 2. Start de interactieve loop
while True:
print("\n" + "="*40)
try:
# Vraag de gebruiker om input in de Wokwi terminal
requested_station = input("Voer een stationsnaam in (bv. 'Gent' of 'België') of typ 'stop': ")
if requested_station.lower() == 'stop':
break
if not requested_station: # Als de gebruiker enkel op Enter drukt
continue
get_and_update_barometer(requested_station)
except (KeyboardInterrupt, EOFError):
# Vang Ctrl+C of einde van input
break
print("\nSimulatie gestopt.")
# Zet de LEDs uit bij het stoppen
set_ring_color(covid_ring, (0,0,0))
set_ring_color(griep_ring, (0,0,0))
set_ring_color(rsv_ring, (0,0,0))
else:
set_all_rings_to_error()
print("Kan niet doorgaan zonder WiFi.")