import network
import urequests
import ujson
import time
from machine import Pin
import neopixel
# --- CONFIGURATIE ---
# Pas dit aan naar je eigen WiFi netwerk
WIFI_SSID = "JE_WIFI_NAAM"
WIFI_PASSWORD = "JE_WIFI_WACHTWOORD"
# API-instellingen
STATION_NAME = "Harelbeke"
API_URL = "http://...:1880/api/station/" + STATION_NAME
# Hardware-instellingen
NUM_LEDS = 16 # Aantal LEDs per ring
COVID_PIN = 25
GRIEP_PIN = 26
RSV_PIN = 27
# Update-interval in seconden (bv. elke 30 minuten)
UPDATE_INTERVAL = 1800
# Kleuren voor de verschillende niveaus (R, G, B)
LEVEL_COLORS = {
"low": (0, 128, 0), # Groen
"moderate": (255, 165, 0), # Oranje
"high": (255, 69, 0), # Oranje-Rood
"very_high": (255, 0, 0), # Rood
"missing": (0, 0, 0), # Uit
"error": (0, 0, 255) # Blauw voor fouten
}
# --- HARDWARE SETUP ---
# Maak de NeoPixel objecten aan
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 WiFi-netwerk."""
print("Verbinden met 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 update_barometer():
"""Haalt data op van de API en stuurt de LED-ringen aan."""
print(f"\nData ophalen voor {STATION_NAME}...")
try:
response = urequests.get(API_URL, 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", {})
# Haal de niveaus op
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"COVID: {covid_level}, GRIEP: {griep_level}, RSV: {rsv_level}")
# Zoek de kleuren op en stuur de ringen aan
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("API gaf aan dat de request niet succesvol was.")
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: {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():
while True:
update_barometer()
print(f"Wachten voor {UPDATE_INTERVAL} seconden...")
time.sleep(UPDATE_INTERVAL)
else:
# Als WiFi faalt, zet de ringen op de foutkleur
set_all_rings_to_error()
print("Kan niet doorgaan zonder WiFi.")