Skocz do zawartości

Menu na oled 1306 z obsługą silników


Norbert7630

Pomocna odpowiedź

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

Muszę doczytać o tym bo mam taki mętlik w głowie że nic już nie mogę wymyśleć, sprawdzałem linijka po linijce czy czegoś nie zapomniałem, bo jak słusznie zauważył@bjrk kopiuj wklej to nie dobra metoda a przy tylu skasowaniach i pisaniu na nowo, i gdzie nie gdzie kopiuj wklej żeby było szybciej, to mogłem coś pominąć lub źle dopisać. Ale nie widzę żeby w którymś case brakowało zakończenia break;. Ogólnie bloki kodu są w jednej pętli głównej, program sprawdza w kółko ale wyświetla dane z case 1 w menuGlowne(), jeżeli wcisnę przycisk enter to powinien przeskoczyć do case 1 w funkcji menuSilnik1(), no i tak się dzieje ale na krótką chwile bo wraca z powrotem w to samo miejsce. Gdyby ten kod był oparty tylko na instrukcji sterującej switch/case to ten kod by zadziałał,  oczywiście zmieniając linijkę w case 1 menuGlownym, z menuSilnik1, na menuEkran = 3; w założeniu że nie ma tam żadnej funkcji menuSilnik1 i menuEkran1, tylko jest to ciąg case z menuGłównego.

Link do komentarza
Share on other sites

2 minuty temu, Norbert7630 napisał:

 jeżeli wcisnę przycisk enter to powinien przeskoczyć do case 1 w funkcji menuSilnik1(), no i tak się dzieje ale na krótką chwile bo wraca z powrotem w to samo miejsce.

Bo jak wyswietlasz nowy ekran to musisz zapobiec temu ze wejdziesz w ekran wczesniejszy...a Ty caly czas wyswietlasz raz jeden, raz drugi ekran

Link do komentarza
Share on other sites

19 minut temu, Norbert7630 napisał:

ale wyświetla dane z case 1 w menuGlowne(), jeżeli wcisnę przycisk enter to powinien przeskoczyć do case 1 w funkcji menuSilnik1(), no i tak się dzieje ale na krótką chwile bo wraca z powrotem w to samo miejsce.

bo wykonuje case1 z menuSilnik1, po czym jest break, więc program kończy tą instrukcję i rozpoczyna pętlę od nowa.

13 minut temu, farmaceuta napisał:

Bo jak wyswietlasz nowy ekran to musisz zapobiec temu ze wejdziesz w ekran wcześniejszy

Znasz jakiś sposób by zatrzymać program w danym miejscu do czasu spełnienia jakiegoś warunku (np. wciśnięcie przycisku)? Jakaś "mniejsza" pętla? Coś Ci się @Norbert7630 przypomina z lekcji podlinkowanej przez @ethanak?

Edytowano przez SOYER
  • Lubię! 1
Link do komentarza
Share on other sites

@Norbert7630 Powtarzam się, ale odpowiedz sobie na pytanie: Ile jest klawiszy, w którym miejscu który klawisz jest obsługiwany? Zrób to przez zaznaczenie w kodzie a nie "na pamięć"! Ty wiesz co chciałeś napisać, a nie wiesz co napisałeś! Najlepiej wydrukuj sobie i kredkami zaznacz! Podpowiem Ci. Jeden z klawiszy odczytywany jest dwa razy, a inny nigdy.

Edytowano przez bjrk
  • Lubię! 1
Link do komentarza
Share on other sites

void loop() {
  menuGlowne();
}
int menuEkran = 1;
int menuEkran1 = 1;

void menuGlowne(){
  
  switch(menuEkran){
    
  case 1:
  Serial.println(1);
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println("> SILNIK 1");  
  display.setCursor(0,35);          
  display.println(" SILNIK 2");
  display.display(); 
  if (digitalRead(przyciskEnter)== LOW){ //tu jest pierwszy przycisk (enter)(1)
    menuSilnik1();}
      
 break;
 
  case 2:
 Serial.println(2);
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println(" SILNIK 1");  
  display.setCursor(0,35);          
  display.println("> SILNIK 2");
  display.display();
  if (digitalRead(przyciskGora)== LOW){  //tu jest drugi przycisk (Gora)(2)
  menuEkran = 1;}
  break;
  }
}
void menuSilnik1(){
  switch(menuEkran1){
    case 1:
    Serial.println(3);
    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();
  if (digitalRead(przyciskDol)== LOW){ //tu jest trzeci przycisk (Dol)(3)
   menuEkran1 = 2; }
      
   
  break;
  
  case 2:
    Serial.println(4);
    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();
  if (digitalRead(przyciskGora)== LOW){  //tu jest czwarty przycisk (Gora)(4)
  menuEkran1 = 1;} 
  break;
 
  }
}

@bjrk czy ot to chodziło? Mam 4 przyciski ale w użyciu są na razie 3. Powtarza się przyciskGora, ale w każdym case jest zapisany w kodzie tylko jeden przycisk. Po wciśnięciu przyciskEnter powinien odczytać tylko ten przycisk i tylko ten. Nie wciskam innych przycisków.......to znaczy przycisk Enter jest odczytywany dwa razy?

@SOYER  dlaczego w pojedynczej instrukcji sterującej przechodzenie pomiędzy case-ami odbywa się normalnie

void menuGlowne(){ //funkcja
  switch(menuEkran){  //instrukcja sterująca
    case 1:
 if (przyciskDol)==LOW{ // if (warunek){instrukcja}
   menuEkran = 2;}   // jesli (wciśniesz przycisk) {przedź do case 2:}
      break;
    case 2:  // przechodze do case 2: i tu zostaje
 if (przyciskDol)==LOW{ // if (warunek){instrukcja}
   menuEkran = 1;} // jesli (wciśniesz przycisk) {przedź do case 1:} wykonuje analogicznie do pierwszej
      break; 

Ale gdy przejście ma się wykonać pomiędzy case-ami w różnych funkcjach, to nie działa. Czy coś mi przychodzi do głowy jak to zrobić żeby po wciśnięciu przycisku w case 1: menuGlowne, przejść do case 1: w menuSilnik1 i tam pozostać? Nie nie mam i chyba jeszcze długo nie będę miał, bo wyciągnąłem błędne wnioski sądząc że to będzie w miarę proste jak w przypadku pojedynczej instrukcji sterującej switch/case 😔. Podpowiedziałeś cos o pętli, a w kursie kolegi @ethanak pojawiła się while oraz zagadnienie jak wyjść z pętli nieskończonej, jeżeli o to chodziło to i tak nie wiem jak to w tym przykładzie zastosować.

Link do komentarza
Share on other sites

Właśnie! Odczytujesz klawisz enter  i co? Która następna instrukcja jest wykonywana i ile czasu trwa, nim sprawdzisz następny klawisz?

PS Proszę podaj cały aktualny kod, bo nie wiadomo co poprawiłeś.Np w wersji z niedzieli menu od silników sprawdzało tylko jeden klawisz.

Edytowano przez bjrk
korekta
  • Lubię! 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.