Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

@Norbert7630 program wykonuje w menuSilnik1 cały kod z case1, po czym ma komendę break, więc wychodzi z tego switcha i rozpoczyna pętlę od nowa. Musisz go zmusić żeby się zatrzymał w tym miejscu w którym chcesz, albo żeby pomijał wtedy kiedy chcesz odpowiedniego switcha.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@bjrk to jest na razie kod nad którym stoję:

#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() {
  Serial.begin(9600);
  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:
  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){ 
    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){  
    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){
   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){
     menuEkran1 = 1;}
  break;
 }
  }

No więc po użyciu przycisku enter, program powinien przejść do instrukcji menuEkran1, w funkcji menuSilnik1 , case 1: i w zasadzie tam przechodzi jednak czas trwania bardzo krótki wręcz natychmiast wraca do case 1: w funkcji menuGlowne(). To tak jakby samolot miał przelecieć z punktu x do y i tam wylądować ale tego nie robi dociera do punktu y i natychmiast wraca do punktu x. I tak jak @SOYER napisał muszę go jakoś zatrzymać w punkcie y (to znaczy tak mi się wydaje). Czyli @SOYER  mam  użyć pętli while bo tak wywnioskowałem z twoich podpowiedzi? tutaj szukać odpowiedzi? https://forbot.pl/forum/topic/19909-arduino-dla-poczatkujacych-instrukcje-sterujace-w-cc-czesc-3-for-break-switch/

while  (digitalRead(przyciskEnter) == LOW) { ? czy akurat taka pętla zatrzyma program w case 1: w funkcji menuSilnik1 po użyciu przycisku enter?

A o funkcji milis to już nawet nie wspominam bo nic nie czytałem na ten temat.

 

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

@Norbert7630

Na jakiej podstawie oczkujesz zawiśnięcia samolotu w miejscu? W którym miejscu jest lotnisko? Czy jest polecenie lądowania, czy tylko zrzucenia worka z pocztą i dalszego lotu?

Przy każdej wykonywanej linii kodu napisz sobie w komentarzu czas jej wykonywania . Orientacyjnie, uznajmy, że 1/100000 sekundy. To grube przybliżenie (z góry) ale na razie wystarczy.

Masz tylko kilka możliwych przypadków, więc jest to do zrobienia. W kodzie napisz najpierw jaki jest stan przycisków na początku, a potem wskaż kolejno wykonywane instrukcje. Dla ułatwienia kilka komentarzy wstawiłem za Ciebie.

Uzupełnij komentarze i zastąp znaki zapytania właściwymi wartościami.

#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() {
  Serial.begin(9600);
  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);
  
   }
   // STAN przycisków Enter == ?, Góra == ? Dol == ? Back == ?
void loop() {
  menuGlowne(); //l. 29) czas wykonania kodu 0.00001, czas od startu 0.00001, następna wykonywana istrukcja linia 34
}
int menuEkran = 1;
int menuEkran1 = 1;

void menuGlowne(){// 34.) czas wykonania kodu 0.00001, czas od startu 0.00002, następna wykonywana istrukcja linia 36
  
  switch(menuEkran){// 36.) czas wykonania kodu 0.00001, czas od startu 0.00003, następna wykonywana istrukcja linia ??
    
  case 1:			// 38.) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 39
  Serial.println(1);// 39,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 40
  display.clearDisplay();// 40,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 41
  display.setTextSize(2);// 41,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 42
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println("> SILNIK 1");  
  display.setCursor(0,35);          
  display.println(" SILNIK 2");
  display.display(); // 47,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 48
  if (digitalRead(przyciskEnter)== LOW){// 48,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia ??
    menuSilnik1();	}// 49,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia 52
  break;								// 50,) czas wykonania kodu 0.00001, czas od startu ???, następna wykonywana istrukcja linia ??
 
  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){  
    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){
   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){
     menuEkran1 = 1;}
  break;
 }
  }

I jeszcze jedno. Spróbuj w miarę obszernie opisać znaczenie, rolę, funkcję instrukcji break wewnątrz instrukcji case.

Popraw powyższy kod i podeślij.

11 godzin temu, Norbert7630 napisał:

No więc po użyciu przycisku enter, program powinien przejść do instrukcji menuEkran1, w funkcji menuSilnik1 , case 1: i w zasadzie tam przechodzi jednak czas trwania bardzo krótki wręcz natychmiast wraca

A dlaczego by miał nie wracać? Pokaż polecenie nr. linii kodu w którym polecasz mu nie kontynuować dalszego wykonywania programu.

Pamiętaj, że komputer to głupie bydle, które zawsze robi to co się mu poleci (realizuje swój program i tylko swój program), a nie to co by się chciało aby robił.

 

Edytowano przez bjrk
Uzupełnienie
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

#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() {
  Serial.begin(9600);
  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);
  
   }
   // STAN przycisków Enter == ?, Góra == ? Dol == ? Back == ?
void loop() {
  menuGlowne(); //l. 29) czas wykonania kodu 0.00001, czas od startu 0.00001, następna wykonywana istrukcja linia 34
}
int menuEkran = 1;
int menuEkran1 = 1;

void menuGlowne(){// 34.) czas wykonania kodu 0.00001, czas od startu 0.00002, następna wykonywana istrukcja linia 36
  
  switch(menuEkran){// 36.) czas wykonania kodu 0.00001, czas od startu 0.00003, następna wykonywana istrukcja linia ??
    
  case 1:			// 38.) czas wykonania kodu 0.00001, czas od startu 0.00004, następna wykonywana istrukcja linia 39
  Serial.println(1);// 39,) czas wykonania kodu 0.00001, czas od startu 0.00005, następna wykonywana istrukcja linia 40
  display.clearDisplay();// 40,) czas wykonania kodu 0.00001, czas od startu 0.00006, następna wykonywana istrukcja linia 41
  display.setTextSize(2);// 41,) czas wykonania kodu 0.00001, czas od startu 0.00007, następna wykonywana istrukcja linia 42
  display.setTextColor(SSD1306_WHITE); // 42  czas wykonania kodu 0.00001, czas od startu 0.00008, następna wykonywana istrukcja linia 43    
  display.setCursor(0,10);  //   43  czas wykonania kodu 0.00001, czas od startu 0.00009, następna wykonywana istrukcja linia 44      
  display.println("> SILNIK 1");  //44 czas wykonania kodu 0.00001, czas od startu 0.00010, następna wykonywana istrukcja linia 45
  display.setCursor(0,35);  // 45  czas wykonania kodu 0.00001, czas od startu 0.00011, następna wykonywana istrukcja linia 46     
  display.println(" SILNIK 2"); //46 czas wykonania kodu 0.00001, czas od startu 0.00012, następna wykonywana istrukcja linia 47
  display.display(); // 47,) czas wykonania kodu 0.00001, czas od startu 0.00013, następna wykonywana istrukcja linia 48
  if (digitalRead(przyciskEnter)== LOW){// 48,) czas wykonania kodu 0.00001, czas od startu 0.00014, następna wykonywana istrukcja linia 49
    menuSilnik1();	}// 49,) czas wykonania kodu 0.00001, czas od startu 0.00015, następna wykonywana istrukcja linia 50
  break;								// 50,) czas wykonania kodu 0.00001, czas od startu 0.00016, następna wykonywana istrukcja linia 52
 
  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){  
    menuEkran = 1;}
  break;
  }
}
void menuSilnik1(){ // 67 ) czas wykonania kodu 0.00001, czas od startu 0.00017, następna wykonywana istrukcja linia 68
  switch(menuEkran1){ // 68 ) czas wykonania kodu 0.00001, czas od startu 0.00018, następna wykonywana istrukcja linia 69
    case 1: // 69 ) czas wykonania kodu 0.00001, czas od startu 0.00017, następna wykonywana istrukcja linia 70
    Serial.println(3); // 70 ) czas wykonania kodu 0.00001, czas od startu 0.00019, następna wykonywana istrukcja linia 71
    display.clearDisplay();  // 71 ) czas wykonania kodu 0.00001, czas od startu 0.00020, następna wykonywana istrukcja linia 72
  display.setTextSize(2);  //  72  ) czas wykonania kodu 0.00001, czas od startu 0.00021, następna wykonywana istrukcja linia  73     
  display.setTextColor(SSD1306_WHITE);   //  73 ) czas wykonania kodu 0.00001, czas od startu 0.00022, następna wykonywana istrukcja linia 74
  display.setCursor(20,10);     //  74  ) czas wykonania kodu 0.00001, czas od startu 0.00023, następna wykonywana istrukcja linia  75  
  display.println("SILNIK 1"); // 75 ) czas wykonania kodu 0.00001, czas od startu 0.00024, następna wykonywana istrukcja linia 76
  display.setCursor(10,40);   //  76 ) czas wykonania kodu 0.00001, czas od startu 0.00025, następna wykonywana istrukcja linia  77    
  display.println(" ON"); // 77 ) czas wykonania kodu 0.00001, czas od startu 0.00026, następna wykonywana istrukcja linia 78
  display.setCursor(60,40);  //  78   ) czas wykonania kodu 0.00001, czas od startu 0.00027, następna wykonywana istrukcja linia  79    
  display.println("> OFF"); // 79 ) czas wykonania kodu 0.00001, czas od startu 0.00028, następna wykonywana istrukcja linia 80
  display.display(); // 80 ) czas wykonania kodu 0.00001, czas od startu 0.00029, następna wykonywana istrukcja linia 81
  if (digitalRead(przyciskDol)== LOW){ // 81 ) czas wykonania kodu 0.00001, czas od startu 0.00030, następna wykonywana istrukcja linia 82
   menuEkran1 = 2; } // 82 ) czas wykonania kodu 0.00001, czas od startu 0.00031, następna wykonywana istrukcja linia 83
      break; // 83 ) czas wykonania kodu 0.00001, czas od startu 0.00032, następna wykonywana istrukcja linia 84
  
  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){
     menuEkran1 = 1;}
  break;
 }
  }

@bjrk nie jestem pewien tego polecenia jak ma wyglądać

// STAN przycisków Enter == ?, Góra == ? Dol == ? Back == ?

chodzi o to?

pinMode(przyciskEnter, LOW);
  pinMode(przyciskGora, LOW); //ustawienie stanów dla przycisków 
  pinMode(przyciskDol, LOW);  //stan niski
  pinMode(przyciskBack, LOW)

@bjrk przepraszam ze na razie tylko tyle, ale strasznie mam w tym tygodniu mało czasu, wieczorem po drugiej zmianie siądę na chwile jeszcze i postaram się napisać coś na ten temat ,,I jeszcze jedno. Spróbuj w miarę obszernie opisać znaczenie, rolę, funkcję instrukcji break wewnątrz instrukcji case".

Link do komentarza
Share on other sites

@Norbert7630 No to jesteśmy w domu!

  break;		// 50,) czas wykonania kodu 0.00001, czas od startu 0.00016, następna wykonywana istrukcja linia 52

Błąd! Instrukcja break powoduje przerwanie wykonywania instrukcji nadrzędnej. Linia 65 jest końcem instrukcji switch,   czyli następną wykonywaną linią jest pierwsza linia po instrukcji switch linia 66 czyli koniec procedury menuGlowne, program zamyka procedurę i idzie do linii 30 czyli końca procedury loop. Ponieważ procedura loop wykonywana jest w pętli (dlatego nazwano ją loop), i natychmiast zostaje ponownie uruchomiona i przechodzi do linii 34.

      break; // 83 ) czas wykonania kodu 0.00001, czas od startu 0.00032, następna wykonywana istrukcja linia 84

Analogicznie jak powyżej. Kolejno linie 101  (pierwsza linia po switch) i wąsaty nawias zamykający w linii 49 (koniec bloku if), linia 50 a potem dokładnie to co napisałem powyżej.

Osobna sprawa to instrukcje warunkowe. Pytałem Cię w jakim stanie są przyciski na początku, czy są naciśnięte, czy zwolnione, bo od tego zależy dalszy przebieg programu, czy menuSilnik1 zostanie wywołane czy też nie. Masz w sumie do rozpatrzenia 16 różnych przypadków. Przeanalizuj najpierw gdy wszystkie przyciski są zwolnione, a potem gdy któryś z nich jest naciśnięty. Jeśli docelowo masz zamiar dopuszczać możliwość naciśnięcia więcej niż jednego przycisku jednocześnie, trzeba będzie i to przeliczyć. Ponieważ, jak policzyłeś, czas jednego przebiegu pętli głównej jest bardzo mały, możemy przyjąć, że stan przycisków w czasie kilku kolejnych przebiegów pętli się nie zmienia.

                   Pozdrawiam

                                 Bogusław

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dnia 20.01.2022 o 13:38, bjrk napisał:

Błąd! Instrukcja break powoduje przerwanie wykonywania instrukcji nadrzędnej. Linia 65 jest końcem instrukcji switch,   czyli następną wykonywaną linią jest pierwsza linia po instrukcji switch linia 66 czyli koniec procedury menuGlowne, program zamyka procedurę i idzie do linii 30 czyli końca procedury loop. Ponieważ procedura loop wykonywana jest w pętli (dlatego nazwano ją loop), i natychmiast zostaje ponownie uruchomiona i przechodzi do linii 34.

Witam Bogusław, czy to co napisałeś dotyczy tego przykładu wklejonego przeze mnie, czy tylko wytłumaczenie przykładowe jak działa break i linie poniżej, bo nie bardzo to rozumie 😅

if (digitalRead(przyciskEnter)== LOW){// 48,) czas wykonania kodu 0.00001, czas od startu 0.00014, następna wykonywana istrukcja linia 49
    menuSilnik1();  }// 49,) czas wykonania kodu 0.00001, czas od startu 0.00015, następna wykonywana istrukcja linia 50
  break;                // 50,) czas wykonania kodu 0.00001, czas od startu 0.00016, następna wykonywana istrukcja linia 52
 

W tej części kodu to  źle zrobiłem, bo tak jak piszesz to powinna być kolejna linia 65- koniec instrukcji switch, 66 -koniec menuGlowne

if (digitalRead(przyciskEnter)== LOW){// 48,) czas wykonania kodu 0.00001, czas od startu 0.00014, następna wykonywana istrukcja linia 49
    menuSilnik1();  }// 49,) czas wykonania kodu 0.00001, czas od startu 0.00015, następna wykonywana istrukcja linia 50
  break;                // 50,) czas wykonania kodu 0.00001, czas od startu 0.00016, następna wykonywana istrukcja linia 65
   } // 65,) czas wykonania kodu 0.00001, czas od startu 0.00017, następna wykonywana istrukcja linia 66 - koniec switch
}  // 66,) czas wykonania kodu 0.00001, czas od startu 0.00018, następna wykonywana istrukcja linia 67 - koniec menuGlowne
void menuSilnik1(){ // 67 ) czas wykonania kodu 0.00001, czas od startu 0.00019, następna wykonywana istrukcja linia 68
  switch(menuEkran1){ // 68 ) czas wykonania kodu 0.00001, czas od startu 0.00020, następna wykonywana istrukcja linia 69
    case 1: // 69 ) czas wykonania kodu 0.00001, czas od startu 0.00017, następna wykonywana istrukcja linia 70
    Serial.println(3); // 70 ) czas wykonania kodu 0.00001, czas od startu 0.00021, następna wykonywana istrukcja linia 71
    display.clearDisplay();  // 71 ) czas wykonania kodu 0.00001, czas od startu 0.00022, następna wykonywana istrukcja linia 72
  display.setTextSize(2);  //  72  ) czas wykonania kodu 0.00001, czas od startu 0.00023, następna wykonywana istrukcja linia  73     
  display.setTextColor(SSD1306_WHITE);   //  73 ) czas wykonania kodu 0.00001, czas od startu 0.00024, następna wykonywana istrukcja linia 74
  display.setCursor(20,10);     //  74  ) czas wykonania kodu 0.00001, czas od startu 0.00025, następna wykonywana istrukcja linia  75  
  display.println("SILNIK 1"); // 75 ) czas wykonania kodu 0.00001, czas od startu 0.00026, następna wykonywana istrukcja linia 76
  display.setCursor(10,40);   //  76 ) czas wykonania kodu 0.00001, czas od startu 0.00027, następna wykonywana istrukcja linia  77    
  display.println(" ON"); // 77 ) czas wykonania kodu 0.00001, czas od startu 0.00028, następna wykonywana istrukcja linia 78
  display.setCursor(60,40);  //  78   ) czas wykonania kodu 0.00001, czas od startu 0.00029, następna wykonywana istrukcja linia  79    
  display.println("> OFF"); // 79 ) czas wykonania kodu 0.00001, czas od startu 0.00030, następna wykonywana istrukcja linia 80
  display.display(); // 80 ) czas wykonania kodu 0.00001, czas od startu 0.00031, następna wykonywana istrukcja linia 81
  if (digitalRead(przyciskDol)== LOW){ // 81 ) czas wykonania kodu 0.00001, czas od startu 0.00032, następna wykonywana istrukcja linia 82
   menuEkran1 = 2; } // 82 ) czas wykonania kodu 0.00001, czas od startu 0.00033, następna wykonywana istrukcja linia 83
      break; // 83 ) czas wykonania kodu 0.00001, czas od startu 0.00034, następna wykonywana istrukcja linia 30
  

Po wciśnięciu przycisku enter, następuje wywołanie kolejnej funkcji menuSilnik1, wyjście ze switcha linia 65, wyjście z menuGlowne linia 66 i przejście do linii 67 menuSilnik1 i dalej analogicznie kolejne linie aż do linii 83 czyli break i wyjście a następnie powrót do linii 30. To tak jak napisał @SOYER  trzeba zastosować linie kodu (pętle) która zatrzyma np. po wciśnięciu przycisku enter wykonywanie programu w case:1 menuSilnik1.

 

Dnia 20.01.2022 o 13:38, bjrk napisał:

Przeanalizuj najpierw gdy wszystkie przyciski są zwolnione, a potem gdy któryś z nich jest naciśnięty. Jeśli docelowo masz zamiar dopuszczać możliwość naciśnięcia więcej niż jednego przycisku jednocześnie, trzeba będzie i to przeliczyć. Ponieważ, jak policzyłeś, czas jednego przebiegu pętli głównej jest bardzo mały, możemy przyjąć, że stan przycisków w czasie kilku kolejnych przebiegów pętli się nie zmienia.

Bogusław wolę posługiwać się przyciskami pojedynczo, nie biorę pod uwagę wciśnięcie np. dwóch na raz. 

Dnia 20.01.2022 o 13:38, bjrk napisał:

Masz w sumie do rozpatrzenia 16 różnych przypadków.

Nie do końca to rozumie z tymi przypadkami 😅

// przykładowo dla przycisku enter są 4 przypadki ???

 pinMode(przyciskEnter, HIGH);
pinMode(przyciskEnter, LOW);
 if (digitalRead(przyciskEnter)== HIGH){
  if (digitalRead(przyciskEnter)== LOW){
    
 // jeżeli o te przypadki chodzi to w sumie razy 4 (przyciski) daje 16 przypadków

Ogólnie to z przyciskami ma trochę problem bo dopóki nie zacząłem używać Arduino, to w życiu codziennym trochę się ich używało ale nie zastanawiałem się jak to działa, po prostu wciskam i puszczam przycisk w pilocie od telewizora i mam inny kanał. W tact-switch (przyciski) które używam rozumiem że one działają na zasadzie, 

void setup() {
  pinMode(13, OUTPUT); // PIN 13 ustawwiony jako wyjście( w tym przypadku dioda led na płytce)
  pinMode(6, INPUT_PULLUP); //pin 6 jako wejście(przycisk) z rezystorem podciągającym wewnętrznym
  pinMode(6, HIGH); // pin 6 ustawiony stan wysoki dla przycisku puszczonego
  
}

void loop() {
          warunek
  if (digitalRead(6)==LOW){ //przycisk puszczony nic się nie dzieje, przycisk wciśniety pojawia sie stan LOW(niski) wykonanie warunku
         instrukcja
    digitalWrite(13, HIGH); //warunek wykonany, wykonuje się instrukcja (zapala led na płytce)
  }
}

tak mi się wydaje że te przyciski działają

Link do komentarza
Share on other sites

@Norbert7630 Jeśli naciskasz przyciski pojedynczo to interesuje Cię 5 przypadków:
1) nic nie jest naciśnięte, 
2) naciśnięty jest przyciskEnter
3) naciśnięty jest przyciskGora
4) naciśnięty jest przyciskDol
5) naciśnięty jest przyciskBack

Zwróć uwagę na jest naciśnięty, czyli czy w chwili sprawdzania przez program przycisk jest naciśnięty! Program nie czeka na naciśnięcie przez Ciebie przycisku. on sprawdza czy właśnie w tym momencie go naciskasz - sprawdza wykonując w kółko procedurę loop i oczytując stan pinu funkcją digitalRead(nrPinu).

Ile czasu upływa pomiędzy sprawdzeniem

3 godziny temu, Norbert7630 napisał:

Po wciśnięciu przycisku enter, następuje wywołanie kolejnej funkcji menuSilnik1, wyjście ze switcha linia 65, wyjście z menuGlowne linia 66 i przejście do linii 67 menuSilnik1 i dalej analogicznie kolejne linie aż do linii 83 czyli break i wyjście a następnie powrót do linii 30.

Nie po wciśnięciu, a jeśli przycisk jest naciśnięty. Ile czasu twa przerwa pomiędzy sprawdzeniem jednego i drugiego przycisku? Liczyłeś, poniżej milisekundy. Przeniesiesz w tym czasie palec  jednego przycisku na drugi?

Link do komentarza
Share on other sites

Bogusław wszystko ok, masz całkowitą racje że w tamtym miejscu w kodzie zrobiłem błąd, i w kodzie poniżej go poprawiłem, kod zaczyna się od ,,if''.

@SOYER to nie żadna publikacja tylko moje przemyślenia 😅 a w zasadzie nie pracuje nad niczym, czytam publikacje ,,Arduino dla początkujących'' szukając rozwiązania tej pętli która w końcu zatrzyma przejście z jednego case danej funkcji po wciśnięciu przycisku enter w case do którego ten przycisk odwołuje w kolejnej funkcji.

Link do komentarza
Share on other sites

O właśnie o to Bogusław chodzi, że ty widzisz 4 przyciski a ja widzę tylko jeden (przyciskEnter) bo na nim się tylko skupiam i tylko ten jeden wciskam, chodzi o to że chce na razie rozwiązać problem z przejściem z case 1: menuGlowne() do case 1: menuSilnik1() żeby program tam się zatrzymał i dalej sobie sprawdzał stan przycisków ale nic nie wykonywał. W obecnej sytuacji Ardu. robi to co w programie, ale nie zostaje w case 1: mneuSilnik1() lecz od razu wraca do case 1: w menuGlowne(). Nie chce od razu zrobić cały kod z uwzględnieniem pozostałych przycisków, tylko etapowo małymi krokami, czyli najpierw przycisk enter i to co ma się stać po jego wciśnięciu. 🙂

Link do komentarza
Share on other sites

@Norbert7630 na początek wystarczy, że zatrzymasz się w menuSilnik1 na 5 sekund, w ciągu tych 5 sek sprawdzasz czy ktoś nie nacisnął przycisku, jeśli tak to wykonujesz polecenie, jeśli nic się nie wydarzy to po upływie tych 5 sekund, wracasz do menu głównego.

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.