Skocz do zawartości

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?

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

Witam Profesorze 😅 @ethanak i proszę o dodatkowe wsparcie, bo profesorom @SOYER @farmaceuta przyda się wsparcie w walce z takim gamoniem jak ja. Ogólnie to wciskam przycisk i puszczam i wtedy coś się dzieje ale chyba Ardu widzi to inaczej bo wciśniecie przycisku to stan wysoki a puszczenie stan niski jak się nie mylę.

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
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
(edytowany)
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
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ę.

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

21 minut temu, ethanak napisał:

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

 

4 minuty temu, ethanak napisał:

Cztery

zadowolony?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...