Skocz do zawartości

LCD 2x16 ESP32 – problem w wyświetlaniu tekstu


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!".

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.

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;
}

 

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...

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.

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?

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...