Skocz do zawartości

Pomocna odpowiedź

A skąd wziąłeś taką formę konstruktora? Sam wymyśliłeś? Piny podajesz przy inicjalizacji Wire (jeśli nie podasz to masz domyślną), a nie wyświetlacza.

Zresztą poprzednia z jednym parametrem (4) też była nieprawidłowa - w końcu pin RESET masz niepodłączony bo wyświetlacz go nie ma. Na szczęście ten driver jest odporny na tego typu błędy...

Prawidłowy konstruktor jest taki:

Adafruit_SSD1306(uint8_t w, uint8_t h, TwoWire *twi = &Wire,
                   int8_t rst_pin = -1, uint32_t clkDuring = 400000UL,
                   uint32_t clkAfter = 100000UL);

Interesują Ciebie trzy pierwsze parametry: rozmiar ekranu i instancja Wire.

Czyli:

 

Adafruit_SSD1306 display(128,32,&Wire);

A w setup():
 

Wire.begin(OLED_SDA, OLED_SCL);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Sprawdź.

 

26 minut temu, farmaceuta napisał:

nie chce mi się sprawdzać co ten konstruktor ma za argument

To się nie odzywaj dopóki nie sprawdzisz bo bzdury piszesz.

(edytowany)
42 minuty temu, ethanak napisał:

A skąd wziąłeś taką formę konstruktora?

Przeanalizowałem kilka(naście) kodów, które były użyte z ESP32 oraz OLED. Wszędzie zostały zdefiniowane piny SCL i SDA jako 21 i 22 i następnie użyte w konstruktorze wyświetlacza.

Tak, teraz jest ok - tylko muszę spowolnić przewijanie, bo mam "strusia pędziwiatra"

 

edit - spowolnione:

x=x-1 i jest ok.

@ethanak dlaczego konstruktor wyświetlacza ustawiony jako 128x32 a nie 128x64?

Adafruit_SSD1306 display(128,32,&Wire);

Edytowano przez prezesedi
24 minuty temu, prezesedi napisał:

dlaczego konstruktor wyświetlacza ustawiony jako 128x32 a nie 128x64

A jaki masz wyświetlacz? Wstawisz taki jak masz podłączony.

25 minut temu, prezesedi napisał:

Wszędzie zostały zdefiniowane piny SCL i SDA jako 21 i 22 i następnie użyte w konstruktorze wyświetlacza.

Szybciej byłoby zajrzeć na własny dysk - w pliku Arduino/libraries/Adafruit_SSD1306/Adafruit_SSD1306.h masz bardzo ładnie wypisane wszystkie możliwe konstruktory.

 

1 minutę temu, ethanak napisał:

A jaki masz wyświetlacz?

No właśnie 128x64 dlatego się zdziwiłem. 

1 minutę temu, ethanak napisał:

Szybciej byłoby zajrzeć na własny dysk - w pliku Arduino/libraries/Adafruit_SSD1306/Adafruit_SSD1306.h masz bardzo ładnie wypisane wszystkie możliwe konstruktory.

A tego nie wyczytałem nigdzie a to bardzo ciekawe/pomocne

Przed chwilą, prezesedi napisał:

No właśnie 128x64 dlatego się zdziwiłem. 

O, byłem przekonany że 128x32 (taki 0.91 cala do wyświetlacza na peronie).

3 minuty temu, prezesedi napisał:

A tego nie wyczytałem nigdzie a to bardzo ciekawe/pomocne

Ogólnie w Arduini/libraries siedzą wszystkie biblioteki które sobie dociągasz przez managera bibliotek. I zawsze albo w głównym katalogu biblioteki, albo w katalogu src są pliki nagłówkowe z których bardzo dużo można wyczytać nie sięgając do internetu 🙂

  • Pomogłeś! 1
(edytowany)

Taaaaak. Muszę to jutro przejrzeć. 

Próbuję jeszcze zwolnić przewijanie zmieniając parametr x=x-1 niestety chyba nie da się bardziej? Wartości dodatnie nie działają.

Edytowano przez prezesedi

Musisz opóźnić wyświetlanie np. przed switch(y) dać warunek że od poprzedniego wyświetlenia ma upłynąć co najmniej ileś tam milisekund. Ewentualnie możesz x zadeklarować jako float, odejmować ułamek i jeśli kompilatorowi się coś nie spodoba - do setCursor przekazywac (int)x.

Ale ja bym najpierw uporzadkował kod, zrobił jakieś uniwersalne funkcje do wyświetlania... ale to może już nie dzisiaj 🙂

Tak, żona też już zaprzęgła muły by mnie odciągnąć od komputera - 8h w pracy 6h w domu - będziesz promieniować.

Dziękuję za pomoc i do jutra

Dzień dobry. Jak na razie udało mi się rozszerzyć kod a nie uporządkować. Sprawdziłem czy na ESP32 możliwe jest przypisanie kolejnych przycisków z kolejnymi wiadomościami do wyświetlania - tak, jest możliwe i zrobiłem komplet - do 9tki włącznie. Wychodzi na to, że UNO nie radziło sobie z tak długim kodem, bo gdy było zdefiniowanych więcej niż 5 przycisków to odmawiało wyświetlania. Udało mi się także opóźnić przewijanie dając zgodnie ze wskazówkami delay(500); przed switch(y);. Działa zgodnie z założeniem.

2 godziny temu, prezesedi napisał:

Wychodzi na to, że UNO nie radziło sobie z tak długim kodem

Tu nie chodziło o długość kodu, a o zajętość pamięci. Można to było zrobić na UNO, ale trzeba by było zaprząc do tego pewne mechanizmy któ©e nie są potrzebne w ESP32.

2 godziny temu, prezesedi napisał:

Udało mi się także opóźnić przewijanie dając zgodnie ze wskazówkami delay(500); przed switch(y);

A gdzie ja mówiłem o delay?

Chodziło mi bardziej o taką konstrukcję:

#define SCROLL_STEP 500UL

static uint32_t displayctl= millis();
...

if (millis() - displayctl < SCROLL_STEP) return;
displayctl = millis();
// i teraz
switch(y) { 
  ...

Wtedy nie ma opóźnienia w działaniu klawiatury.

Ale w sumie pobawiłbym się teraz upraszczaniem kodu.

Stwórzmy sobie funkcję realizującą wyświetlanie rozkładu:

void wyswietl(const char *msg1, const char *msg2, const char *msg3, const char *msg4)
{
    display.clearDisplay();
    display.setTextSize(1); // wystarczy raz
    display.setCursor(x,0);
    display.print(msg1);
    display.setCursor(x,8);
    display.print(msg2);
    display.setCursor(x,16);
    display.print(msg3);
    display.setCursor(x,24);
    display.print(msg4);
    display.display();
    x -= 1;
}

Można jej teraz użyć w programie zamiast powielać ten sam kod, czyli wyglądałoby to tak:

void loop()
{
    ... // tu czytanie klawiatury, delaje, i takie tam różne

    switch(y) {
        case 1:
        wyswietl(message1, message2, message3, message4);
        break;

        case 2:
        wyswietl(message5, message6, message7, message8);
        break;

     // i tak dalej
     

Prawda, że prościej? A przy tym w razie konieczności rozszerzenia o kolejne komunikaty powielasz tylko trzy linijki kodu. Nie wspomnę już o tym, że jeśli będziesz coś chciał zmienić w funkcji wyświetlania będzie to dużo prostsze...

Zastanów się czy pójdziesz w tę stronę. Jeśli tak, pójdziemy dalej. Szczerze mówiąc, podoba mi się idea tego wyświetlacza w makiecie i dobrze by było opracować coś, z czego następni będą mogli skorzystać...

 

Wszystkie powyższe kawałki kodu działają poprawnie i mają już zastosowanie w całości.

15 godzin temu, ethanak napisał:

Musisz opóźnić wyświetlanie

no i skojarzyłem sobie z delay() 😞 😞 😞 aż dziwne, że przyniosło pożądany efekt.

Jeśli pod klawiszem 0 chciałbym wyczyścić ekran i zaprzestać wyświetlanie, to czy poprawny będzie poniższy kawałek kodu? (bo u mnie działa tak jak powinien)

} else if (key == '0') { 
   delay(500);
   x= display.width();
   y = 0;
   kopia = 0;
}

i

case 0:
        display.clearDisplay();
        display.display();
        break;

ale pewnie nie jest poprawny 🙂

13 minut temu, prezesedi napisał:

ale pewnie nie jest poprawny

Akurat prawie jest.

delay() w tym przypadku to takie najprostsze połączenie debouncingu i jakiejś sensownej reakcji na wciśnięcie klawisza. Co ciekawsze: absolutnie nie jest w tym przypadku potrzebny - biblioteka obsługuje zarówno debouncing, jak i reakcję na zbocze. Potrzebny jest jedynie w przypadku bezpośredniego łączenia pojedynczych klawiszy do GPIO (chociaż w tym przypadku też lepiej użyć specjalizowanej bioblioteki).

Czyszczenie ekranu jest oczywiste, ale... po co czyścić czysty ekran?

Umieszczenie delay() przed switchem (czyli realizacją wyświetlania) wywoła pewien niepożądany efekt: mianowicie odczyt klawiatury będzie się odbywał zamiast ciągle - co jakiś czas (czyli w Twoim przypadku delay(500) co pół sekundy albo i wolniej). Może to spowodować zgubienie informacji o wciśnięciu klawisza (jeśli zdążysz wcisnąć i puścić klawisz w ciągu pół sekundy kiedy procek nie zajmuje się Twoim programem). Dlatego zaproponowałem trochę bardziej skomplikowana konstrukcję.

A tak przy okazji - do czego jest zmienna "kopia", bo Twój sposób nazywania zmiennych jest... jakby tu powiedzieć... niezbyt standardowy 😉

 

 

A więc czyszczenie czy jest potrzebne? Chciałem coś zrobić i pomyślałem, że można "wyciszyć wyświetlacz". Są okresy, gdy pociągi nie kursują i informacja na wyświetlaczu jest zbędna. A przecież nie będę odcinać zasilania.

ZNACZNA większość kodu pochodzi od Was - forumowiczów. Więc i zmienna "kopia" nie jest moim dziełem. Szczerze mówiąc jeszcze jej nie rozumiem, jak i tego dlaczego poniższa linijka kodu wygląda następująco - jest dla mnie niepoprawna (minus przed znakiem równości) patrząc czysto matematycznie.

x -= 1;

Szukam właśnie informacji na ten temat.

i znalazłem: odejmowanie x = x - y lub x -= y;

dekrementacja zmniejszenie wartości zmiennej o jeden zmienna -= 1; (czy to jest to samo co zapis --1)?

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