/*
* Virus Barometer Dashboard - Arduino ESP32 + ILI9341 LCD
* Compatible met Wokwi joke example pinout en libraries
*/
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Pin configuratie (exact zoals joke example)
#define BTN_PIN 5
#define TFT_DC 2
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// Virus data structure
struct VirusData {
int covid;
int griep;
int rsv;
String lastUpdate;
};
VirusData virusData = {2, 3, 1, "14:30"};
// Colors voor virus levels (Adafruit ILI9341 kleuren)
uint16_t levelColors[4] = {
ILI9341_GREEN, // 0 = LAAG
ILI9341_YELLOW, // 1 = MATIG
ILI9341_ORANGE, // 2 = HOOG
ILI9341_RED // 3 = ZEER HOOG
};
String levelNames[4] = {"LAAG", "MATIG", "HOOG", "ZEER HOOG"};
// Timing
unsigned long lastUpdate = 0;
const unsigned long updateInterval = 5000; // 5 seconden
void setup() {
Serial.begin(115200);
pinMode(BTN_PIN, INPUT_PULLUP);
WiFi.begin(ssid, password, 6);
tft.begin();
tft.setRotation(1); // Landscape
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
tft.print(".");
}
tft.print("\nOK! IP=");
tft.println(WiFi.localIP());
delay(2000);
// Show initial virus display
updateVirusDisplay();
Serial.println("Virus Barometer gestart!");
}
void loop() {
unsigned long currentTime = millis();
// Button pressed - force update
if (digitalRead(BTN_PIN) == LOW) {
Serial.println("Button pressed - updating data");
simulateDataUpdate();
updateVirusDisplay();
delay(300); // Debounce
}
// Automatic update
if (currentTime - lastUpdate > updateInterval) {
Serial.println("Automatic update...");
simulateDataUpdate();
updateVirusDisplay();
lastUpdate = currentTime;
}
delay(100);
}
void updateVirusDisplay() {
// Clear screen
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
// Title
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("VIRUS-BAROMETER");
tft.println();
// Virus status met kleuren
tft.setTextSize(2);
// COVID
tft.setTextColor(levelColors[virusData.covid]);
tft.print("COVID: ");
tft.println(levelNames[virusData.covid]);
// GRIEP
tft.setTextColor(levelColors[virusData.griep]);
tft.print("GRIEP: ");
tft.println(levelNames[virusData.griep]);
// RSV
tft.setTextColor(levelColors[virusData.rsv]);
tft.print("RSV: ");
tft.println(levelNames[virusData.rsv]);
tft.println();
// Visual blocks
drawColorBlocks();
// Status informatie
tft.setTextColor(ILI9341_CYAN);
tft.setTextSize(1);
tft.setCursor(0, 200);
tft.print("Update: ");
tft.print(virusData.lastUpdate);
tft.print(" WiFi: ");
tft.println(WiFi.isConnected() ? "OK" : "--");
tft.setTextColor(ILI9341_WHITE);
tft.println("Druk groene knop voor update");
Serial.println("Display updated successfully");
}
void drawColorBlocks() {
int startY = 120;
int blockWidth = 80;
int blockHeight = 40;
// COVID block
tft.fillRect(20, startY, blockWidth, blockHeight, levelColors[virusData.covid]);
// GRIEP block
tft.fillRect(120, startY, blockWidth, blockHeight, levelColors[virusData.griep]);
// RSV block
tft.fillRect(220, startY, blockWidth, blockHeight, levelColors[virusData.rsv]);
// Labels op de blokken (zwarte tekst)
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(1);
tft.setCursor(45, startY + 15);
tft.print("COVID");
tft.setCursor(145, startY + 15);
tft.print("GRIEP");
tft.setCursor(250, startY + 15);
tft.print("RSV");
}
void simulateDataUpdate() {
// Simuleer nieuwe virus data
virusData.covid = random(0, 4);
virusData.griep = random(0, 4);
virusData.rsv = random(0, 4);
// Update timestamp
int hour = random(8, 18);
int minute = random(0, 60);
virusData.lastUpdate = String(hour) + ":" + (minute < 10 ? "0" : "") + String(minute);
// Print status naar serial monitor
Serial.println("=== VIRUS STATUS UPDATE ===");
Serial.println("COVID: " + levelNames[virusData.covid]);
Serial.println("GRIEP: " + levelNames[virusData.griep]);
Serial.println("RSV: " + levelNames[virusData.rsv]);
Serial.println("Update: " + virusData.lastUpdate);
Serial.println("===========================");
}