Skocz do zawartości

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


Norbert7630

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

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 do komentarza
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 do komentarza
Share on other sites

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 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
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 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.