• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Pomoc W projekcie
#1
Question 
projekt ma zmieniać zapalonego leda na innego po kliknięciu przycisku
kod:
int led1 = 0;

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
 
}

void loop() {
  int pinState = digitalRead(2);
  if (pinState == HIGH) {
    if (led1 == 1) {
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
    } else {
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
    }
  }
}
płytka to UNO r3
zdjęcie projektu: Angel

[Obrazek: 0?ui=2&ik=545d066b92&attid=0.1&permmsgid...85f8721&zw]
 
Odpowiedź
#2
Tak na pierwszy rzut oka widzę dwa problemy -
1. co będzie jak przycisk będzie wciśnięty trochę dłużej (taka pętla loop będzie wykonywać się tysiące razy na sekundę).
2. Nie zmieniasz wartości zmiennej led1 - zawsze będzie włączać ledy w ten sam sposób.

Nie wiem jak podłączyłeś przycisk, ale zwykle zwiera on pin do masy i gdy jest wciśnięty odczytuje się LOW. Szczególnie, że dałeś PULLUP.
 
Odpowiedź
#3
(09-12-2024, 13:44)oscarX napisał(a): Tak na pierwszy rzut oka widzę dwa problemy -
1. co będzie jak przycisk będzie wciśnięty trochę dłużej (taka pętla loop będzie wykonywać się tysiące razy na sekundę).
2. Nie zmieniasz wartości zmiennej led1 - zawsze będzie włączać ledy w ten sam sposób.

Nie wiem jak podłączyłeś przycisk, ale zwykle zwiera on pin do masy i gdy jest wciśnięty odczytuje się LOW. Szczególnie, że dałeś PULLUP.
poprawiłem kod, co myślisz?
Angel int ledState = 0; // Zmienna globalna do przechowywania stanu LED

void setup() {
  pinMode(2, INPUT_PULLUP); // Użycie wbudowanego rezystora podciągającego
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(3, LOW); // Ustawienie początkowego stanu LED1
  digitalWrite(4, LOW); // Ustawienie początkowego stanu LED2
}

void loop() {
  int buttonState = digitalRead(2); // Odczyt stanu przycisku

  if (buttonState == LOW) { // Przycisk wciśnięty (LOW dla INPUT_PULLUP)
    delay(50); // Krótki delay dla debouncingu
    if (digitalRead(2) == LOW) { // Sprawdzenie stanu przycisku po debouncingu
      ledState = 1 - ledState; // Przełączenie stanu LED
      if (ledState == 1) {
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
      } else {
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
      }
      while (digitalRead(2) == LOW) {
        // Poczekaj, aż przycisk zostanie zwolniony
      }
    }
  }
  delay(50);
}
 
Odpowiedź
#4
Jak wciskasz przycisk to ustawiasz ledState na 1, jeśli jest 1 to ustawiasz stany led, potem się loop powtarza i choć ledState jest już równy 1 to znowu go ustawiasz na 1, w sumie to ten ledState nie jest tu do niczego potrzebny.
Powinieneś w osobny bloku obsługi przycisku ustawiać go na 1, a w loop zerować, np. na końcu loop.
Wtedy jeśli jest 1 to znaczy przycisk był wciśnięty i możesz coś z tym zrobić w kolejnym bloku programu. Właściwie to po wciśnięciu powinieneś zmieniać jego stan - jak był 1 to ustaw 0 i vice versa. Albo dla bloku przycisku zrobić sobie zmienna sygnalizującą, że przycisk był wciśnięty i zerować go na końcu loop, a zmienną ledState zmienić w bloku obsługi przycisku.
Natomiast do przełączania możesz sobie zrobić ifa jak teraz, lub switch case gdyby tych stanów miało być więcej.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości