Norbert7630 Napisano Styczeń 8, 2022 Udostępnij Napisano Styczeń 8, 2022 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. Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 8, 2022 Udostępnij Styczeń 8, 2022 (edytowany) @Norbert7630 nie, nie, nie, napisałem Ci jak to masz zrobić, linijka za linijką, w najprostszy możliwy chyba sposób, a Ty to znowu pozmieniałeś. A co z wyświetlaczem? Edytowano Styczeń 8, 2022 przez SOYER 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 8, 2022 Udostępnij Styczeń 8, 2022 Wklej całą moją odpowiedź, tak jak Cię prosiłem kiedy pisałem byś założył wątek. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 aha, rozumię już o co chodzi z tym że wyłączam oba silniki jak są dwa włączone a nie np: jeden z nich a drugi dalej pracuje Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 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? Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 @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". Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 8, 2022 Udostępnij Styczeń 8, 2022 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 tylko taki pomysł z przeniesieniem twoich wiadomości do mnie tutaj przyszedł mi do głowy, przepraszam jak nie tak miałem to zrobić😅 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 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ć😅 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 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? Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 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; Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Styczeń 8, 2022 Udostępnij Styczeń 8, 2022 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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 && - 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; } Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 8, 2022 Udostępnij Styczeń 8, 2022 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... 1 Cytuj Link do komentarza Share on other sites More sharing options...
Norbert7630 Styczeń 8, 2022 Autor tematu Udostępnij Styczeń 8, 2022 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🥶 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!