Skocz do zawartości

Proste menu w Arduino i obsługa LCD I2C po raz enty...


Pomocna odpowiedź

2 godziny temu, Norbert7630 napisał:

tylko to mi przychodzi do głowy, żeby wstawić w case 1 aby móc przejść do START/STOP, nie wiem, muszę uciekać do pracy. Pozdrawiam

Nie. 

Wróć proszę do mojego poprzedniego posta i na spokojnie postaraj się odpowiedzieć na moje pyrania. 

  • Pomogłeś! 1
Link to post
Share on other sites

Może na wyżej wspomnianym przykładzie w switchu zmienna - x, w  case warunek do sprawdzenia ze zmienną, warunków case jest kilka, do pinu A5 podpięty regulowany dzielnik napięcia czyli potencjometr, zwiększa lub zmniejsza odczyt ADC, chcemy dokonać odczytu wartości z pinu A5 w formie binarnej, szesnastkowej itp. Każdy case ma przypisaną czynność związaną z odczytem tych wartości case d:, case h:, itp te literki w case po spacji to warunki i teraz jeżeli do monitoru portu szeregowego wpiszemy literkę ,,d,,  to mikrokontroler odczyta bieżąca wartość jaka jest na A5 i wyświetli ja na ekranie monitora szeregowego w formie Decymalnej i po za tym case-m nic więcej się nie wykona a nastąpi wyjście z całego switcha i mikrokontroler zaczyna sprawdzać na nowo w jakim położeniu jest potencjometr i czy nie wpisano do monitora jakiś danych do wykonania czyli np ,,h'' czyli ma wyświetlić odczyt z A5 w formie heksadecymalnej.

Nie wykonują się te linijki z case w których warunek ze sprawdzaną zmienną się nie zgadzał tzn. nie był równy.

Jeżeli nie wyłączysz mikrokontrolera czyli program  na nim będzie załadowany to chyba będzie w kółko sprawdzał w pętli głównej czy nie został na przykład wciśnięty jakiś przycisk.

Link to post
Share on other sites
48 minut temu, Norbert7630 napisał:

Może na wyżej wspomnianym przykładzie w switchu zmienna - x, w  case warunek do sprawdzenia ze zmienną, warunków case jest kilka, do pinu A5 podpięty regulowany dzielnik napięcia czyli potencjometr, zwiększa lub zmniejsza odczyt ADC, chcemy dokonać odczytu wartości z pinu A5 w formie binarnej, szesnastkowej itp. Każdy case ma przypisaną czynność związaną z odczytem tych wartości case d:, case h:, itp te literki w case po spacji to warunki i teraz jeżeli do monitoru portu szeregowego wpiszemy literkę ,,d,,  to mikrokontroler odczyta bieżąca wartość jaka jest na A5 i wyświetli ja na ekranie monitora szeregowego w formie Decymalnej i po za tym case-m nic więcej się nie wykona a nastąpi wyjście z całego switcha i mikrokontroler zaczyna sprawdzać na nowo w jakim położeniu jest potencjometr i czy nie wpisano do monitora jakiś danych do wykonania czyli np ,,h'' czyli ma wyświetlić odczyt z A5 w formie heksadecymalnej.

Skąd switch wie którego case włączyć, inaczej mówiąc z jakim "wzorcem" porównuje różne case, że wie który teraz jest spełniony? 

  • Pomogłeś! 1
Link to post
Share on other sites
Dnia 21.01.2021 o 20:52, SOYER napisał:

Pierwsza rzecz, nie masz pojęcia jak działa instrukcja warunkowa switch. Wróć do 6 odcinka kursu, tam przed omówieniem instrukcji switch jest takie zdanie, przykład, że można coś zrobić na "if", ale można prościej. Czytaj to tak długo aż zrozumiesz jak działa switch. Wtedy napisz tutaj jak ona działa. 

@SOYER to właśnie zrobiłem, podstaw sobie co ci pasuje i pomyśl że to ja zrobiłem, ja wiem że zmienna x nie może być porównana z żadnym case które wymieniłem tam, ale mi nie chodzi o szczegóły,  a jedynie sens zrozumienia samego działania tej instrukcji czy ja wiem czy nie wiem 😅

Link to post
Share on other sites

Powtarzam:

6 godzin temu, SOYER napisał:

Skąd switch wie którego case włączyć, inaczej mówiąc z jakim "wzorcem" porównuje różne case, że wie który teraz jest spełniony

  • Pomogłeś! 1
Link to post
Share on other sites
int numerEkranu = 1;  //zmienna z przypisaną wartością

switch(numerEkranu){  //instrukcja switch ze zmienną

case 1:  //warunek do porównania ze zmienną jeżeli jest równy zmiennej ten case się wykona, jeżeli nie to przejdzie do następnego

dobrze? 

wiesz co @SOYER jestem gamoń ale chyba mam dużo szczęścia:

945654875_arduinoquiz.thumb.jpg.99014d8778b0fb64c2562c5bb4320d73.jpg

Link to post
Share on other sites

Dobrze, 

Więc co powinieneś napisać w case 1, by po naciśnięciu przycisku w następnej pętli został wyświetlony case 3?

  • Pomogłeś! 1
Link to post
Share on other sites
case 1:     
lcd.clear();
      lcd.print(">POZYCJA 1");
      lcd.setCursor(0, 1);
      lcd.print(" POZYCJA 2");
 if (digitalRead(selectButton)==LOW) { //jesli przycisk wciśnięty
    numerEkranu++;               //przejdz do następnego ekranu

tylko tutaj nie wiem czy przypadkiem nie powinno być numerEkranu = 3;  a nie numerEkranu++; mam wrażenie że numerEkranu++ to tak jakby przeskoczenie o jeden ekran czyli do 2 więc case 2: ciężko mi teorie zamienić na praktykę

Link to post
Share on other sites

Cześć, czytałeś o operatorach? 

Co oznacza "++"? 

14 minut temu, Norbert7630 napisał:

mam wrażenie że numerEkranu++ to tak jakby przeskoczenie o jeden ekran czyli do 2

 

  • Pomogłeś! 1
Link to post
Share on other sites

Należy pamiętać o tym, że operator = służy do przypisania zmiennej wartości, a operator == do sprawdzenia czy dane wyrażenie (zmienna) jest równe wartości.

Ostatni element, czyli i++ jest inkrementacją zmiennej licznikowej (czyli, co obieg pętli wartość zmiennej zwiększana jest o jeden). Równie dobrze można ten zapis zamienić na i = i + 1 

Link to post
Share on other sites
(edytowany)

Cześć @SOYER , nie wiem co ci napisać bo już mam dosyć tego całego menu i chyba dam sobie z tym spokój, ot kolejna porażka i tyle. Ale zanim to nastąpi to wbrew temu co mówiłeś wyciągnąłem płytkę UNO bo się już bardzo kurzyła i sprawdziłem program. Oczywiście nie ten z menu bo i tak by nie działał ale program napisany przeze mnie taki przykładowy żeby sprawdzić czy teorie potrafię przekuć w praktykę:

#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 przyciskKolor = 1;   //zmienna z przypisaną wartością

void setup() {
  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() { //pętla główna
  switch (przyciskKolor){  //instrukcja sterująca switch ze zmienną do porównania ma wartość = 1
    case 1:   // case  z warunkiem do porównania ze zmienną, jeżeli warunek jest równy zmiennej to ten case się wykonuje
    if (digitalRead(przyciskZielona)== LOW){  //jeśli przycisk wciśniety
   digitalWrite(diodaLedZielona, HIGH);}   //włącz diode zieloną
   delay(100);  //przerwa lub opóźnienie mające na celu zniwelowanie stuków na przycisku - chyba coś takiego
    break;  // koniec case 1
    
    case 2:   //analogicznie do przykładu z case 1
 if (digitalRead(przyciskCzerwona)== LOW){  //jeśli przycisk wciśniety
   digitalWrite(diodaLedCzerwona, HIGH);}   //włącz diode czerwoną
   delay(100);
   break;
   
   case 3:
  if (digitalRead(przyciskWylacz)== LOW){
   digitalWrite(diodaLedZielona, LOW);
    digitalWrite(diodaLedCzerwona, LOW);}
  delay(100);
   break;
  }
 
}
  

oczywiście ten program nie działa a przynajmniej nie tak jak zakładałem, w takiej formie jak jest powyżej zapali się zielona i na tym koniec brak reakcji na przyciski( chociaż to i tak już sukces bo się zapaliła jakakolwiek dioda🤪🤣). Widząc ten kod pewnie bez problemu domyśliłeś się jaki efekt finalny chciałem uzyskać: (włączyć zieloną, włączyć czerwoną i wyłączyć wszystkie). W programie dodałem komentarze tak mniej więcej jak według  mnie to się odbywa:

 

switch (przyciskKolor){  //instrukcja sterująca switch ze zmienną do porównania ma wartość = 1

tutaj jest też błąd w komentarzu, bo napisałem że zmienna przybiera wartość 1, a przecież int to zmienna przechowująca w pamięci wartości liczbowe w tym przypadku 1, 2, 3......itp tak przynajmniej sądzę. Więc w takim postaram się króciutkim skrócie. 

int przyciskKolor = 1;  //część globalna

dalej

switch (przyciskKolor){ //część lokalna główna pętla

dalej

case 1: //warunek do sprawdzenia
if //jeśli wciśniety przycisk taki a taki
  digitalWrite() //zapal diode taką a taką
  break;
  //jeśli nie wcisnąłem tego przycisku to warunek nie spełniony i przedź do case 2:
  break;

Czyli jeżeli warunek po sprawdzeniu ze zmienną jest równy to np case 1: się wykonuje, jeżeli nie jest równy, to mikrokontroler sprawdza dalej który case jest równy zmiennej w przypadku wciśnięcia jakiegoś przycisku i jeżeli jest jakiś case po sprawdzeniu ze zmienną równy, to w tym case równym zmiennej wykonuje określone działanie. Jeżeli nie ma to wykonuje kod w części default. Po wykonaniu jakieś operacji w danym case lub default, mikrokontroler wychodzi ze switch do pętli głównej i na nowo sprawdza czy nie nastąpiło jakieś zdarzenie w postaci np. wciśnięcia przycisku. Nie wiem coś jak ruch po rondzie gdzie rondo to kod programu a samochód to mikrokontroler i jeżeli na rondzie pojawi się jakieś zdarzenie np. zatrzymaj się zgaś światła jedz dalej, to ten mikrokontroler-samochód to wykonuje i nadal krąży po tym rondzie-programie no tyle że z prędkością 16 mln okrążeń na sekundę, chyba coś takiego. Tyle że nie dawał mi spokoju jeden szczegół którego w powyższym kodzie nie ma a w zasadzie linijka z pewnym wyrażeniem

numerEkranu = 2; // to wyrażenie znalazło się w twoim przykładzie z pytaniem czy już to widze

i to samo zrobiłem z przykładem powyżej dodałem tą linijkę ale w innej formie:

#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 przyciskKolor = 1;   //zmienna z przypisaną wartością

void setup() {
  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() { //pętla główna
  switch (przyciskKolor){  //instrukcja sterująca switch ze zmienną do porównania ma wartość = 1
    case 1:   // case  z warunkiem do porównania ze zmienną, jeżeli warunek jest równy zmiennej to ten case się wykonuje
    if (digitalRead(przyciskZielona)== LOW){  //jeśli przycisk wciśniety
    digitalWrite(diodaLedZielona, HIGH);}   //włącz diode zieloną
   przyciskKolor++;
   delay(100);  //przerwa lub opóźnienie mające na celu zniwelowanie stuków na przycisku - chyba coś takiego
    break;  // koniec case 1
    
    case 2:   //analogicznie do przykładu z case 1
 if (digitalRead(przyciskCzerwona)== LOW){  //jeśli przycisk wciśniety
  digitalWrite(diodaLedCzerwona, HIGH);}   //włącz diode czerwoną
   przyciskKolor--;
   delay(100);
   break;
   
   case 3:  //case 3  nie działa 
  
  if (digitalRead(przyciskWylacz)== LOW){
    digitalWrite(diodaLedZielona, LOW);
  digitalWrite(diodaLedCzerwona, LOW);}
     //przyciskKolor--;
  delay(100);
   break;
  }
 
}

teraz mikrokontroler zachowuje się do case 3 poprawnie czyli jeżeli wcisnę przycisk diodaZielona to ją zapala jeśli diodaCzerwona to zapala czerwoną. Sytuacja może też być na odwrót najpierw czerwona a potem zielona czyli instrukcja switch w przypadku tych dwóch pierwszych case zachowuje się poprawnie: wciśnięcie przycisku od zielonej diody, mikrokontroler wyłapuje zdarzenie porównuje ten warunek ze zmienną, zgadza się wiec wykonuje to co jest w tym case lub wciśnięcie przycisku od czerwonej diody wyłapuje, porównuje i z case 1 warunek nie jest równy zmiennej więc przechodzi do następnego case 2, tam warunek jest równy zmiennej i wykonuje się to co jest w case 2. Do czego zmierzam? a no do tego że i tutaj jest jakiś błąd i całość jednak nie do końca rozumie, choćby tą linijkę o której wspomniałem przyciskKolor++. Myślę że szkoda twojego czasu @SOYER marnować na takie beztalencie jak ja, lepiej ten czas wykorzystaj tworząc dla siebie jakieś fajne projekty lub ucząc kogoś młodszego co ma chłonniejszy umysł na taką wiedzę, bo u mnie to już sucha gąbka która ledwie cokolwiek wchłania😀 poszukam jakieś fora na którym ten kod mi na bazgrolą😉 W zasadzie to jeszcze jedna rzecz najważniejsza że nie jest tak do końca że niczego się nie nauczyłem, bo na początku wkleiłem ci czyjś kod gdyż nie wiedziałem nawet jak się do tego zabrać a teraz.......jest kod powyżej który sam napisałem i częściowo bo częściowo ale działa, także sporo mnie nauczyłeś wielki szacun i wdzięczność za to. A narazie będe grzebał się w tym Arduino starał się tworzyć proste kody korzystając z kursu i starając się czegoś więcej nauczyć. Pozdrawiam. 

Edytowano przez Norbert7630
Link to post
Share on other sites
(edytowany)

good, teraz chociaż trochę widzisz czego mie wiesz:) 

a może by tak zamiast tajeminczego

przyciskKolor=--

dałbyś proste

przyciskKolor=3

,albo =2, albo  =4....?

Prostsze?

Chcesz przejść do ekranu 3 po naciśnieciu przycisku?

if(przycisk==LOW) {

costam... ;

przyciskKolor=3

}

Proste?

Piszes mi tu teraz nowy kod i wklejasz, zamiast mazać się jaki to stary jesteś. Chłop? Myśl, pisz, kombinuj, nikt tego za Ciebie nie zrobi. Nie masz 3 lata jak mój Dominik;). 

Switch to jak kolejne if.... 

if( cośtam) to po prostu case: cośtam... 

"jakaśZmienna" w switch(jakaśZmienna) to te "cośtam" z if-a.... 

Proste? 

Pisz... 

Edytowano przez SOYER
  • Pomogłeś! 1
Link to post
Share on other sites

No dobrze@SOYER 😀 skoro się tak uparłeś że można coś więcej mnie nauczyć, to może teraz rozwieje twoje  nadzieje i napisze ci jak ja to zrozumiałem.

piszesz że switch jest jak if ? no to ok tak programowo:

if = switch
if(warunek) = case warunek:
i co ma się wykonać

czyli ten blok programu miałby wyglądać tak?

switch (przyciskKolor){  
    case 1:   
    if (digitalRead(przyciskZielona)== LOW){  
    digitalWrite(diodaLedZielona, HIGH);   
   przyciskKolor=1;
 }     
   delay(100);  
    break;  

no i teraz już wiesz jaki ciężki przypadek ze mnie, bo  wiesz także że ten kod bloku nie będzie działał 😉

Link to post
Share on other sites
(edytowany)

yyy.................no tak tym razem znowu się myliłem 😅 zmieniłem trochę kod i jest chwilowe życie:

#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 przyciskKolor = 1;   //zmienna z przypisaną wartością

void setup() {
  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 (przyciskKolor){  
    case 1:   
    if (digitalRead(przyciskZielona)== LOW){ 
     digitalWrite(diodaLedZielona, HIGH);   
     przyciskKolor=2; }
  delay(20);  
    break;  
    
    case 2:   
 if (digitalRead(przyciskCzerwona)== LOW){ 
     digitalWrite(diodaLedCzerwona, HIGH);   
      przyciskKolor=3;  }
   delay(20);
     break;
   
   case 3:  
  if (digitalRead(przyciskWylacz)== LOW){
      digitalWrite(diodaLedZielona, LOW);
      digitalWrite(diodaLedCzerwona, LOW);
      przyciskKolor=4;  }
  delay(20);
   break;
   }
 }

Ogólnie program jednorazowego użytku 😂 po załadowaniu na płytkę bo jednak nie dawało mi to spokoju czy zadziała czy nie, diody ożyły no ale to jest tylko jedna sekwencja czyli włączę zieloną, włączę czerwoną, wyłączę obie i na tym koniec, dalej na przyciski już nie reaguje, ale oprócz tego wywołanie czerwonej diody jako pierwszej też jest nie możliwe, muszę to robić w kolejności 1 zielona 2 czerwona .....muszę na spokojnie sobie ten kod rozczytać, bo wygląda to tak jakby po załadowaniu kodu i wciśnięciu przycisku dla diody czerwonej warunek nie był równy zmiennej.@SOYER jesteś mistrzem świata.

Edytowano przez Norbert7630
Link to post
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

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.