Skocz do zawartości

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


Norbert7630

Pomocna odpowiedź

Cześć wszystkim, przede wszystkim najlepszego w nowym roku , mam taki mały problem właściwie dla was to żaden. Otóż przez długi czas nie siedziałem przy arduino nie było czasu no i trochę chęci, a jak sami wiecie ciężki ze mnie przypadek do nauki, więc kiedy teraz po nowym roku chciałem cos zbudować na tym menu w którym mi pomagał SOYER I INNI, to się okazało że nie do końca to działa tak jak chce. przedstawię kod:

#include <SPI.h>
#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 przyciskWylacz 11  //zdefiniowane piny dla przycisków
#define przyciskZielona  9
#define przyciskCzerwona  10
#define diodaLedZielona 2   //zdefiniowane piny dla diod Led
#define diodaLedCzerwona 3
int przycisk = 1;   //zmienna z przypisaną wartością

void setup() {
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  pinMode(przyciskWylacz, INPUT_PULLUP); //ustawienie pinów dla przycisków " wejście" podciągnięty
  pinMode(przyciskZielona, INPUT_PULLUP);  //rezystor wewnętrzny PULLUP
  pinMode(przyciskCzerwona, INPUT_PULLUP);
  pinMode(diodaLedZielona, OUTPUT);  //ustawienie pinów dla diod Led "wyjście"
  pinMode(diodaLedCzerwona, OUTPUT);
  
}
void loop() {
 
 
    switch (przycisk){  
    case 1: 
    display.clearDisplay();
     display.setTextSize(1,2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,0);             
  display.println("SILNIK 1:");
  display.setCursor(60,0);
  display.println("STOP");
  display.setCursor(0,20);             
  display.println("SILNIK 2:");
  display.setCursor(60,20);
  display.println("STOP");
   display.setCursor(0,40);
  display.println("STEROWNIK SILNIKOW");
  display.display();  
    if (digitalRead(przyciskZielona)== LOW){ 
     digitalWrite(diodaLedZielona, HIGH);
       przycisk=2; }
  delay(20);  
    break;  
    
    case 2:
    display.clearDisplay(); 
    display.setTextSize(1,2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,0);             
  display.println("SILNIK 1:");
  display.setCursor(60,0);
  display.println("START");
  display.setCursor(0,20);             
  display.println("SILNIK 2:");
  display.setCursor(60,20);
  display.println("STOP");
   display.setCursor(0,40);
  display.println("STEROWNIK SILNIKOW");
  display.display();   
 if (digitalRead(przyciskWylacz)== LOW){ 
     digitalWrite(diodaLedZielona, LOW);   
      przycisk=3;  }
   delay(20);
     break;
   
  case 3:
  display.clearDisplay(); 
    display.setTextSize(1,2);             
  display.setTextColor(SSD1306_WHITE);        
  display.setCursor(0,0);             
  display.println("SILNIK 1:");
  display.setCursor(60,0);
  display.println("STOP");
  display.setCursor(0,20);             
  display.println("SILNIK 2:");
  display.setCursor(60,20);
  display.println("STOP");
   display.setCursor(0,40);
  display.println("STEROWNIK SILNIKOW");
  display.display();     
  if (digitalRead(przyciskCzerwona)== LOW){
      digitalWrite(diodaLedCzerwona, HIGH);
      przycisk=4;  }
  delay(20);
   break;

    case 4:
    display.clearDisplay();
    display.setTextSize(1,2);             
  display.setTextColor(SSD1306_WHITE); 
    display.setCursor(0,0);             
  display.println("SILNIK 1:");
  display.setCursor(60,0);
  display.println("STOP");
    display.setCursor(0,20);             
  display.println("SILNIK 2:");
  display.setCursor(60,20);
  display.println("START");
  display.setCursor(0,40);
  display.println("STEROWNIK SILNIKOW");
  display.display();   
 if (digitalRead(przyciskWylacz)== LOW){ 
     digitalWrite(diodaLedCzerwona, LOW);   
      przycisk=1;  }
   delay(20);
     break;
  } 
 }

Oczywiście kod jak wygląda tak wygląda i wiem że Wy zrobilibyście go lepiej, także nie śmiać się ze mnie na widok tego kodu 😅 . A w czym problem? Mianowicie nie mogę wybrnąć z problemu uruchamiania tych silników każdego z osobna i wyłączania, bo w obecnej formie silniki są włączane po kolei czyli żeby przejść do SILNIKA 2 musze najpierw włączyć i wyłączyć SILNIK 1, a chciałbym żeby ich uruchamianie odbywało się nie zależnie jeden od drugiego. Teraz nie wiem czy pominąłem jakiś szczegół w tej instrukcji sterującej świtach/case, czy tak się nie da zrobić. Po pewnych konsultacjach z kolegą SOYEREM nie co zmieniłem ten kod bo dzięki pewnej wypowiedzi kolegi Mistrza Soyera 😉 uświadomiłem sobie że można to po prostu zrobić na warunkach 

if

kod zmieniony:

  

#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 przyciskWylacz 11  //zdefiniowane piny dla przycisków
#define przyciskSilnik1  9
#define przyciskSilnik2  10
#define Silnik1 2   //zdefiniowane piny dla silnikow
#define Silnik2 3
int przycisk = 1;   //zmienna z przypisaną wartością
int silnik1 = 1;
int silnik2 = 1;


void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  
  pinMode(przyciskWylacz, INPUT_PULLUP); //ustawienie pinów dla przycisków " wejście" podciągnięty
  pinMode(przyciskSilnik1, INPUT_PULLUP);  //rezystor wewnętrzny PULLUP
  pinMode(przyciskSilnik2, INPUT_PULLUP);
  pinMode(Silnik1, OUTPUT);  //ustawienie pinów dla silnikow "wyjście"
  pinMode(Silnik2, OUTPUT);
  
  
}
void loop() {
  
  if (digitalRead(przyciskSilnik1)== LOW){  //jesli przycisk wcisniety
      digitalWrite(Silnik1, HIGH);}  //  wlacz silnik 1
  if (digitalRead(przyciskSilnik2)== LOW){ //jesli przycisk wcisniety
      digitalWrite(Silnik2, HIGH) ;}  //wlacz silnik 2
  if (digitalRead(przyciskWylacz)== LOW){ //jesli przycisk wcisniety
       digitalWrite(Silnik1, LOW); //wylacz silnik 1
       digitalWrite(Silnik2, LOW);} //wylacz silnik 2} 
  }

No ale jeśli chodzi o menu na wyświetlaczu i jak to zrobić tu już problem, dziękuje z góry za wszelka pomoc. 

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

tylko nie wiem czy akurat tej opcji mi potrzeba, najważniejsze że uruchomienie silników 1 i 2 już mogę zrealizować losowo, no ale może jednak dodać taką opcje że gdy pracują razem to jest możliwość wyłączenia każdego z osobna hm....🤔 tyle że tego to akurat nie wiem jak zrobić. @SOYER no i powiedz mi jak przenieść te twoje wypowiedzi tutaj? kopiuj wklej?

Link do komentarza
Share on other sites

@SOYER  

Odpowiedziano: wczoraj o 19:15

Cześć, program robi dokładnie to co mu napisałeś.

Po co Ci przycisk "Wyłącz" on ma wyłączać silnik który jest włączony, a jak są włączone oba to ma wyłączyć oba?

Jeśli tak to po pierwsze wywal sprawdzanie przycisku do osobnej funkcji np:

SprawdzPrzycisk(){

     if (digitalRead(przyciskZielona)== LOW){
       zrób_coś1;
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        zrób_coś2;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        zrób_coś3;
}

teraz co ma zrobić program pod "zrób coś":

masz dwa silniki więc musisz mieć po jednej zmiennej dla każdego silnika która będzie Ci mówić w jaki on jest aktualnie stanie:

int LedCzer;

int LedZiel;

więc robi się nam coś takiego:

SprawdzPrzycisk(){

     if (digitalRead(przyciskZielona)== LOW){
       LedZiel=1;
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        LedCzer=1;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        zrób_coś3;
}

teraz co robimy jak ktoś naciśnie "Wyłącz"?

Sprawdzamy czy któryś led(silnik) jest włączony, a jeśli tak to go wyłączamy...:

SprawdzPrzycisk(){

     if (digitalRead(przyciskZielona)== LOW){
       LedZiel=1;
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        LedCzer=1;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        if(LedZiel==1){
          LedZiel=0;
        }
        if (LedCzer==1){
        LedCzer=0;
        }
     }
}

OK, to sprawdzanie przycisków mamy zrobione, pora zabrać się za fizyczne sterowanie tymi (ledami/silnikami/pinami), zróbmy prostą funkcję.

Sterujemy(){
 if(LedZiel==1){
  diodaLedZielona=HIGH;
 }
 else{
  diodaLedZielona=LOW;
 }
 if(LedCzer==1){
  diodaLedCzerwona=HIGH;
 }
 else{
  diodaLedCzerwona=LOW;
 }
}

Teraz ekran i u wreszcie przyda się "switch":

masz cztery opcje(różne treści na ekranie): albo TYLKO jeden silnik jest włączony (1opcja), albo TYLKO drugi silnik jest włączony(2opcja), albo OBA silniki są włączone(3opcja), albo OBA silniki są wyłączone(4opcja).

Więc musisz sprawdzić która z tych opcji właśnie ma miejsce, np. tak:

if((LedZiel==0) && (LedCzer==0)){
opcja = 0;
}

dalej napisz TY kolejne linijki dla sprawdzenia pozostałych trzech przypadków(opcji).

i na końcu robisz funkcję

switch(opcja){
 case 1:
  coś tam wyświetlam
 break;

 case 2:
  coś tam wyświetlam
 break;

 case 3:
  coś tam wyświetlam
 break;

 case 4:
  coś tam wyświetlam
 break;
}

Wszystko, spróbuj to dokończyć i mi wyślij.

Miłego wieczoru.

@SOYER  

Odpowiedziano: wczoraj o 19:21

Mała poprawka, żeby nie było niedomówień, tam gdzie napisałem:

if((LedZiel==0) && (LedCzer==0)){ 
opcja = 0; 
} 

dalej napisz TY kolejne linijki dla sprawdzenia pozostałych trzech przypadków(opcji).

powinno być:

if((LedZiel==0) && (LedCzer==0)){ 
opcja = 1; 
} 

dalej napisz TY kolejne linijki dla sprawdzenia pozostałych trzech przypadków(opcji).

skoro case lecą 1,2,3,4 to pierwsza opcja musi być "1" a nie"0".

Link do komentarza
Share on other sites

Kopiuj-wklej może być😁

9 minut temu, Norbert7630 napisał:

tyle że tego to akurat nie wiem jak zrobić.

musisz mieć albo osobne przyciski do wyłączania, albo zrobić to z poziomu menu, albo wymyślić jakąś kombinację dla jednego przycisku(np. dłuższe przytrzymanie), albo tym samym przyciskiem włączasz i wyłączasz.

 

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

void loop() {
  
  if (digitalRead(przyciskSilnik1)== LOW){  //jesli przycisk wcisniety
      digitalWrite(Silnik1, HIGH);}  //  wlacz silnik 1
  if (digitalRead(przyciskSilnik2)== LOW){ //jesli przycisk wcisniety
      digitalWrite(Silnik2, HIGH) ;}  //wlacz silnik 2
  if (digitalRead(wylaczSilnik1)== LOW){ //jesli przycisk wcisniety
       digitalWrite(Silnik1, LOW);} //wylacz silnik 1
  if (digitalRead(wylaczSilnik2)== LOW){ //jesli przycisk wcisniety  
       digitalWrite(Silnik2, LOW);} //wylacz silnik 2} 
  }

no dobrze poszedłem po najsprośniejszej linii oporu i dołożyłem przycisk teraz mogą dwa silniki pracować i każdy nie zależnie od drugiego można wyłączyć😅

Link do komentarza
Share on other sites

Jeśli chodzi o wyświetlacz to raczej będzie kiepsko bo nie wiem od czego zacząć, pisałeś coś o dzieleniu na osobne funkcje:

SprawdzPrzycisk(){

     if (digitalRead(przyciskZielona)== LOW){
       zrób_coś1;
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        zrób_coś2;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        zrób_coś3;
}

SprawdzPrzycisk(){....to jest ta osobna funkcja? Bo jeżeli tak to czy nie powinna być jakoś zadeklarowana w programie podobnie jak przyciski define czy zmienne int?

Link do komentarza
Share on other sites

Sterujemy(){

Tutaj następna funkcja?

if((LedZiel==0) && (LedCzer==0)){
opcja = 0;

tej linijki polecenia to już w ogóle nie rozumie po za tym że to warunek tylko podmienił bym na:

if((silnik1==0) && (silnik2==0)){
opcja = 0;

 

Link do komentarza
Share on other sites

Wiesz co robi operator "&&"?

Wróc do mojego długiego postu i przeczytaj go proszę jeszcze raz powoli, masz tam po kolei rozpisane jak to zrobić.

Pisz czego nie łapiesz.

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

&& - obydwa warunki muszą być spełnione

== - dane są takie same

if((LedZiel==0) && (LedCzer==0)){ 
opcja = 1; 
} 

obydwa warunki muszą być spełnione żeby wykonał się kod w nawiasach klamrowych. Ogólnie to mam problem ze zrozumieniem wszystkiego za dużo tego na raz 😔

Jaka jest różnica pomiędzy tym zapisem części kodu:

if((LedZiel==0) && (LedCzer==0)){ 
opcja = 1; 
} 

a tym:

if(LedZiel==0 && LedCzer==0){ 
opcja = 1; 
} 

 

Link do komentarza
Share on other sites

Nie musisz dawac tych porownan w nawiasach...to co w nawiasach wykonuje sie jako pierwsze..wyzszy priorytet...w roznych rownaniach z np. dodawaniem, dzieleniem i mnozeniem nie da sie czesto zapisac bez nawiasow bo wynik bedzie bledny...

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

SprawdzPrzycisk(){ //tu już nie rozumie bo jeżeli jest to funkcja jakaś zmienna to czy nie powinna byc zadeklarowana gdzieś w programie np: int

     if (digitalRead(przyciskZielona)== LOW){ //dalsza część tego kodu to wciśnij przycisk
       zrób_coś1;                           //włącz silnik 1
     }
     if (digitalRead(przyciskCzerwona)== LOW){ //dalsza część tego kodu  to wciśnij przycisk
        zrób_coś2;                           //włącz silnik 2
     }
     if (digitalRead(przyciskWylacz)== LOW){ //dalsza część tego kodu  to wciśnij przycisk
        zrób_coś3;                            //wyłącz silnik 1
       //i tu powinien być jeszcze jeden if dla wyłączania silnika 2
}
int LedCzer; //zmienne bez przypisanych wartości???
int LedZiel; //dlaczego te zmienne są tutaj zadeklarowane a nie na początku programu?
 
 SprawdzPrzycisk(){ //znowu to samo wyrażenie co wyżej, co robi ten blok kodu? 

     if (digitalRead(przyciskZielona)== LOW){ //wciśnij przycisk
       LedZiel=1;              //i co się stanie?
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        LedCzer=1;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        zrób_coś3;
}
SprawdzPrzycisk(){ //ta część kodu to powtórzenie tego wyżej bo wygląda podobnie? tylko dopisana końcówka. 

     if (digitalRead(przyciskZielona)== LOW){
       LedZiel=1;
     }
     if (digitalRead(przyciskCzerwona)== LOW){
        LedCzer=1;
     }
     if (digitalRead(przyciskWylacz)== LOW){
        if(LedZiel==1){
          LedZiel=0;
        }
        if (LedCzer==1){
        LedCzer=0;
        }
     }
}
Sterujemy(){ //kolejna nie wiem czy to jakaś zmienna czy nazwa funkcji?
 if(LedZiel==1){
  diodaLedZielona=HIGH;
 }
 else{
  diodaLedZielona=LOW;
 }
 if(LedCzer==1){
  diodaLedCzerwona=HIGH;
 }
 else{
  diodaLedCzerwona=LOW;
 }
}
if((LedZiel==0) && (LedCzer==0)){ 
opcja = 1; 
} 

dalej napisz TY kolejne linijki dla sprawdzenia pozostałych trzech przypadków(opcji).
switch(opcja){
 case 1:
  coś tam wyświetlam
 break;

 case 2:
  coś tam wyświetlam
 break;

 case 3:
  coś tam wyświetlam
 break;

 case 4:
  coś tam wyświetlam
 break;
}

także nic nie wiem co i jak i z czym🥶

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.