SOYER Styczeń 14, 2022 Udostępnij Styczeń 14, 2022 Jak coś jest głupie i działa to wcale nie jest takie głupie.😁 1 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED szerokość #define SCREEN_HEIGHT 64 // OLED wysokość #define OLED_RESET 4 #define SCREEN_ADDRESS 0x3c //adres fizyczny wyswietlacza Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define przyciskEnter 8 //zdefiniowane piny dla przycisków #define przyciskGora 9 #define przyciskDol 10 #define przyciskBack 11 #define Silnik1 2 //zdefiniowane piny dla silnikow #define Silnik2 3 void setup() { display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); pinMode(przyciskEnter, INPUT_PULLUP); pinMode(przyciskGora, INPUT_PULLUP); //ustawienie pinów dla przycisków " wejście" podciągnięty pinMode(przyciskDol, INPUT_PULLUP); //rezystor wewnętrzny PULLUP pinMode(przyciskBack, INPUT_PULLUP); pinMode(Silnik1, OUTPUT); //ustawienie pinów dla silnikow "wyjście" pinMode(Silnik2, OUTPUT); } void loop() { menuGlowne(); } int menuEkran = 1; int menuEkran1 = 1; void menuGlowne(){ switch(menuEkran){ case 1: if (digitalRead(przyciskDol)== LOW){ //jesli przycisk wcisniety display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println(" SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 1 display.println("> SILNIK 2"); display.display(); menuEkran = 2;} break; case 2: if (digitalRead(przyciskGora)== LOW){ //jesli przycisk wcisniety display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 2 display.println(" SILNIK 2"); display.display(); menuEkran = 1;} break; /* case 3: if (digitalRead(przyciskEnter)== LOW){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 1 display.println(" SILNIK 2"); display.display(); menuEkran = 1;} menuSilnik1(); break; } } void menuSilnik1(){ switch(menuEkran1){ case 1: if (digitalRead(przyciskGora)== LOW){ //jesli przycisk wcisniety display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(20,10); display.println("SILNIK 1"); display.setCursor(10,40); display.println(" ON"); display.setCursor(60,40); display.println("> OFF"); display.display(); menuEkran1 = 2;} break; /* case 2: if (digitalRead(przyciskDol)== LOW){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(20,10); display.println("SILNIK 1"); display.setCursor(10,40); display.println("> ON"); display.setCursor(60,40); display.println(" OFF"); display.display(); menuEkran1 = 1;} break; case 3: if (digitalRead(przyciskBack)== LOW){ menuGlowne(); }*/ } } @SOYER może nie zwracaj na razie uwagi na ten fragment od komentowany, bo tu tylko było poprawianie tych nawiasów klamrowych żeby przy kolejnej funkcji nie wyskakiwał ten błąd że nie zadeklarowana. Co innego mnie teraz zastanawia w tej części pierwszej menuGlowne(), bo czegoś dalej nie rozumie. W momencie załadowania tego szkicu na płytkę wyświetla się ekran z case 1: żeby przejść dalej czyli przerzucić marker np. na silnik 1 musze najpierw wcisnąć przycisk w dół a następnie w górę i wtedy marker przeskakuje i dalej już reaguje poprawnie, i jeżeli zostawię marker na pozycji silnik1 i zrestartuje płytkę przyciskiem to po ponownym starcie programu wyświetla się ekran z markerem na silnik 1 i kod działa od razu dobrze ale nie stratuje tak jak po załadowaniu na płytkę od wyświetlania opcji z case 1:, ogólnie zauważyłem że na jakiej opcji wyświetlania zostawię tzn. czy marker jest na silnik1 czy jest na silnik2 to po restarcie płytki przyciskiem, na tej opcji wyświetlania się po restarcie pojawi. Więc pomyślałem że płytkę całkowicie odłączę od zasilania, po odłączeniu odczekałem chwilę żeby kondensatory się rozładowały, po podłączeniu pojawiły się rozsiane piksele ale w momencie wciśnięcia przycisku, menu się pokazało i działało poprawnie. Myślę że czegoś tu jeszcze brakuje związanego z wyświetlaczem coś jakby wyświetlania początkowego, od czego by program startował na wyświetlaczu a potem sprawdzał czy jakiś przycisk został wciśnięty i przechodził do kolejnych case. Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 Nie znam się na tych wyświetlaczach który stosujesz, ale tak na szybko, to raczej sprawa funkcji samego wyświetlacza który być może "pamięta" ostatni ekran przed shutdownem. Co do tego pytania: 52 minuty temu, Norbert7630 napisał: . W momencie załadowania tego szkicu na płytkę wyświetla się ekran z case 1: żeby przejść dalej czyli przerzucić marker np. na silnik 1 musze najpierw wcisnąć przycisk w dół a następnie w górę i wtedy marker przeskakuje i dalej już reaguje poprawnie, To program dokładnie robi to co mu każesz, przeanalizuj to jak deklarujesz zmienne menuEkran, co to oznacza dla programu szczególnie dla case1, popatrz też co w nim wyświetlasz(case1), popatrz też jakie masz if w tym case. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 No dobrze problem rozwiązany #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED szerokość #define SCREEN_HEIGHT 64 // OLED wysokość #define OLED_RESET 4 #define SCREEN_ADDRESS 0x3c //adres fizyczny wyswietlacza Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define przyciskEnter 8 //zdefiniowane piny dla przycisków #define przyciskGora 9 #define przyciskDol 10 #define przyciskBack 11 #define Silnik1 2 //zdefiniowane piny dla silnikow #define Silnik2 3 void setup() { display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); pinMode(przyciskEnter, INPUT_PULLUP); pinMode(przyciskGora, INPUT_PULLUP); //ustawienie pinów dla przycisków " wejście" podciągnięty pinMode(przyciskDol, INPUT_PULLUP); //rezystor wewnętrzny PULLUP pinMode(przyciskBack, INPUT_PULLUP); pinMode(Silnik1, OUTPUT); //ustawienie pinów dla silnikow "wyjście" pinMode(Silnik2, OUTPUT); display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("STEROWNIK"); //menu glowne display.setCursor(0,30); // znacznik na silnik 2 display.println("SILNIKOW"); display.setTextSize(1); display.setCursor(35,50); // znacznik na silnik 2 display.println("VOL: 2"); display.display(); delay(3000); display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 2 display.println(" SILNIK 2"); display.display(); } void loop() { menuGlowne(); } int menuEkran = 1; int menuEkran1 = 1; void menuGlowne(){ switch(menuEkran){ case 1: if (digitalRead(przyciskDol)== LOW){ //jesli przycisk wcisniety display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println(" SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 1 display.println("> SILNIK 2"); display.display(); menuEkran = 2;} break; case 2: if (digitalRead(przyciskGora)== LOW){ //jesli przycisk wcisniety display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 2 display.println(" SILNIK 2"); display.display(); menuEkran = 1;} break; } } dodałem w części setup ekran cos na wzór początkowy i teraz wszystko w tym kodzie działa, najpierw ekran startowy po 3 sekundach przechodzi do menu i przyciski działają normalnie, przycisk dół daje marker na silnik2 w górę daje na silnik1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 czy pomiędzy takim zapisem zmiennej w case 1: menuEkran = 1;} a takim menuEkran ++;} jest różnica? Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 Źle, obszedłeś problem zamiast go bardzo łatwo rozwiązać. Tak to nie może zostać, teraz wyobraź sobie, że po uruchomieniu programu ktoś zechce nacisnąć enter, by wejsc do menu silnika1. Znowu będziesz dopisywał w setupie?. Nie, wywal ten pomysł do kosza i wróć do mojego poprzedniego posta. 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 Przed chwilą, Norbert7630 napisał: czy pomiędzy takim zapisem zmiennej w case 1: menuEkran = 1;} a takim menuEkran ++;} jest różnica? No zasadnicza, tu ustawiasz na "1", a tu zwiększasz o "1". 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 Wiesz co myślałem że jak wyjdę załatwić pewne sprawy i trochę się przewietrzę, to mi pomoże lepiej później nad tym pomyśleć i...... się myliłem. Powiedz mi czy dobrze myślę jeżeli włączam program to : 1. najpierw ekran startowy w części setup display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("STEROWNIK"); //menu glowne display.setCursor(0,30); // znacznik na silnik 2 display.println("SILNIKOW"); display.setTextSize(1); display.setCursor(35,50); // znacznik na silnik 2 display.println("VOL: 2"); display.display(); delay(3000); 2. po delay(3000); czyli 3 sekundach: display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 2 display.println(" SILNIK 2"); display.display(); 3. dalej program przechodzi do pętli głównej void loop() i ją sprawdza czy wystąpiło jakieś zdarzenie np. wciśniecie przycisku. 4. wciskam przycisk w dół w case 1: to instrukcja warunkowa i teraz bo tu się zgubiłem, po wciśnięciu przycisku wyświetla to co w case1 i przechodzi do case2 ? Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 no tak się później przyglądnąłem temu mojemu rozwiązaniu i coś mi nie pasowało w tych case Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 krucze trochę problematyczny ten oled bo ma jakąś dziwną pamięć ostatniego ekranu, po zmianach w programie i załadowaniu nowego zapamiętuje to co miał na wyświetlaczu przed zmianami 🤔 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 void menuGlowne(){ switch(menuEkran){ case 1: if (digitalRead(przyciskGora)== LOW){ //przycisk wcisniety //wyświetla > SILNIK 1 SILNIK 2 menuEkran ++;} break; case 2: if (digitalRead(przyciskDol)== LOW){ //przycisk wcisniety //wyświetla SILNIK 1 > SILNIK 2 menuEkran --;} break; Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 3 minuty temu, Norbert7630 napisał: krucze trochę problematyczny ten oled bo ma jakąś dziwną pamięć ostatniego ekranu, po zmianach w programie i załadowaniu nowego zapamiętuje to co miał na wyświetlaczu przed zmianami 🤔 One takie sa...po resecie musisz wyswietlic od nowa ekran startowy 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 15, 2022 Autor tematu Udostępnij Styczeń 15, 2022 a nie powinienem ten ekran startowy najpierw wsadzić do kodu? Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 1 minutę temu, Norbert7630 napisał: a nie powinienem ten ekran startowy najpierw wsadzić do kodu? No oczywiscie ze musisz...na starcie wyswietlasz ekran i przechodzisz do nastepnego case i tam sprawdzasz guziki dalej...jesli zresetujesz Ardu to znow zaczniesz od tego pierwszego case.. Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 15, 2022 Udostępnij Styczeń 15, 2022 21 minut temu, Norbert7630 napisał: Wiesz co myślałem że jak wyjdę załatwić pewne sprawy i trochę się przewietrzę, to mi pomoże lepiej później nad tym pomyśleć i...... się myliłem. Powiedz mi czy dobrze myślę jeżeli włączam program to : 1. najpierw ekran startowy w części setup display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("STEROWNIK"); //menu glowne display.setCursor(0,30); // znacznik na silnik 2 display.println("SILNIKOW"); display.setTextSize(1); display.setCursor(35,50); // znacznik na silnik 2 display.println("VOL: 2"); display.display(); delay(3000); 2. po delay(3000); czyli 3 sekundach: display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,10); display.println("> SILNIK 1"); //menu glowne display.setCursor(0,35); // znacznik na silnik 2 display.println(" SILNIK 2"); display.display(); 3. dalej program przechodzi do pętli głównej void loop() i ją sprawdza czy wystąpiło jakieś zdarzenie np. wciśniecie przycisku. 4. wciskam przycisk w dół w case 1: to instrukcja warunkowa i teraz bo tu się zgubiłem, po wciśnięciu przycisku wyświetla to co w case1 i przechodzi do case2 ? Odpowiedź na pytania 1, 2, 3, 4: NIE. Wywal ekran z Setupu, ew. tylko jego czyszczenie zostaw. 3 minuty temu, farmaceuta napisał: No oczywiscie ze musisz...na starcie wyswietlasz ekran i przechodzisz do nastepnego case i tam sprawdzasz guziki dalej...jesli zresetujesz Ardu to znow zaczniesz od tego pierwszego case.. Na starcie wyświetlasz ekran startowy, ale nie w setupie. Wróciłeś do moich poprzednich postów, czy dalej upierasz się przy swoim @Norbert7630 ? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!