#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET    -1
#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_SDA      22
#define OLED_SCL      21

#define AUTO_PIN   35
#define MANUAL_PIN 34
#define FILTER_PIN 33
#define BACKWASH_PIN 32

#define RELAY_AUTO 4
#define RELAY_MANUAL 15
#define RELAY_FILTER 2
#define RELAY_BACKWASH 5

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
WebServer server(80);

const char* ssid = "Wokwi-GUEST";
const char* password = "";

void setup() {
  Serial.begin(115200);

  pinMode(AUTO_PIN, INPUT_PULLUP);
  pinMode(MANUAL_PIN, INPUT_PULLUP);
  pinMode(FILTER_PIN, INPUT_PULLUP);
  pinMode(BACKWASH_PIN, INPUT_PULLUP);
  
  pinMode(RELAY_AUTO, OUTPUT);
  pinMode(RELAY_MANUAL, OUTPUT);
  pinMode(RELAY_FILTER, OUTPUT);
  pinMode(RELAY_BACKWASH, OUTPUT);

  display.begin(SSD1306_PAGEADDR, OLED_SDA, OLED_SCL);
  display.display();
  delay(1000);

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  }
}

void loop() {

  // Read switch states
  bool autoSwitch = digitalRead(AUTO_PIN);
  bool manualSwitch = digitalRead(MANUAL_PIN);
  bool filterSwitch = digitalRead(FILTER_PIN);
  bool backwashSwitch = digitalRead(BACKWASH_PIN);

  // Update relay states and OLED display based on switch states
  if (autoSwitch) {
    digitalWrite(RELAY_AUTO, HIGH);
    digitalWrite(RELAY_MANUAL, LOW);
    digitalWrite(RELAY_FILTER, LOW);
    digitalWrite(RELAY_BACKWASH, LOW);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);
    display.println("AUTOMATIC SWITCH ON");
    display.display();
  } else if (manualSwitch) {
    digitalWrite(RELAY_AUTO, LOW);
    digitalWrite(RELAY_MANUAL, HIGH);
    digitalWrite(RELAY_FILTER, LOW);
    digitalWrite(RELAY_BACKWASH, LOW);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);
    display.println("MANUAL SWITCH ON");
    display.display();
  } else if (filterSwitch) {
    digitalWrite(RELAY_AUTO, LOW);
    digitalWrite(RELAY_MANUAL, LOW);
    digitalWrite(RELAY_FILTER, HIGH);
    digitalWrite(RELAY_BACKWASH, LOW);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);
    display.println("SYSTEM IS FILTERING");
    display.display();
  } else if (backwashSwitch) {
    digitalWrite(RELAY_AUTO, LOW);
    digitalWrite(RELAY_MANUAL, LOW);
    digitalWrite(RELAY_FILTER, LOW);
    digitalWrite(RELAY_BACKWASH, HIGH);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0,0);
    display.println("SYSTEM IS BACKWASHING");
    display.display();
  }
}

void handleRoot() {
  String html = "<html><body>";
  html += "<h1>ESP32 Control Panel</h1>";
  html += "<p>Automatic Switch: ";
  html += digitalRead(AUTO_PIN) ? "ON" : "OFF";
  html += "</p>";
  html += "<p>Manual Switch: ";
  html += digitalRead(MANUAL_PIN) ? "ON" : "OFF";
  html += "</p>";
  html += "<p>Filtering Switch: ";
  html += digitalRead(FILTER_PIN) ? "ON" : "OFF";
  html += "</p>";
  html += "<p>Backwash Switch: ";
  html += digitalRead(BACKWASH_PIN) ? "ON" : "OFF";
  html += "</p>";
  html += "</body></html>";

  server.send(200, "text/html", html);
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module