Skocz do zawartości

Skrócona negacja warunku / wydzielone z Kurs Arduino - #2


troll5662

Pomocna odpowiedź

#define p1 8
#define p2 9
#include<LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup() {
  pinMode(p1, INPUT_PULLUP);
  pinMode(p2, INPUT_PULLUP);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("login ");
  lcd.setCursor(0, 1);
  lcd.print("haslo ");
}
  

void loop() {
  if (digitalRead(p1) == LOW) {
    lcd.setCursor(6, 0);
    lcd.print("przyklad1");
    lcd.setCursor(6, 1);
    lcd.print("przyklad1");
  } else if (digitalRead(p2) == LOW) {
    lcd.setCursor(6, 0);
    lcd.print("przyklad2");
    lcd.setCursor(6, 1);
    lcd.print("przyklad2");
  } else if (digitalRead(p1) && (p2) == LOW) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("login");
    lcd.setCursor(0, 1);
    lcd.print("haslo");
  }
}

jak zrobić żeby po puszczeniu wszystkich przycisków pokazywało się tylko ,,login'' i ,,haslo''?

Link do komentarza
Share on other sites

To dlaczego pierwszy przycisk p1 sprawdzasz za pomocą digitalRead(p1) a drugi przycisk p2 inaczej (a raczej nie sprawdzasz p2)?

Jeżeli już to ten warunek powinien wyglądać tak (przy założeniu, że naciśnięcie p1 i p2 to podanie GND na odpowiednie porty Arduino):

if (digitalRead(p1)==LOW && digitalRead(p2) == LOW)

Samo p2 nigdy nie będzie LOW - warunek np. if(p2==LOW) nigdy nie będzie spełniony gdyż p2 wcześniej definiujesz jako stałą p2=9. W programowaniu tak się przyjęło, że 0 oznacza FALSE, a niezerowa wartość oznacza TRUE. Dlatego np. warunek if(9) coś_tam_coś_tam zawsze jest prawdziwy (TRUE)!

Taki warunek (jak potrzebujesz) pewnie można napisać także tak:

if(!digitalRead(p1) && !digitalRead(p2))........

Edytowano przez Belferek
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dokładnie - to negacja. Czyli jeśli chcemy sprawdzić czy stan portu jest równy LOW (0) to możemy:

if(digitalRead(port)==LOW) lub

if(digitalRead(port)==0) lub

if(!digitalRead(port)) (zanegowana wartość odczytana z portu) lub

if(digitalRead(port)!=1) lub

if(digitalRead(port)!=HIGH) etc....

Zobacz: Arduino reference

Edytowano przez Belferek
  • Lubię! 1
Link do komentarza
Share on other sites

Oczywiście podana tu metoda z negacją w warunku jest poprawna. Jednak szczerze mówiąc odradzałbym ją (przynajmniej na początku), bo nie jest zbyt czytelna i można się łatwo pomylić. Jeśli ktoś ją dobrze rozumie, to oczywiście może używać takiej wersji, ale nie ma potrzeby uczyć się tego i stosować "na siłę" takiej wersji zapisu. Oszczędność znaków praktycznie zerowa, a komplikuje zrozumienie warunku 😉

Link do komentarza
Share on other sites

:)) ja to rozumiem tak, że skoro digitalRead to musi coś odczytać, a skoro zanegowane digitalRead znaczy "nic nie odczytuje", znaczy false, znaczy LOW...:-D

Edytowano przez SOYER
Link do komentarza
Share on other sites

No nie do końca SOYER. Należy to rozumieć tak, że digitalRead zwraca wartość  HIGH lub LOW, które są stałymi typu boolean czyli TRUE lub FALSE (1,0). Znak ! oznacza negację logiczną zwracanego wyniku. Funkcja digitalRead zawsze coś zwróci.

Edytowano przez Belferek
Link do komentarza
Share on other sites

Zacznijmy od jednego: nigdy nie należy radośnie zakładać, że funkcje tego typu zwrócą dwie magiczne konkretne wartości, czyli jakiś LOW i HIGH. Zamiast tego bezpieczniej jest założyć, że funkcja zwraca albo zero, albo jakąkolwiek wartość niezerową. Wtedy okaże się, że operacje logiczne zastosowane zamiast arytmetycznych porównań są całkiem w tym miejscu naturalne.

Akurat funkcja digitalRead zwraca sobie jakieś tam LOW i HIGH, ale np. fastDigitalRead zwraca albo zero, albo coś innego 😉

Czyli przekładając to na SOYER'owe ify:

if (fastDigitalRead(PIN)) cośtam();

wykona się na pewno jeśli pin będzie w stanie wysokim, ale już

if (fastDigitalRead(PIN) == HIGH) cośtam();

już niekoniecznie...

Tak przy okazji: @SOYER - zajrzyj sobie do jakiegoś fajnego podręcznika albo chociażby do wikipedii i poczytaj o operatorach w C/C++... wiem że akurat Ty nie będziesz burczał że "odsyłajom do gógla" tylko z samej ciekawości zajrzysz tutaj. 🙂

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ethanak czyli fastDigitalRead to taki analogRead? Czym to się różni?

Trochę tych operatorów oczywiście znam, więcej jeszcze nie, operatory bitowe np. to chyba do operacji na bitach(?), czarna magia dla mnie ;-). Dzięki za linka, zobaczyłem ile jeszcze nie wiem, np. tego że w operatorach logicznych tez obowiązuje zasada kolejności wykonywania zadań. niby logiczne, że tak jest ale jeszcze nie uzywałem jakiś złożonych wyrażeń i o tym nie wiedziałem...

Na !digitalRead zwróciłem uwagę bo to takie "nieoczywiste", "skrót myślowy" od digitalRead !=HIGH....

Edytowano przez SOYER
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.