Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

#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:
  if (digitalRead(przyciskDol)== LOW){  //jesli przycisk wcisniety
     
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(); 
  menuEkran = 2;}
    break;
 case 2:
 if (digitalRead(przyciskGora)== LOW){  //jesli przycisk wcisniety
      
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 2   
  display.println(" SILNIK 2");
  display.display();
  menuEkran = 1;}
  break;
 /* case 3:
  if (digitalRead(przyciskEnter)== LOW){
    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(); 
    menuEkran = 1;}
   menuSilnik1();
break;
  }
 }
 
void menuSilnik1(){
 
    switch(menuEkran1){
 case 1:
 if (digitalRead(przyciskGora)== LOW){  //jesli przycisk wcisniety
    
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(); 
   menuEkran1 = 2;} 
break;
/*
case 2:
if (digitalRead(przyciskDol)== LOW){  
     
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();
   menuEkran1 = 1;} 
   
break;
case 3:
if (digitalRead(przyciskBack)== LOW){
  menuGlowne();
}*/
}
}

@SOYER  może nie zwracaj na razie uwagi na ten fragment od komentowany, bo tu tylko było poprawianie tych nawiasów klamrowych żeby przy kolejnej funkcji nie wyskakiwał ten błąd że nie zadeklarowana. Co innego mnie teraz zastanawia w tej części pierwszej menuGlowne(), bo czegoś dalej nie rozumie. W momencie załadowania tego szkicu na płytkę wyświetla się ekran z case 1: żeby przejść dalej czyli przerzucić marker np. na silnik 1 musze najpierw wcisnąć przycisk w dół a następnie w górę i wtedy marker przeskakuje i dalej już reaguje poprawnie, i jeżeli zostawię marker na pozycji silnik1 i zrestartuje płytkę przyciskiem to po ponownym starcie programu wyświetla się ekran z markerem na silnik 1 i kod działa od razu dobrze ale nie stratuje tak jak po załadowaniu na płytkę od wyświetlania opcji z case 1:, ogólnie zauważyłem że na jakiej opcji wyświetlania zostawię tzn. czy marker jest na silnik1 czy jest na silnik2 to po restarcie płytki przyciskiem, na tej opcji wyświetlania się po restarcie pojawi. Więc pomyślałem że płytkę całkowicie odłączę od zasilania, po odłączeniu odczekałem chwilę żeby kondensatory się rozładowały, po podłączeniu pojawiły się rozsiane piksele ale w momencie wciśnięcia przycisku, menu się pokazało i działało poprawnie. Myślę że czegoś tu jeszcze brakuje związanego z wyświetlaczem coś jakby wyświetlania początkowego, od czego by program startował na wyświetlaczu a potem sprawdzał czy jakiś przycisk został wciśnięty i przechodził do kolejnych case.

Link do komentarza
Share on other sites

Nie znam się na tych wyświetlaczach który stosujesz, ale tak na szybko, to raczej sprawa funkcji samego wyświetlacza który być może "pamięta" ostatni ekran przed shutdownem. 

Co do tego pytania:

52 minuty temu, Norbert7630 napisał:

. W momencie załadowania tego szkicu na płytkę wyświetla się ekran z case 1: żeby przejść dalej czyli przerzucić marker np. na silnik 1 musze najpierw wcisnąć przycisk w dół a następnie w górę i wtedy marker przeskakuje i dalej już reaguje poprawnie,

To program dokładnie robi to co mu każesz, przeanalizuj to jak deklarujesz zmienne menuEkran, co to oznacza dla programu szczególnie dla case1, popatrz też co w nim wyświetlasz(case1), popatrz też jakie masz if w tym case.

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

No dobrze problem rozwiązany 

#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);
  display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println("STEROWNIK"); //menu glowne 
  display.setCursor(0,30);        //  znacznik na silnik 2   
  display.println("SILNIKOW");
  display.setTextSize(1);
  display.setCursor(35,50);        //  znacznik na silnik 2   
  display.println("VOL: 2");
  display.display();
  delay(3000);
  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 2   
  display.println(" SILNIK 2");
  display.display();
   }
void loop() {
  menuGlowne();
}
int menuEkran = 1;
int menuEkran1 = 1;

void menuGlowne(){
   
  switch(menuEkran){
  case 1:
  if (digitalRead(przyciskDol)== LOW){  //jesli przycisk wcisniety
     
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(); 
  menuEkran = 2;}
    break;
 case 2:
 if (digitalRead(przyciskGora)== LOW){  //jesli przycisk wcisniety
      
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 2   
  display.println(" SILNIK 2");
  display.display();
  menuEkran = 1;}
  break;
  }
}

dodałem w części setup ekran cos na wzór początkowy i teraz wszystko w tym kodzie działa, najpierw ekran startowy po 3 sekundach przechodzi do menu i przyciski działają normalnie, przycisk dół daje marker na silnik2 w górę daje na silnik1

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

Źle, obszedłeś problem zamiast go bardzo łatwo rozwiązać. Tak to nie może zostać, teraz wyobraź sobie, że po uruchomieniu programu ktoś zechce nacisnąć enter, by wejsc do menu silnika1. Znowu będziesz dopisywał w setupie?. Nie, wywal ten pomysł do kosza i wróć do mojego poprzedniego posta.

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

Przed chwilą, Norbert7630 napisał:

czy pomiędzy takim zapisem zmiennej w case 1:


menuEkran = 1;}

a takim


menuEkran ++;}

jest różnica?

No zasadnicza, tu ustawiasz na "1", a tu zwiększasz o "1".

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

Wiesz co myślałem że jak wyjdę załatwić pewne sprawy i trochę się przewietrzę, to mi pomoże lepiej później nad tym pomyśleć i...... się myliłem. Powiedz mi czy dobrze myślę jeżeli włączam program to :

1. najpierw ekran startowy w części setup 

display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println("STEROWNIK"); //menu glowne 
  display.setCursor(0,30);        //  znacznik na silnik 2   
  display.println("SILNIKOW");
  display.setTextSize(1);
  display.setCursor(35,50);        //  znacznik na silnik 2   
  display.println("VOL: 2");
  display.display();
  delay(3000);

 2. po delay(3000); czyli 3 sekundach:

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 2   
  display.println(" SILNIK 2");
  display.display();

3. dalej program przechodzi do pętli głównej void loop() i ją sprawdza czy wystąpiło jakieś zdarzenie np. wciśniecie przycisku.

4. wciskam przycisk w dół w case 1: to instrukcja warunkowa i teraz bo tu się zgubiłem, po wciśnięciu przycisku wyświetla to co w case1 i przechodzi do case2
?

Link do komentarza
Share on other sites

void menuGlowne(){
   
  switch(menuEkran){
  case 1:
  if (digitalRead(przyciskGora)== LOW){ //przycisk wcisniety
    //wyświetla
    > SILNIK 1
      SILNIK 2
      menuEkran ++;}
   break;
  case 2:
  if (digitalRead(przyciskDol)== LOW){ //przycisk wcisniety
    //wyświetla
     SILNIK 1
   > SILNIK 2
      menuEkran --;}
   break;

 

Link do komentarza
Share on other sites

3 minuty temu, Norbert7630 napisał:

krucze trochę problematyczny ten oled bo ma jakąś dziwną pamięć ostatniego ekranu, po zmianach w programie i załadowaniu nowego zapamiętuje to co miał na wyświetlaczu przed zmianami 🤔

One takie sa...po resecie musisz wyswietlic od nowa ekran startowy

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

1 minutę temu, Norbert7630 napisał:

a nie powinienem ten ekran startowy najpierw wsadzić do kodu?

No oczywiscie ze musisz...na starcie wyswietlasz ekran i przechodzisz do nastepnego case i tam sprawdzasz guziki dalej...jesli zresetujesz Ardu to znow zaczniesz od tego pierwszego case..

Link do komentarza
Share on other sites

21 minut temu, Norbert7630 napisał:

Wiesz co myślałem że jak wyjdę załatwić pewne sprawy i trochę się przewietrzę, to mi pomoże lepiej później nad tym pomyśleć i...... się myliłem. Powiedz mi czy dobrze myślę jeżeli włączam program to :

1. najpierw ekran startowy w części setup 


display.clearDisplay();
  display.setTextSize(2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,10);             
  display.println("STEROWNIK"); //menu glowne 
  display.setCursor(0,30);        //  znacznik na silnik 2   
  display.println("SILNIKOW");
  display.setTextSize(1);
  display.setCursor(35,50);        //  znacznik na silnik 2   
  display.println("VOL: 2");
  display.display();
  delay(3000);

 2. po delay(3000); czyli 3 sekundach:


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 2   
  display.println(" SILNIK 2");
  display.display();

3. dalej program przechodzi do pętli głównej void loop() i ją sprawdza czy wystąpiło jakieś zdarzenie np. wciśniecie przycisku.

4. wciskam przycisk w dół w case 1: to instrukcja warunkowa i teraz bo tu się zgubiłem, po wciśnięciu przycisku wyświetla to co w case1 i przechodzi do case2
?

Odpowiedź na pytania 1, 2, 3, 4: NIE. Wywal ekran z Setupu, ew. tylko jego czyszczenie zostaw.

3 minuty temu, farmaceuta napisał:

No oczywiscie ze musisz...na starcie wyswietlasz ekran i przechodzisz do nastepnego case i tam sprawdzasz guziki dalej...jesli zresetujesz Ardu to znow zaczniesz od tego pierwszego case..

Na starcie wyświetlasz ekran startowy, ale nie w setupie.

Wróciłeś do moich poprzednich postów, czy dalej upierasz się przy swoim @Norbert7630 ?

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.