Utilizarea operatorilor logici (Arduino, Programare)

Michael Niebauer a intrebat.

Acesta este un fragment de cod dintr-un program pe care îl scriu. Am un program care aprinde un LED și, dacă un buton este apăsat când LED-ul este aprins, vreau ca acesta să se adauge la un contor și să tipărească valoarea contorului. Problema se pare că declarația mea if este sărită. În acest moment, bucla while este configurată pentru 5 secunde folosind millis() și rămâne oprită folosind o scurtă întârziere. Această parte (button_press_9()))) este un apel de funcție către un boolean pe care l-am configurat pentru debouncing. Dacă aș pune apelul de funcție într-o declarație if de sine stătătoare, de exemplu, pentru a o testa. Funcționează și va aprinde și stinge un LED. Se pare că combinația dintre cele două este incompatibilă.

Vă mulțumesc în avans.

unsigned long previousMillis = millis();
unsigned long currentMillis = millis();

while ((currentMillis - previousMillis) < onTime)
{
    digitalWrite(ledPin4, HIGH);
    if (ledPin4 == HIGH && (button_press_9()))
    {
        counter++;
        Serial.println(counter);
        currentMillis = onTime * 100;
    }
    currentMillis = millis();
}
digitalWrite(ledPin4, LOW);
delay(1000);

Comentarii

  • ledPin4 == HIGH? Bănuiesc că te referi la altceva. –  > Por Mikael Patel.
  • De asemenea, currentMillis = onTime * 100; are puțin sens. Ce ai făcut de fapt înseamnă? –  > Por Edgar Bonet.
  • @EdgarBonet L-am pus acolo pentru ca, dacă LED-ul era HIGH și butonul era apăsat, să se încheie cronometrul în bucla while –  > Por Michael Niebauer.
  • @MikaelPatel Am setat LED-ul la HIGH și apoi am folosit o instrucțiune if pentru a verifica dacă este HIGH și dacă butonul a fost apăsat în același timp. Nu am folosit there == pentru a atribui starea HIGH –  > Por Michael Niebauer.
  • Atunci vrei să spui currentMillis = previousMillis + onTime, , dar asta nu va funcționa pentru că atribuiți currentMillis = millis(); imediat după. În schimb, puteți pur și simplu break din while bucla. –  > Por Edgar Bonet.
1 răspunsuri
Gerben

Ar trebui să folosiți

if (digitalRead(ledPin4) == HIGH && (button_press_9()))

în loc de

if (ledPin4 == HIGH && (button_press_9()))

Comentarii

  • Deoarece pinul a fost setat la HIGH chiar înainte, prima parte a testului pare inutilă. Puteți face doar if (button_press_9()). –  > Por Edgar Bonet.