/*
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.
}
Control to Motor Driver