Skocz do zawartości

Plik na karcie SD zawierający program, który wykonuje Arduino.


Szmyterling

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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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.

 

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ł:

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

 

Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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 😉

 

 

Link do komentarza
Share on other sites

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)?

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.