// Symulacja jednego Arduino dla dwóch ról
// Single Arduino simulation for both roles

#define BUTTON_PIN 2  // Pin przycisku / Button pin
#define LED_PIN 13    // Pin diody LED / LED pin
#define RELAY_PIN 3   // Pin przekaźnika / Relay pin
#define RELAY_FEEDBACK_PIN 4 // Pin sprzężenia zwrotnego przekaźnika / Relay feedback pin

bool ledState = false;        // Stan diody LED / LED state
bool buttonPressed = false;   // Czy przycisk został wciśnięty / Whether the button was pressed
bool relayState = false;      // Stan przekaźnika / Relay state
bool feedbackReceived = false; // Czy sprzężenie zwrotne odebrane / Whether feedback was received

void setup() {
  // Konfiguracja pinów / Configure pins
  pinMode(BUTTON_PIN, INPUT); // Ustawienie przycisku jako wejścia bez podciągania / Set button as input without pull-up
  pinMode(LED_PIN, OUTPUT);          // Ustawienie diody LED jako wyjścia / Set LED as output
  pinMode(RELAY_PIN, OUTPUT);        // Ustawienie przekaźnika jako wyjścia / Set relay as output
  pinMode(RELAY_FEEDBACK_PIN, INPUT); // Ustawienie sprzężenia zwrotnego jako wejścia bez podciąganiem / Set feedback as input without pull-up

  // Wyłącz wszystko na start / Turn everything off at start
  digitalWrite(LED_PIN, LOW);        // Wyłącz diodę LED / Turn off LED
  digitalWrite(RELAY_PIN, LOW);      // Wyłącz przekaźnik / Turn off relay

  // Inicjalizacja portu szeregowego do debugowania / Initialize serial port for debugging
  Serial.begin(9600);
  Serial.println("Start symulacji"); // Informacja o rozpoczęciu symulacji / Simulation start message
}

void loop() {

  // Obsługa przycisku / Handle button
  if (digitalRead(BUTTON_PIN) == HIGH) { // Wciśnięty przycisk (stan wysoki) / Button pressed (high state)
    delay(50); // Debounce / Stabilizacja sygnału
    if (digitalRead(BUTTON_PIN) == HIGH && !buttonPressed) { // Jeśli przycisk jest wciśnięty i nie był wcześniej / If button is pressed and wasn't before
      buttonPressed = true; // Zaznacz, że przycisk został wciśnięty / Mark button as pressed
      Serial.println("BUTTON PUSH"); // Informacja o wciśnięciu przycisku / Button press message

      // Sterowanie przekaźnikiem / Relay control
      relayState = !relayState; // Zmień stan przekaźnika / Toggle relay state
      digitalWrite(RELAY_PIN, relayState); // Ustaw stan przekaźnika / Set relay state
      Serial.println("RELAY: " + String(relayState)); // Debugowanie stanu przekaźnika / Debug relay state

      // Krótka przerwa na aktywację przekaźnika / Short delay for relay activation
      delay(500);

      // Sprawdź sprzężenie zwrotne / Check feedback
      feedbackReceived = (digitalRead(RELAY_FEEDBACK_PIN) == HIGH); // Odczytaj stan sprzężenia zwrotnego / Read feedback state
      if (feedbackReceived) {
        Serial.println("FEEDBACK ON"); // Informacja o sprzężeniu zwrotnym / Feedback received message
        ledState = relayState; // Zmień stan diody LED zgodnie z przekaźnikiem / Set LED state according to relay
        digitalWrite(LED_PIN, ledState); // Ustaw stan diody LED / Set LED state
      } else {
        Serial.println("FEEDBACK OFF"); // Informacja o braku sprzężenia zwrotnego / No feedback message
        ledState = relayState; // Zmień stan diody LED zgodnie z przekaźnikiem / Set LED state according to relay
        digitalWrite(LED_PIN, ledState); // Ustaw stan diody LED / Set LED state
      }
    }
  }

  // Obsługa zwolnienia przycisku / Handle button release
  if (digitalRead(BUTTON_PIN) == LOW && buttonPressed) { // Jeśli przycisk został zwolniony / If button was released
    delay(50); // Debounce / Stabilizacja sygnału
    buttonPressed = false; // Zaznacz, że przycisk został zwolniony / Mark button as released
  }

  // Obsługa komunikacji przez konsolę / Handle communication via console
  // Serial.println("Czekam na dane z konsoli..."); // Debug - oczekiwanie danych / Waiting for data
  if (Serial.available() > 0) {
    char command = Serial.read();
    Serial.print("Otrzymano znak (ASCII): ");
    Serial.println((int)command); // Wyświetla wartość ASCII odebranego znaku / Print ASCII value of received character
    Serial.print("Otrzymano znak: ");
    Serial.println(command);

    if (command == '0') {
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState);
      Serial.println(ledState ? "LED ON" : "LED OFF");
    } else if (command == '1') {
      relayState = !relayState;
      digitalWrite(RELAY_PIN, relayState);
      Serial.println(relayState ? "Relay ON" : "Relay OFF");
    } else {
      Serial.println("Nieznana komenda");
    }
  }

}
VCC
PUSH
ON
OFF
FEEDBACK
BUTTON
H
L