Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

 while (millis() - zapamietanyCzas <= 5000UL){ //to nie wychodze z menuSilnik1
   if (digitalRead(przyciskDol)== LOW){
   menuEkran1 ++;  } 
 }
break
  
  case 2:

takiego zapisu też już próbowałem, po wciśnięciu przycisku enter przechodzi do case 1: w menuSilnik1, wchodzi do pętli while wykonuje się warunek, dopóki warunek się nie spełni będzie wykonywana instrukcja w tej pętli. Po wykonaniu warunku program wychodzi z pętli, wygląda to tak jakby na czas tego warunku program był zamrożony bo nawet wciśnięcie przycisku dół przed upływem tego czasu 5 s nie powoduje przejścia do case 2: . Zapis menuEkran1 = 2; też wstawiałem chociaż wydaje mi się że oba te zapisy (ten w kodzie powyżej) jak i ten wspomniany teraz wykonają tą samą operacje czyli przejście do case 2;. Ciągle mam wrażenie że to powinno w przybliżeniu działać jak w przykładzie z kursu forbota, z sygnalizacją świetlną, każda zmiana świateł następuje po wciśnięciu przycisku czyli wyjścia z pustej pętli, chyba że coś pokręciłem.😅

Link do komentarza
Share on other sites

2 godziny temu, Norbert7630 napisał:

Ciągle mam wrażenie że to powinno w przybliżeniu działać jak w przykładzie z kursu forbota, z sygnalizacją świetlną, każda zmiana świateł następuje po wciśnięciu przycisku czyli wyjścia z pustej pętli,

Jednak ty nie chcesz zmieniać ekranu na ten z góry założony(tak jak w przykładzie ze światłami), bo nie wiesz z góry jaki przycisk naciśnie użytkownik i co w związku z tym będzie się miało stać.

Link do komentarza
Share on other sites

2 godziny temu, Norbert7630 napisał:

bo nawet wciśnięcie przycisku dół przed upływem tego czasu 5 s nie powoduje przejścia do case 2: . Zapis

Dlatego, że dalej wykonuje się instrukcja while. Czy jest jakiś sposób by z niej wyjść przed czasem?

  • 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

#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
unsigned long zapamietanyCzas = 0;
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();  }
    (zapamietanyCzas = millis());// zapisanie millis do zmiennej zapamietanyCzas
  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(); 
  while (millis() - zapamietanyCzas <= 5000UL){ //to nie wychodze z menuSilnik1
   if (digitalRead(przyciskDol)== LOW){
   menuEkran1 ++;  } 
 }
   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;
 }
}

 

Link do komentarza
Share on other sites

Nawiązując do Twojego kodu, czy przypadkiem ten fragment z menuSilnik1, case1:

22 minuty temu, Norbert7630 napisał:

if (digitalRead(przyciskDol)== LOW){ menuEkran1 ++; } }

nie powinien przenosić do menuSilnik1, case2?

Link do komentarza
Share on other sites

6 minut temu, Norbert7630 napisał:

while (millis() - zapamietanyCzas <= 5000UL){ //to nie wychodze z menuSilnik1
   if (digitalRead(przyciskDol)== LOW){
   menuEkran1 = 2;  } 
 }

chodzi o taki zapis?

Ja bym tak zrobił.

Link do komentarza
Share on other sites

11 godzin temu, SOYER napisał:

Dlatego, że dalej wykonuje się instrukcja while. Czy jest jakiś sposób by z niej wyjść przed czasem?

tylko że teraz to mnie bardziej zastanawia 😅. Czy po wyjściu przed upływem tego czasu z pętli while (5s) nie zadziała znowu instrukcja break;?

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.