#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int buttonPins[] = {2, 3, 4, 5, 6};
const int relayPins[] = {7, 8, 9, 10};
const int potiPin = A0;
const int numButtons = sizeof(buttonPins) / sizeof(buttonPins[0]);
const int numRelays = sizeof(relayPins) / sizeof(relayPins[0]);
const char* relayNames[] = {"Restart", "Computer", "Playstation", "Licht", "Lüftung"};
bool relayStates[] = {false, false, false, false, false};
unsigned long lastButtonPress = 0;
const unsigned long restartDelay = 10000; // 10 seconds
void setup() {
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
for (int i = 0; i < numRelays; i++) {
pinMode(relayPins[i], OUTPUT);
digitalWrite(relayPins[i], LOW); // initially turn off all relays
}
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.display();
delay(1000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor((SCREEN_WIDTH - 72) / 2, SCREEN_HEIGHT / 2);
display.println("Loading...");
display.display();
delay(5000);
display.clearDisplay();
display.display();
}
void loop() {
displayRelayStatus();
for (int i = 0; i < numButtons; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
if (i == 0) { // Restart button pressed
reboot();
} else {
toggleRelay(i - 1); // Adjust index for relay buttons
}
delay(200); // debounce delay
}
}
adjustFanSpeed();
}
void toggleRelay(int index) {
relayStates[index] = !relayStates[index];
digitalWrite(relayPins[index], relayStates[index] ? HIGH : LOW);
}
void displayRelayStatus() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Relay Status:");
for (int i = 0; i < numRelays; i++) {
display.print(relayNames[i + 1]); // Adjust index for relayNames
display.print(": ");
display.println(relayStates[i] ? "EIN" : "AUS");
}
// RPM-Anzeige für die Lüftung
int rpm = calculateFanRPM(); // Funktion, um die tatsächlichen RPM zu berechnen
display.print("Lüftung RPM: ");
display.println(rpm);
display.display();
}
int calculateFanRPM() {
// Hier müsstest du den Code einfügen, um die tatsächlichen RPM der Lüftung zu berechnen
// Du könntest zum Beispiel einen Interrupt verwenden, der jedes Mal ausgelöst wird, wenn der Lüfter eine Umdrehung macht, und dann die Zeit zwischen den Interrupts messen, um die RPM zu berechnen.
// Eine genaue Implementierung hängt von deiner Hardware und deinem Lüfter ab.
return 0; // Dummy-Wert, ersetze durch die tatsächlichen RPM
}
void adjustFanSpeed() {
int potiValue = analogRead(potiPin);
int fanSpeed = map(potiValue, 0, 1023, 0, 255);
// Code to control fan speed based on potentiometer reading
}
void reboot() {
if (millis() - lastButtonPress >= restartDelay) {
for (int i = 0; i < numRelays; i++) {
digitalWrite(relayPins[i], LOW);
relayStates[i] = false;
}
display.clearDisplay();
display.setCursor((SCREEN_WIDTH - 64) / 2, SCREEN_HEIGHT / 2);
display.println("Rebooting...");
display.display();
delay(10000);
}
lastButtonPress = millis();
}