Skocz do zawartości

Zmiana danych wyświetlanych na ekranie LCD po kliknięciu przycisku


Januszxd

Pomocna odpowiedź

Dzień dobry, nie za bardzo potrafię poradzić sobie z jednym problemem. Mianowicie chciałem na wyświetlaczu LCD najpierw wyświetlać w jednej linijce pomiar temperatury, a w drugiej pomiar wilgotności. Natomiast po kliknięciu przycisku chciałem, żeby wyświetlacz się wyczyścił i pokazał w pierwszej linijce pomiar ciśnienia, a w drugiej pomiar wysokości. Do tej pory wymyśliłem taki kod(dla testów, jeszcze bez podłączania czujników), ale niestety nie działa on tak jak chce. Wyświetlacz jedynie miga napisem "siemano" i nie reaguje na przycisk.

#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

int przycisk = 1;

void setup() {
   lcd.begin(16, 2);
   pinMode(3, INPUT_PULLUP);
}
void loop() {
  
 if (przycisk == 1) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("siemano");
  }
 if (przycisk == 2) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("kolano");
 }
 
if (digitalRead(3) == LOW) {
  while (true) {
  przycisk = przycisk + 1;
  if (przycisk > 2) {
  przycisk = 1;
  break;
  }
 }

  }
}

Czy ktoś mógłby powiedzieć jak należy rozwiązać ten problem?

Z góry dzięki za pomoc.

Link do komentarza
Share on other sites

Kiedy wciskasz przycisk, Twój program w kółko zmienia wartość zmiennej przycisk od 1 do 3. Aby rozwiązać problem, możesz np. wykorzystać przerwanie i w funkcji obsługiwanej przez nie zwiększać wartość zmiennej przycisk o 1 w momencie wciśnięcia przycisku:

attachInterrupt(digitalPinToInterrupt(3),przyciskPlus,Falling);

void przyciskPlus(){
  przycisk++;
}

a następnie w pętli głównej sprawdzać wartość zmiennej przycisk i jeżeli jest większa od 2, zmniejszać ją do 1.

Link do komentarza
Share on other sites

Przede wszystkim błąd w założeniach. Kod ma reagować na zmianę stanu przycisku (tzn. nie był wciśnięty a teraz jest) a nie na to, że jest wciśnięty.

Można się bawić w dodatkowe zmienne (wybacz, już parę razy o tym na forum pisałem, szósty raz nie będę) ale najprościej będzie użyć bibliotekę Bounce2 i metodę fell().

Link do komentarza
Share on other sites

bool s = 0;

if (digitalRead(3) == LOW ) {
  if (s == 0) {
  s = 1;
  przycisk += 1;
  
  if (przycisk > 2) {
  przycisk = 1;
    }
   
    }
  delay(200);
} else {
  s = 0;
  }

To takie najprostsze

Edytowano przez farmaceuta
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

1 minutę temu, ethanak napisał:

@farmaceuta na pewno prostsze niż


if (guzik.fell()) przycisk = 3 - przycisk;

?

Nie no jasne ze ze prostrza twoja wersja...ja nic o bounce nie wspominam bo szczerze nigdy nie korzystalem, ale jak najbardziej kolega zrobi tak jak piszesz bo faktycznie strasznie to prosto wyglada..😉

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.