Skocz do zawartości

Instrukcja warunkowa IF w programie Arduino


maly145

Pomocna odpowiedź

Dzień dobry jestem tutaj nowy. Chciałem się przywitać jak również prosić o pomoc.

To moje początki z Arduino po miganiu diodą chciałem przejść dalej mianowicie do instrukcji 'if". Z założenia według mnie proste po podaniu 5V na pin analogowy np. A5 następuje podanie stanu wysokiego na pinie 7 PWM gdzie podłączona jest dioda LED. Napisałem takie coś bo inaczej nie moge tego nazwać... lecz nie działa albo błąd odrazu podczas kompilacji typu nawiasy lub średnik. Jeżeli już nawet przejdzie kompilacje to nie działa w ogóle. Proszę was o pomoc ew. o podesłanie materiałów linków itp gdzie jest to w miare prosto opisane wszystkie podstawy 

void setup() 
{ 
  pinMode(A5, INPUT);
  pinMode(7, OUTPUT); 
  
 }
 
 
void loop()  {  
  
      
     if(analogRead(A5), HIGH){
      
     
     pinMode(7, HIGH);}

Przykłady tego typu jak poniżej moim zdaniem powinny lądować w koszu. Nie rorzumiem dlaczego nie może być zrobiony prosty przykład na diodzie LED 

PS. we wszystkich opisach instrukcji IF jest tylko napisane:

"Warunki służą do podejmowania decyzji w programie.

Tworzy się je za pomocą polecenia if [ang. czy?].

if () { }

Jeśli warunek z nawiasu jest spełniony, to zostanie wykonany kod znajdujący się między klamerkami." 

 

Edytowano przez Treker
Poprawiłem formatowanie.
Link do komentarza
Share on other sites

20 minut temu, maly145 napisał:

 if(analogRead(A5), HIGH)

Instrukcja if oczekuje warunku do sprawdzenia, a ty umieszczasz dwa parametry rozdzielone przecinkiem. Składnia jest taka:

if(warunek) wykonaj_jeśli_warunek_jest_spełniony;

Jeśli warunek jest spełniony, jest prawdziwy to program wykona określony kod. Prawda to w programowaniu true, 1, HIGH. Prawda to także zanegowany fałsz. Twój warunek powinien więc wyglądać:

if(digitalRead(A5)==HIGH) cos_tam lub np. if(digitalRead(A5)) cos_tam lub np. if(digitalRead(A5)!=LOW) cos_tam lub np. if(digitalRead(A5)==1) cos_tam

itp.

pinMode - nie ustawia portu w stanie HIGH lub LOW  lecz ustawia tryb jego pracy (wejście, wyjście)

Do ustawienia portu cyfrowego w odpowiednim stanie należy użyć digitalWrite(port, stan)  np.  digitalWrite(7,HIGH);

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

@maly145, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 19.01.2019 o 13:42, maly145 napisał:

To moje początki z Arduino po miganiu diodą chciałem przejść dalej mianowicie do instrukcji 'if". Z założenia według mnie proste po podaniu 5V na pin analogowy np. A5 następuje podanie stanu wysokiego na pinie 7 PWM gdzie podłączona jest dioda LED.

Mam wrażenie, że trochę mylisz (przynajmniej w programie) to czym są wejścia analogowe od cyfrowych i do tego masz jeszcze błędy w składni. Daj najpierw znać co dokładnie chcesz osiągnąć, czy chodzi Ci faktyczny o pomiar tych 5V na wejściu, czy po prostu chcesz sprawdzić czy przycisk został wciśnięty/zwarł wejście do 5V?

Polecam również lekturę kursu Arduino, bo już 2 drugiej lekcji jest tam opisany przykład wykorzystania warunku do włączenia diody. Może to coś rozjaśni? Kurs Arduino – #2 – podstawy programowania, porty I/O

Link do komentarza
Share on other sites

(edytowany)

Witam na wstępie chciałem podziękować użytkownikom "Belferek" za odpowiedź jak i "Treker" za materiały i podpowiedzi. 😉

Odnośnie programu to tylko proste próby jakie chciałem wykonać. Tak na początku chciałbym podać 5V i sprawić aby program poszedł dalej później to samo tylko z przyciskiem. Na razie wygląda to tak jak poniżej:

void setup() 
{ 
  pinMode(A5, INPUT);
  pinMode(7, OUTPUT); 
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
 }
 
 
void loop()  {  
  
      
     if(digitalRead(A5)==HIGH) // Sprawdzenie warunku czy podano 5V lub wciśnięcie przycisku.
   
  
    {  digitalWrite(7, HIGH);  // Diody zapalające się jedna po drugiej od nr: 7 do 3.
     delay(2500);
     digitalWrite(6, HIGH);
     delay(2000);
     digitalWrite(5, HIGH);
     delay(1500);
     digitalWrite(4, HIGH);
     delay(1000);
     digitalWrite(3, HIGH);
     delay(500);
     digitalWrite(2, HIGH);  // Dioda która sygnalizuje błąd w przypadku nie spełnienia warunku.
     delay(250);}
}

 

PS. Program startuje przy 5V ale również 3.3V sprawia że zaczyna działać. Chciałbym dodać też do tego warunek else.

moja wizja jest taka jeżeli po 5 sek nie zostanie podane 5V na pin A5 to np zapali się dioda na pinie PWM 2 oznaczająca bląd.

I mam jeszcze pytanie jak sprawić żeby program zawracał na początek po wykonaniu wszystkich lini kodu ?? tak na przyszłość...

dziękuje za wyrozumiałość i przepraszam za wszystkie błędy jeżeli coś źle nazwałem.

Edytowano przez maly145
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

1 godzinę temu, maly145 napisał:

na początku chciałbym podać 5V

To nie do końca jest tak, że HIGH czyli logiczna 1 jest równa 5 V. W zależności od standardu układu z tym jest różnie - zobacz poziomy TTL

Źle się czyta Twój kod. W czasie redagowania postu do wklejenia kodu użyj znacznika Kod czyli <>

1 godzinę temu, maly145 napisał:

 digitalWrite(2, HIGH);  // Dioda która sygnalizuje błąd w przypadku nie spełnienia warunku.

Tyle, że ta dioda będzie się świecić (po czasie) gdy warunek jest spełniony. Instrukcja ta jest w bloku instrukcji if(warunek {}

Twój programik może wyglądać tak:

void setup() 
{ 
  pinMode(A5, INPUT);
  for(int k=2; k<=7; k++) pinMode(k, OUTPUT); 
 }
 
 
void loop()
{  
   if(digitalRead(A5)==HIGH) // Sprawdzenie warunku czy podano 5V lub wciśnięcie przycisku.
    {  
	     for(int k=7; k>2; k--)
	     {
	       digitalWrite(k,HIGH);
	       delay(2500-(7-k)*500);
	     }
	}
   else
    {
	     digitalWrite(2, HIGH);  // Dioda która sygnalizuje błąd w przypadku nie spełnienia warunku.
	     delay(250);
	}
} 

Sprawdź czy działa? Spróbuj go przeanalizować. Czy jest dla Ciebie czytelny - postaraj się go zrozumieć.

 

1 godzinę temu, maly145 napisał:

mam jeszcze pytanie jak sprawić żeby program zawracał na początek po wykonaniu wszystkich lini kodu

Praktycznie nic nie robisz. Twój program działa w obrębie funkcji loop(), a loop to po polsku właśnie pętla. To główna pętla programu. Instrukcje zawarte w tej funkcji są kolejno wykonywane, a po wykonani ostatniej automatycznie program wraca na początek tej pętli - to taka nie kończonca się pętla.

Edytowano przez Belferek
Link do komentarza
Share on other sites

Używanie pętli przy konfiguracji pinów to paskudny nawyk. Ale nawet jeśli już ktoś takie gafy popełnia to może chociaż bez błędów:

for(int k=2; k<7; k++) pinMode(k, OUTPUT); 

(podpowiedź: czy pin 7 działa poprawnie?)

Link do komentarza
Share on other sites

Elvis czujnie zauważył 🙂, że chcąc używać pinu 7-go pętla for przy ustawieniu trybu pracy portów powinna wyglądać np. tak:

for(int k=2; k<=7; k++)....

Liczyłem na to, że wyłapie to analizujący przykład maly145 (chyba, że jest reinkarnacją xirtt) , no ale wyłapał Elvis 🙂.

1 godzinę temu, Elvis napisał:

Używanie pętli przy konfiguracji pinów to paskudny nawyk

A to niby dlaczego - przecież pętle to naturalne narzędzie do tego typu zastosowań, do wykonywania powtarzających się "czynności" w/g jakiegoś tam indeksu pętli?

Edytowano przez Belferek
Link do komentarza
Share on other sites

Używanie int do numeracji pinów oraz naiwne stosowanie pętli ma co najmniej trzy wady.

Po pierwsze jest złe!

Po drugie, jest to błąd logiczny. Pin nie jest integerem, co jeśli ktoś odwoła się do pinu -1, albo 1234. To powinien być typ wyliczeniowy, albo coś podobnego. W każdym razie używanie int to błąd popełniony w Arduino, aby uczynić życie początkujących łatwiejszym, ale to nadal błąd. Efektem jest możliwość inkrementacji, ale jaki jest sens pin++? Przecież prawdziwych pinów nie można zwiększać. Tak samo pin +=5, czy pin -=100 - to logicznie bez sensu. O mnożeniu i pierwiastkowaniu pinów nawet nie wspomnę.

Po trzecie wreszcie, skąd pomysł, że diody będą zawsze podłączone do kolejnych pinów? Oczywiście w prostym przykładzie i na płytce stykowej możemy tak zrobić, ale w realnym świecie i prawdziwych projektach rzadko kiedy mamy luksus podłączenia w sposób wygodny dla programisty. Więc drobna zmiana w projekcie, podłączenie diodek do pinów 2,3, 5,6,7,8 i cała skomplikowana konstrukcja z for() jest w koszu. Co najgorsze to minimalna zmiana, a kod trzeba w wielu miejscach połatać.

Tak więc używanie pętli w taki sposób jest jeszcze gorsze niż kopiuj-wklej. Można, nawet warto użyć pętli - ale lepiej, nie tak jak w tych przykładach.

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

2 minuty temu, Elvis napisał:

Więc drobna zmiana w projekcie, podłączenie diodek do pinów 2,3, 5,6,7,8 i cała skomplikowana konstrukcja z for() jest w koszu.

Oczywiście i każdy prędzej czy później dochodzi do wniosku, że warto rozważyć co i gdzie podłączamy. Kolega maly145 jeszcze chwilę będzie potrzebował by zauważyć różnicę pomiędzy różnymi typami zmiennych  więc nie chciałem komplikować.

Link do komentarza
Share on other sites

Witam jestem początkującym użytkownikiem arduino .Bardzo bym prosił o napisanie programu z dokładnym opisem gdzie copodlaczyc , na mostek H . L293D silnik ma się kręcić raz w lewo , raz w prawo z możliwością ustawiania czasu obrotów w lewo , i prawo Bardzo dziękuje 

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.