Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

3 godziny temu, SOYER napisał:

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.

czy o ten post chodziło?

Link do komentarza
Share on other sites

case 1:
if wcisnij przycisk{ // wcisnij przycisk
  wyswietl cos tam   // wyswietl
    menuEkran ++;}   // przejdz do nastepnego case
break;
case 2:
if wcisnij przycisk{ // wcisnij przycisk
  wyswietl cos tam   // wyswietl
    menuEkran ++;}   // przejdz do nastepnego case
break;
case 3:
// i tak np nastepne case
// przechodzi z jednego case do drugiego z drugiego do trzeciego

 

 

 

  • Lubię! 1
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

void menuGlowne(){
  
  switch(menuEkran){
    
  case 1:
  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(); 
  if (digitalRead(przyciskDol)== LOW){  //jesli przycisk wcisniety
      menuEkran = 2;}
    break;
 case 2:
  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();
  if (digitalRead(przyciskGora)== LOW){  //jesli przycisk wcisniety
  menuEkran = 1;}
  break;
  }
}

znowu coś pokręciłem czy jest ok bo działa już normalnie nawet po restarcie przyciskiem Ardu?

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

Tu nie chodzi o to, jaki stan widzi Arduino bo to najmniej w tej chwili ważne. Ważne jest to, aby reakcja nie była na to że przycisk jest wciśnięty, ale na smianę stanu przycisku (np. przedtem nie był wciśnięty a teraz jest)

Wyobraź sobie, że masz nie dwie pozycje w menu a więcej. Jeśli np. menu będzie w pozycji pierwszej po naciśnięciu przycisku przejdzie oczywiście do drugiej, ale... program sprawdzi czy przycisk jest wciśnięty, stwierdzi że tak i przejdzie do trzeciej.

Ja bym zaczął od odłożenia tego programu na razie na półeczkę i napisanie funkcji "odczytaj klawisz", np takiej:
 

int readKey(void)
{
    odczytaj_wszystkie_klawisze_i_ustaw_ich_stany();
	if (klawisz_1_zmienił_stan_z_puszczonego_na_wciśnięty()) {
		return 1;
	}
    // ... tu następne klawisze
    return 0; // żaden klawisz nie został wciśnięty
}

Co ważne: taką funkcję umieszczasz na samym początku loop i więcej jej nie tykasz - potem używasz tylko numerka który zwróciła ta funkcja.

Może spróbujesz?

A wiesz, że jest specjalna biblioteka do takich rzeczy, nazywa się Bounce2? Oczywiście, napisanie samemu takiego kodu może być bardzo pouczające, ale od czego są gotowce... 🙂

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

13 minut temu, ethanak napisał:

Tu nie chodzi o to, jaki stan widzi Arduino bo to najmniej w tej chwili ważne. Ważne jest to, aby reakcja nie była na to że przycisk jest wciśnięty, ale na smianę stanu przycisku (np. przedtem nie był wciśnięty a teraz jest)

Wyobraź sobie, że masz nie dwie pozycje w menu a więcej. Jeśli np. menu będzie w pozycji pierwszej po naciśnięciu przycisku przejdzie oczywiście do drugiej, ale... program sprawdzi czy przycisk jest wciśnięty, stwierdzi że tak i przejdzie do trzeciej.

Ja bym zaczął od odłożenia tego programu na razie na półeczkę i napisanie funkcji "odczytaj klawisz", np takiej:
 


int readKey(void)
{
    odczytaj_wszystkie_klawisze_i_ustaw_ich_stany();
	if (klawisz_1_zmienił_stan_z_puszczonego_na_wciśnięty()) {
		return 1;
	}
    // ... tu następne klawisze
    return 0; // żaden klawisz nie został wciśnięty
}

Co ważne: taką funkcję umieszczasz na samym początku loop i więcej jej nie tykasz - potem używasz tylko numerka który zwróciła ta funkcja.

Może spróbujesz?

A wiesz, że jest specjalna biblioteka do takich rzeczy, nazywa się  Bounce2? Oczywiście, napisanie samemu takiego kodu może być bardzo pouczające, ale od czego są gotowce... 🙂@ethanak

@ethanak pomysł przedni i bardzo pomocny, jednak tu jest na razie problem z załapaniem co ma się zdarzyć po odpaleniu programu, ew. naciśnięciu jednego przycisku. Wprowadzanie funkcji zwracającej sporo różnych wyników zależnie od stanu 3 przycisków uważam za przedwczesne.

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

15 minut temu, SOYER napisał:

Wprowadzanie funkcji zwracającej sporo różnych wyników zależnie od stanu 3 przycisków uważam za przedwczesne.

A ja uważam za sprzeczne z wszelkimi zasadami badanie stanu przycisków w fafnastu miejscach w programie zamiast w jednym dobrze określonym.

BTW. funkcja nie zwraca sporo wyników a dokładnie jeden - numer przycisku który został wciśnięty. Potem wszystko się upraszcza, czyli:

case 1:
if (key == DOWN) {
  //zmiana_na_kolejną pozycję
}
break;

Poza tym uważam za przedwczesne rzucanie się na bardziej skomplikowany program jeśli się nie zna podstaw - jakaś kolejność musi istnieć.

  

15 minut temu, SOYER napisał:

jednak tu jest na razie problem z załapaniem co ma się zdarzyć po odpaleniu programu, ew. naciśnięciu jednego przycisku

Na razie proponuję :

if (key) Serial.println(key)

 

Edytowano przez ethanak
  • Lubię! 2
Link do komentarza
Share on other sites

12 minut temu, ethanak napisał:

BTW. funkcja nie zwraca sporo wyników a dokładnie jeden - numer przycisku który został wciśnięty.

Czyli może zwrócić 3 różne wyniki, dla 3 przycisków, tak jak napisałem w poprzednim poście. Może najpierw pozwólmy koledze załapać działanie 1 przycisku.

 

14 minut temu, ethanak napisał:

ja uważam za sprzeczne z wszelkimi zasadami badanie stanu przycisków w fafnastu miejscach w programie zamiast w jednym dobrze określonym

Ja też tak uważam, ale na razie robimy to w jednym miejscu, na jednym if, jak to załapiemy to kolega zrobi sobie z tego osobną funkcję.

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.