Skocz do zawartości

LCD 2x16 ESP32 – problem w wyświetlaniu tekstu


jakub51996

Pomocna odpowiedź

8 minut temu, Gieneq napisał:

Rozwiązanie zaproponowane miało zapewnić to o co autor prosił w pierwszej kolejności:

Wybacz, ale akurat nie zapewniło. Pamiętaj: pomagając komuś bierzesz na siebie pewną odpowiedzialność, jeśli w ramach pomocy pokażesz błędny kod osoba, której pomagasz ma prawo pomyśleć że "tak trzeba". Prosisz o wnikliwe czytanie... a ja proszę o wnikliwe czytanie własnych postów. A w szczególności o zaniechanie usprawiedliwiania się "bo to tylko tak w pierwszej kolejności", a zamiast tego "o, pomyliłem się, już poprawiam!".

Link do komentarza
Share on other sites

Dobrze, coś źle zrobiłem przepraszam. Obawiam się jednak, że jest coś co może dużo bardziej zaszkodzić, niż niekompletny program - dlatego proszę o kulturę w rozmowach. Bo zdaję sobie sprawę, że na forum trafiają różni ludzie, też młodsi i jak widzę komentarz gdzie ktoś na starcie, że tak ujmę zostaje zjechany, to zastanawiam się czy ten człowiek tu wróci. Dlatego fajnym pomysłem jest PPF co wprowadził Treker i trzymanie się tego na pewno pomoże uniknąć robienia problemów.

Link do komentarza
Share on other sites

Możesz też spróbować tak:

#include <LiquidCrystal_I2C.h>

// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);  
int buttonpin = 26;
volatile bool buttonState = false;
unsigned char stateCnt = 0;;
void setup() 
{ 
  lcd.init();
  // turn on LCD backlight                      
  lcd.backlight();
  pinMode(buttonpin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(buttonpin), button, FALLING);
}

void loop() {
  if(buttonState == true){
    
     noInterrupts(); // w celu uniknięcia niepożądanych przerwań wywołanych drganiem styków
                     // czas na wysłanie tekstu do wyświetlacza jest wystarczający aby przeczekać debouncing
     lcd.clear();
     lcd.setCursor(0, 0); 
     
     if (!(stateCnt % 2)) { // Dzielenie modulo, zwraca resztę z dzielenia lub 0 jeśli parzysta
      
        lcd.print("Hello, World!");
        
     }else{
    
        lcd.print("Home, come!");

     }
     
     buttonState = false;
     stateCnt++;
     interrupts();
  }
}
void button(void) {
  buttonState = true;
}

 

Link do komentarza
Share on other sites

A zamiast bawić się we włączanie/wyłączanie przerwań ręcznie możesz zastosować ATOMIC_BLOCK (tak bardziej profesjonalnie, chociaż tak naprawdę to robi to samo).

Tyle, że ja bym nie blokował przerwań, a dał na końcu buttonState = false (zresztą już tam jest). Pomyślcie dlaczego 🙂

BTW. if (buttonState == true) to pleonazm...

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

7 minut temu, ethanak napisał:

Pomyślcie dlaczego

Racja, nie ma sensu wyłączać przerwań w tym wypadku ale gdyby np. zamiast prostego zerowania zmiennej na końcu bloku if w przerwaniu inkrementowany byłby jakiś licznik to miałoby to znaczenie. Wyłączanie wszystkich przerwań też nie jest najlepszym pomysłem, lepiej byłoby wyłączyć tylko to konkretne przerwanie w danej sytuacji, które ma wpływ na poprawność wykonywania programu.

12 minut temu, ethanak napisał:

BTW. if (buttonState == true) to pleonazm...

😄 Zgadza się ale na początku łatwiej zrozumieć kiedy jest jawnie napisane, wygląda bardziej naturalnie.

Link do komentarza
Share on other sites

A kiedy się wykona zaległe przerwanie i po co? W tym przypadku trzeba pominąć efekt przerwania (co doskonale robi ustawienie buttonState na false). Teoretycznie można to zrobić przez detachInterrupt - tylko po co?

Link do komentarza
Share on other sites

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.