Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

7 minut temu, Norbert7630 napisał:

Alez opcji silnik1 chce wejsć do opcji silnik1 off/on z markerem na off

Przecież w tym wcześniejszym kodzie to Ci działa, w tym drugim nie bo mawet nie sprawdzasz przycisku enter.

  • Pomogłeś! 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

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

to jest pierwszy case i dokładnie to mi się wyświetla po załadowaniu programu, menuEkran = 2; ta linijka odpowiada za przejście do case 2, jeśli w tym przypadku wcisnę przycisk dół, dobrze to rozumie?

  • Lubię! 1
Link do komentarza
Share on other sites

Bo jeśli dobrze rozumie to jak to zrobić żeby z case1 przejść przyciskiem enter do opcji silnik1 off/on a jeżeli nie chce do tej opcji to po wciśnięciu przycisku w dół przejść do opcji silnik2 z przesunięciem markera na niego. To tak jakby w tym case1 miały być dostępne dwie możliwości albo enter albo w dół 🤔

  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, Norbert7630 napisał:

no nie chciałem wam przeszkadzać w dyskusji dla was merytorycznej a dla mnie ciemnej masy nic nie zrozumiałej😅,  i w zasadzie tak bardziej już dla rozrywki żeby odejść na chwilę od tego problemu to stworzyłem na if-ach i switch/case,  twór rodem z prehistorii komputerowej hahahaha 🤣 oczywiście wszystko w ramach żartu.



#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() {
  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;


void menuGlowne(){
  
  switch(menuEkran){
    
  case 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){  
      menuEkran = 2;}
 if (digitalRead(przyciskDol)== LOW){  
      menuEkran = 4;}
 
    break;
 case 2:
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(20,0);             
  display.println("SILNIK 1");
  display.setCursor(30,20);             
  display.println("> OFF");
  display.setCursor(30,40);             
  display.println(" ON");
  display.display();
  if (digitalRead(przyciskDol)== LOW){
      (digitalWrite(Silnik1, HIGH));
  menuEkran = 3;}
  if (digitalRead(przyciskBack)== LOW){  
  menuEkran=1;}
  break;

  case 3:
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(20,0);             
  display.println("SILNIK 1");
  display.setCursor(30,20);            
  display.println(" OFF");
  display.setCursor(30,40);             
  display.println("> ON");
  display.display();
  if (digitalRead(przyciskGora)== LOW){
    (digitalWrite(Silnik1, LOW));
  menuEkran --;}
  if (digitalRead(przyciskBack)== LOW){  
  menuEkran=1;}
  break;
 
  case 4:
  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){  
      menuEkran = 5;}
 if (digitalRead(przyciskGora)== LOW){  
      menuEkran = 1;}
      break;

   case 5:
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(20,0);             
  display.println("SILNIK 2");
  display.setCursor(30,20);             
  display.println("> OFF");
  display.setCursor(30,40);             
  display.println(" ON");
  display.display();
  if (digitalRead(przyciskDol)== LOW){
    (digitalWrite(Silnik2, HIGH));
  menuEkran = 6;}
  if (digitalRead(przyciskBack)== LOW){  
  menuEkran=1;}
  break;

  case 6:
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(20,0);             
  display.println("SILNIK 2");
  display.setCursor(30,20);             
  display.println(" OFF");
  display.setCursor(30,40);             
  display.println("> ON");
  display.display();
  if (digitalRead(przyciskGora)== LOW){
    (digitalWrite(Silnik2, LOW));
  menuEkran --;}
  if (digitalRead(przyciskBack)== LOW){ 
  menuEkran=4;}
  break;
  }
}

 

@Norbert7630 czy szkic z tego posta działa tak jak chcesz?

Edytowano przez SOYER
  • Pomogłeś! 1
Link do komentarza
Share on other sites

@SOYER  No gdybym nie czepiał się szczegółów,  byłby to wystarczający program żeby wstępnie sterować dwoma silnikami. Można je włączyć oddzielnie i wyłączyć, mogą pracować razem. No ale gdyby to miało być poprawnie politycznie, to jak sam pewnie zauważyłeś nie wyłączysz ich obu na raz, również pewnie zauważyłeś że włączenie silnika któregokolwiek i wyjście do menu głównego jest możliwe, ale powrót  i wyłączenie tego silnika wiąże się z wykonaniem sekwencji wciśnięć żeby ten silnik zatrzymać.

Link do komentarza
Share on other sites

@ethanak

#define przycisk 8
void setup() {
  Serial.begin(9600);
  
  pinMode(przycisk, INPUT_PULLUP);

}

void loop() {
if (digitalRead(przycisk)== LOW){
    Serial.println("wcisniety"); 
    while (digitalRead(przycisk)== LOW){
    delay(25);
    }
  (digitalRead(przycisk)== HIGH);
    Serial.println("puszczony");
 
   while (digitalRead(przycisk)== LOW){
    delay(25);
    }
  }
}

to rozwiązanie twojego zadania dla mnie, czyli wciśnięty i na monitorze szeregowym wyskakuje wciśnięty, jeżeli puszcze pojawia się puszczony. Tak naprawdę to nie wiem do końca jak to działa, chyba pusta pętla while że np. puszczony przycisk nie jest cały czas odczytywany i po wciśnięciu przycisku i przytrzymaniu dzięki tej pętli nie odczytuje cały czas wciśnięty, no ale to takie moje przypuszczenia 😅

Link do komentarza
Share on other sites

@Norbert7630 bo nie kod działa, ale jest sporo do poprawy. Na początek powinieneś zrobić tak jak wcześniej pisałem, każdy poziom menu to osobna funkcja, menuGlowne osobna(tylko 2 case w środku), menu silnik1 osobna, i menu silnik2 też osobna. Jeśli w menuGlowne klikniesz enter to wywołujesz funkcję z osobnym switchem dla konkretnego silnika. Pisałem o tym na samym początku.

Kolejna zmiana to włączanie i wyłączanie silnika dopiero po kliknięciu enter na pozycji on lub off.

Popracuj nad tym i pisz jakby co.

 

  • Lubię! 1
Link do komentarza
Share on other sites

6 godzin temu, Norbert7630 napisał:

chyba pusta pętla while

Nie, nie, nie! W informatyce nic się nie chyba, to nie wesz na grzebieniu!

Nic nie przypuszczaj, tylko spróbuj zabawić się w "jestem procesorem" i wykonać ten kod w pamięci. To Ci może pomóc:

Masz tam trzy części, trzeba czytać po kolei; przeczytaj sobie, może pomogą w pozbyciu się tych "chybów" i "przypuszczamów" 🙂

Jak już stwierdzisz że wiesz jak to wszystko działa - odpowiedz. Bo następna część ćwiczenia to pokazanie, że ów kod chociaż działa i jest całkiem prawidłowy (nawet w większości przypadków jest odporny na drgania styków) - w rzeczywistości niespecjalnie nadaje się do zastosowania, i trzeba go napisać zupełnie inaczej.

 

Link do komentarza
Share on other sites

Ok @ethanak zagadnę do tego artykułu, @SOYER no dobrze czyli menuGlowne() dwa case, menuSilnik1() dwa case, i menuSilnik2() dwa case, mając 3 funkcje i w każdej funkcji po dwa case można wysterować to menu? Już w pierwszym case w menuGlownym() umieszczając if przycisk enter powinienem wywołać następną funkcje menuSilnik1(), bo to jest przejście z menu głównego do menu sterowania silnika 1.

void menuGlowne(){
  switch(menuEkran){
      case 1:
   > Silnik 1
     Silnik 2
   if (przyciskEnter)==LOW){
     menuSilnik1();
      

a co z opcją Silnik 2?  Gdybym chciał użyć Silnika 2 a nie wchodzić do sterowania silnikiem 1? Trzeba dopisać do case 1 jeszcze jeden if z przyciskiem dół 

void menuGlowne(){
  switch(menuEkranu){  // ekran początkowy
    case :
 > Silnik 1
   Silnik 2
 if (przyciskEnter)==LOW){ // wywołanie kolejnej funkcji menuSilnik1
   menuSilnik1();}
 if (przyciskDol)==LOW){  // przejście do kolejnej opcji w menu głównym Silnik 2
   menuEkran = 2;}
      break;
   
    case 2:
   Silnik 1
 > Silnik 2
    
   
   

Nie wiem ale to chyba nie o to ci chodzi.

  • Lubię! 1
Link do komentarza
Share on other sites

Tak, dokładnie o to chodzi. Zrób to.

Później sam będziesz widział ile tych if odnoszących się do wszystkich przycisków będziesz musiał za każdym razem pisać i, że fajnie byłoby zrobić to przy pomocy jednej funkcji, na którą będą reagować twoje switche, ale tylko wtedy gdy ta funkcja od przycisków coś zwróci. Do tego jednak wrócimy. 

Na razie kompletny kod działający taki jak wcześniej pisałem.

 

Link do komentarza
Share on other sites

No dobra przyznam się od razu bo i tak się zorientujesz i to szybko z czym jeszcze mam problem 

#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() {
  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:
  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:
  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:
    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(); 
 
  }
}

niby kompilator nie zgłasza błędu, ale działa kiepsko bo po wciśnięciu enter, wyświetlacz miga szybko na przemian menuGlowne i menusilnik1. Nie wiem jak te bloki kodu poukładać z tymi funkcjami żeby po wciśnięciu. przycisku enter nie działo się tak jak w przykładzie powyżej

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.