/*
Arduino | coding-help
PaNdA — 1/14/25 at 7:26 PM
hi guys so my project have some issues, basicly i have no idea 
where problem is, is it in hardware or in code, so my project 
should work in simple way, after its turn on the greenLED1 turn 
on and stay on until slide switch turn LOW from HIGH, after that 
the blueLED should turn on and wait for input from button1 for 
futher action where it turn the motor on and yellowLED but insted 
every 5s every led turn on for second and buzzer is making a sound. 
So my slide switch is working in some way because when its high its 
actually is doing what is suppose to (greenLED1 on) and when its 
LOW the proces begins but the proces is fucked up. Button2 act as 
a emergency button with redLED indicating an error. 
Can someone help me with that? 
*/

/************************************************
 * Kod z uwzględnieniem:
 *  - Gdy slideswitch = HIGH -> greenLED1 ON
 *  - 5s czekania po wykryciu pivot (LOW),
 *  - Niebieska dioda + beep -> czekamy na button1
 *  - Start silnika + żółta dioda
 *  - Po powrocie slideswitch na HIGH -> koniec
 *  - button2 (awaryjny) w każdym momencie
 ************************************************/

// Definicje pinów
int buzzer      = 4;
int dcmotor     = 3;
int greenLED1   = 11;  // Zielona dioda "gotowość" (świeci gdy slideswitch = HIGH)
int blueLED     = 10;  // Niebieska: "można uruchomić"
int yellowLED   = 9;  // Żółta: "silnik pracuje"
int greenLED2   = 8;  // Zielona2: "zakończenie" (finish)
int redLED      = 7;  // Czerwona: "awaryjne"
int button1     = 6;  // Start silnika (wciśnięty = LOW)
int button2     = 5;  // Awaryjny (wciśnięty = LOW)
int slideswitch = 12;  // Suwak: HIGH = poziom, LOW = pivot

// Flagi stanu
bool isPivoted     = false;  // Czy suwak był przechylony (LOW)
bool motorRunning  = false;  // Czy silnik aktualnie pracuje

void setup() {
  pinMode(buzzer,      OUTPUT);
  pinMode(dcmotor,     OUTPUT);
  pinMode(greenLED1,   OUTPUT);
  pinMode(blueLED,     OUTPUT);
  pinMode(yellowLED,   OUTPUT);
  pinMode(greenLED2,   OUTPUT);
  pinMode(redLED,      OUTPUT);

  pinMode(button1,     INPUT_PULLUP); // wciśnięty=LOW
  pinMode(button2,     INPUT_PULLUP); // awaryjny=LOW
  pinMode(slideswitch, INPUT_PULLUP); // HIGH=poziom, LOW=pivot

  // Stan początkowy: sprawdź suwak. Jeśli HIGH -> zielona ON, w przeciwnym razie OFF
  if (digitalRead(slideswitch) == HIGH) {
    digitalWrite(greenLED1, HIGH);
  } else {
    digitalWrite(greenLED1, LOW);
  }

  // Reszta diod i silnik OFF
  digitalWrite(blueLED,   LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED2, LOW);
  digitalWrite(redLED,    LOW);
  digitalWrite(dcmotor,   LOW);
}

void loop() {
  // 1) ZAWSZE sprawdzaj przycisk awaryjny (button2)
  if (digitalRead(button2) == LOW) {
    emergencyStop();
    return; // po emergencyStop wracamy na początek loop()
  }

  // 2) Jeśli slideswitch = HIGH -> greenLED1 ON cały czas
  //    Jeśli LOW -> greenLED1 OFF
  if (digitalRead(slideswitch) == HIGH) {
    digitalWrite(greenLED1, HIGH);
  } else {
    digitalWrite(greenLED1, LOW);
  }

  // 3) Reakcja na przejście slideswitch w LOW (pivot)
  if (!isPivoted && (digitalRead(slideswitch) == LOW)) {
    // Dopiero co pivotowano
    isPivoted = true;
    // Wyłącz "gotowość" LED1, bo zgasimy ją w if-ie powyżej
    // i czekamy 5 sekund
    delay(5000);

    // Po 5s -> włącz niebieską i beep 0.5s
    digitalWrite(blueLED, HIGH);
    tone(buzzer, 1000, 500); 
  }

  // 4) Jeśli suwak jest pivoted (isPivoted) i silnik nie pracuje,
  //    a user wciśnie button1 (LOW), startujemy silnik
  if (isPivoted && !motorRunning && (digitalRead(slideswitch) == LOW)) {
    if (digitalRead(button1) == LOW) {
      motorRunning = true;
      // Gasimy niebieską
      digitalWrite(blueLED, LOW);
      // Zapalamy żółtą
      digitalWrite(yellowLED, HIGH);
      // Włączamy silnik
      digitalWrite(dcmotor, HIGH);
    }
  }

  // 5) Jeśli silnik pracuje i suwak wraca na HIGH => koniec
  if (motorRunning && (digitalRead(slideswitch) == HIGH)) {
    // Wyłącz silnik
    motorRunning = false;
    digitalWrite(dcmotor, LOW);
    // Gasimy żółtą
    digitalWrite(yellowLED, LOW);

    // Zapalamy greenLED2 na 5s
    digitalWrite(greenLED2, HIGH);
    delay(5000);
    digitalWrite(greenLED2, LOW);

    // Reset stanu pivot
    isPivoted = false;
    // Zielona LED1 powinna już być ON (bo slideswitch=HIGH),
    // ale jeśli chcesz, możesz jawnie ustawić:
    // digitalWrite(greenLED1, HIGH);
  }
}

//-----------------------------------------------------------
// Awaryjne zatrzymanie - wciśnięcie button2
//-----------------------------------------------------------
void emergencyStop() {
  // Wyłącz silnik i diody operacyjne
  motorRunning = false;
  isPivoted    = false;

  digitalWrite(dcmotor,   LOW);
  digitalWrite(blueLED,   LOW);
  digitalWrite(yellowLED, LOW);
  digitalWrite(greenLED2, LOW);
  
  // Wyłącz też greenLED1 (lub zostaw włączoną - zależnie od preferencji)
  digitalWrite(greenLED1, LOW);

  // Włącz czerwoną LED na 3s
  digitalWrite(redLED, HIGH);
  delay(3000);
  digitalWrite(redLED, LOW);

  // Po awaryjnym - wracamy do stanu w którym suwak decyduje o greenLED1
  // (czyli jak suwak=HIGH, zielona się świeci; suwak=LOW - zielona gaśnie)
  // Nic nie musimy tu specjalnie ustawiać poza tym, że isPivoted = false.
}
$abcdeabcde151015202530354045505560fghijfghij
Control to Motor Driver