Skocz do zawartości

Niewiedza nie boli to tylko stan umysłu ;-) Menu na oled 1306 z obsługą silników


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 to post
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 to post
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

Coś w tym stylu, ale daj if na koniec case, a menuEkran czy koniecznie "++"? Co jak ktoś naciśnie enter, a jak naciśnie back?

  • Lubię! 1
Link to post
Share on other sites

Strasznie to komplikujecie...

Pytanie zasadnicze: czy program ma reagować na STAN przycisku (tak jak teraz) czy może na WCIŚNIĘCIE przycisku?

 

Link to post
Share on other sites
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 to post
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 to post
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 to post
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 to post
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 to post
Share on other sites
Przed chwilą, SOYER napisał:

na razie robimy to w jednym miejscu

Ja widzę co najmniej dwa.

1 minutę temu, SOYER napisał:

może zwrócić 3 różne wyniki, dla 3 przycisków

Cztery

Link to post
Share on other sites
21 minut temu, ethanak napisał:

funkcja nie zwraca sporo wyników a dokładnie jeden

 

4 minuty temu, ethanak napisał:

Cztery

zadowolony?

Link to post
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.