Skocz do zawartości

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


Pomocna odpowiedź

Wchodzisz do menuSilnik1 i

resetujesz stoper odliczający czas 

tak długo jak nie upłynie 5 sek od zresetowania stopera: wyświetlasz menu z menuSilnik1 i sprawdzasz przyciski 

      jeśli jest naciśnięty jakiś przycisk to          wykonujesz kod mu przypisany w              danej sytuacji 

// jeśli upłynęło 5sek wracasz z menuSilnik1 do menuGlowne

 

 

 

Link to post
Share on other sites

na końcu kodu pomiędzy nawiasami klamrowymi kończącymi instrukcje switch i  funkcje menuSilnik1() , delay(5000); i zatrzymuje się na te 5 s .

 break;
 } 
 delay(5000);
  }

w case 1: menuSilnik1().

Link to post
Share on other sites

No ale to chyba nie o delay chodziło? Bo wydaje mi sie ze przez te 5 s program jest jakby zamrożony i nie zauważy czy wciśnięto jakiś przycisk? A może się mylę, ech nie wiem.

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

9 minut temu, Norbert7630 napisał:

 Bo wydaje mi sie ze przez te 5 s program jest jakby zamrożony i nie zauważy czy wciśnięto jakiś przycisk? 

Nie mylisz sie...program przez ten czas nie zauwazy czy wcisnieto guzik...(oczywiscie w najprostrzej wersji obslugi guzika)

Link to post
Share on other sites

Przeczytałem ten kurs który poleciłeś @SOYER  i jak to z nowościami nie bardzo wiem jakbym miał to zastosować w tym kodzie do obsługi menu, chociaż tam ostatni przykład jest z użyciem przycisku i dwóch diod. Staram się to zrozumieć rozbierając ten przykład na czynniki pierwsze

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
 
void setup(){
  Serial.begin(9600);
}
 
void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
  //Jeśli różnica wynosi ponad sekundę
  if (aktualnyCzas - zapamietanyCzas >= 1000UL) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;
    //Wyslij do PC
    Serial.println(aktualnyCzas);
  }
}

Pierwsze to zmienne ich nazwy i wartość im przypisana

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;

wartość od 0 do 4 294 967 295.

void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();

jeżeli program w pętli głównej działa w koło, to mikroprocesor rejestruje cały czas upływ czasu (milisekund) od momentu uruchomienia tego programu na płytce. Czyli na bieżąco pobiera ten upływ czasu w (ms). Ale do tego momentu kodu jeszcze nic się nie dzieje po za tym co napisałem wyżej?

//Jeśli różnica wynosi ponad sekundę
  if (aktualnyCzas - zapamietanyCzas >= 1000UL) {
    //Zapamietaj aktualny czas
    zapamietanyCzas = aktualnyCzas;

Dalej jest instrukcja warunkowa i tego tak do końca raczej nie rozumie. Warunkiem w tej instrukcji jest działanie matematyczne. Czyli od aktualnego czasu np. (500 ms) odjąć zapamiętany czas (0 ms), i różnica tego wyniku jak będzie większa lub równa 1000ms, to ma zapamiętać ten czas i zapisać jako aktualny?

Link to post
Share on other sites
(edytowany)

Teraz popatrz(stosujemy Twoje nazewnictwo zmiennych):

wychodzisz z menuGlówne najpierw zapisując stan millis() do zmiennej zapamietanyCzas 

będąc w menuSilnik1 sprawdzasz aktualny millis()[zmienna aktualnyCzas wydaje się zbędna] jeśli różnica między millis() a zapamietanyCzas jest mniejsza od 5000 to nie wychodzisz z menuSilnik1, jeśli

(millis() - zapamietanyCzas)>5000

to wychodzisz z menuSilnik1.

Co do Twojego pytania to tak masz rację, to:

47 minut temu, Norbert7630 napisał:

if (aktualnyCzas - zapamietanyCzas >= 1000UL) { //Zapamietaj aktualny czas zapamietanyCzas = aktualnyCzas;

znaczy to:

47 minut temu, Norbert7630 napisał:

Czyli od aktualnego czasu np. (500 ms) odjąć zapamiętany czas (0 ms), i różnica tego wyniku jak będzie większa lub równa 1000ms, to ma zapamiętać ten czas i zapisać jako aktualny?

Choć to zdanie:

"to ma zapamietac ten czas i zapisac jako aktualny"

powinno brzmieć:

to ma zapisać wartość zapisaną w zmiennej aktualnyCzas do zmiennej zapamietanyCzas.

 

Edytowano przez SOYER
Link to post
Share on other sites
(millis() = zapamietanyCzas);// zapisanie millis do zmiennej zapamietanyCzas
if (millis() - zapamietanyCzas <= 5000UL){ 
  //to nie wychodze z menuSilnik1
  else (millis() - zapamietanyCzas >= 5000UL){
  // to wychodze z menuSilnik1
}
}

 

6 godzin temu, SOYER napisał:

Teraz popatrz(stosujemy Twoje nazewnictwo zmiennych):

wychodzisz z menuGlówne najpierw zapisując stan millis() do zmiennej zapamietanyCzas 

1 linia w kodzie powyżej i tak jak zrozumiałem że powinna się znaleźć w menuGlowne w case 1: gdzie używam przycisku enter i wywołuje menuSilnik1 .

pozostałe linie kodu czyli instrukcje warunkowe maja się znaleźć w menuSilnik1 w case1:?

Link to post
Share on other sites
6 minut temu, Norbert7630 napisał:

if (millis() - zapamietanyCzas <= 5000UL){ //to nie wychodze z menuSilnik1 else (millis() - zapamietanyCzas >= 5000UL){ // to wychodze z menuSilnik1 } }

if     dobrze 

else to zupełna pomyłka, po pierwsze, że else z takim warunkiem, po drugie to ma być while nie if. 

Zamień if na while.

 

Link to post
Share on other sites
8 minut temu, Norbert7630 napisał:

1 linia w kodzie powyżej i tak jak zrozumiałem że powinna się znaleźć w menuGlowne w case 1: gdzie używam przycisku enter i wywołuje menuSilnik1 .

Tak, dokładnie tak.

Link to post
Share on other sites
while (millis() - zapamietanyCzas <= 5000UL){ 
  //to nie wychodze z menuSilnik1
 do (millis() - zapamietanyCzas >= 5000UL){
  // to wychodze z menuSilnik1
}
}

nie wiem naprawdę jak to zapisać😅

Link to post
Share on other sites
11 minut temu, Norbert7630 napisał:

while (millis() - zapamietanyCzas <= 5000UL){ 
  //to nie wychodze z menuSilnik1
 do (millis() - zapamietanyCzas >= 5000UL){
  // to wychodze z menuSilnik1
}
}

nie wiem naprawdę jak to zapisać😅

while.... i wystarczy....

jak warunek nie będzie spełniony to wyjdzie z while i wróci do...?

Link to post
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
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);
 /* pinMode(przyciskEnter, HIGH);
  pinMode(przyciskGora, HIGH); //ustawienie stanów dla przycisków 
  pinMode(przyciskDol, HIGH);  //stan niski
  pinMode(przyciskBack, HIGH); */
   }
   
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(); 
  if (digitalRead(przyciskDol)== LOW){
   menuEkran1 = 2; } 
  while (millis() - zapamietanyCzas <= 5000UL){} //to nie wychodze z menuSilnik1
   
      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;
 }
  }

Nie wiem czy dobrze wstawiłem no ale program zachowuje się tak że przechodzi z menuGlownego z case 1: do menuSilnik case1: tam czeka te 5 s i wraca do menuGlowne. Trochę jak opóźnienie delay, ale inna nazwa funkcji 😅

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.