Skocz do zawartości

Kurs Arduino - #2 - podstawy programowania, porty I/O


Komentator

Pomocna odpowiedź

19 godzin temu, eksio napisał:

mając równe 5V można także podlaczyc zasilanie do pinu 5V

Dokładnie tak, dla formalności dodam tylko, że nie można zasilać Arduino podając samo 3,3V na tak opisany pin. Dla wielu osób będzie to oczywiste, ale wolę napisać, aby nikt się nie dziwił później, że zasilanie przez 5V działa, a przez 3,3V już nie 😉

Link do komentarza
Share on other sites

Link do komentarza
Share on other sites

Witam serdecznie, mam pytanie apropos trzeciej części kursu Arduino poziom 1, a mianowicie funkcji while.

W przykładzie z diodami pętla while została użyta po określeniu odpowiedniej sekwencji zapalania się diod.

przykład: 

digitalWrite(10, LOW); //Czerwona

  digitalWrite(9, LOW); //Pomarańczowa

  digitalWrite(8, HIGH); //Zielona

  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde

  while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty

rozumiem , że chodzi tu o zatrzymanie programu w momencie kiedy pali się ta jedna dioda do momentu, kiedy warunek przestanie być spełniany, jednak zastanawia mnie, dlaczego nie można by napisać tego w taki sposób:

  while (digitalRead(7) == HIGH) {

digitalWrite(10, LOW); //Czerwona

  digitalWrite(9, LOW); //Pomarańczowa

  digitalWrite(8, HIGH); //Zielona

}

 delay(1000); //Zatrzymujemy program przed wejściem do pętli na 1 sekundę

 

Jedyną różnicą, jaką zaobserwowałem jest fakt, iż zamiast sekundy, przez którą nie można nic zrobić w przypadku pierwszym, czyli po zmianie na następną pętle, w której pali się inna dioda( przez pierwszą sekundę z powodu ''delay'' będzie się ona paliła niezależnie od, tego czy i ile razy wciśniemy przycisk,) w drugim przypadku następuje ona po wciśnięciu go, czyli uściślając wciskamy przycisk, ''wcześniejsza'' dioda pali się jeszcze przez sekundę i dopiero wtedy zachodzi zmiana.

Czy oprócz tego są jeszcze jakieś różnice w tym zapisie komendy? Czy może są przykłady, w których wskazane jest użyć konkretnego rozwiązania z tych dwóch, czy może jest to tylko kwestia preferencji(w co wątpie:) )? Po prostu staram się to jak najlepiej zrozumieć, a nie do końca widzę różnicę i z tego powodu nie jestem pewien, którego wyjścia używać:)

Pozdrawiam serdecznie i z góry dziękuję za poswięcony czas:)

 

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

@StachuGDY, 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 23.12.2018 o 22:52, StachuGDY napisał:

rozumiem , że chodzi tu o zatrzymanie programu w momencie kiedy pali się ta jedna dioda do momentu, kiedy warunek przestanie być spełniany

Słusznie, dokładnie o to chodzi.

Dnia 23.12.2018 o 22:52, StachuGDY napisał:

jednak zastanawia mnie, dlaczego nie można by napisać tego w taki sposób:

Można, ale trochę to bez sensu, bo wtedy w pętli cały czas ustawiasz stany na diodach. To tak jakbyś podszedł do włącznika światła, włączył je, a później cały czas dalej wciskałbyś przełącznik. Efekt ten sam, a Ty nie potrzebnie byś go naciskał 😉

W tak prostym programie nie ma to większej różnicy, ale ogólnie odradzałbym drugą metodę.

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

  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, LOW); //Zielona
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 

Rozumiem, że jeżeli będę "wciskał" przycisk dłużej niż sekundę to program przeskoczy jeden zbiór zadań i zatrzyma się na kolejnym czekaniu sekundy. 
Teoretycznie można ustawić zadanie używając tego kodu na długość trzymanego przycisku, tak?  Chodź pewnie do takiego zadania milej i łatwiej (Jeżeli po pętli miały by się dziać inne zdarzenia czasowe) byłoby użyć przedziału czasu w jakim przycisk ma być odciśnięty, a jeżeli się tak nie stanie to pominie dalszy kod i przejdzie do kolejnego zbioru zadan .

Jest to zrozumiałe co napisałem w ogóle? 😛 

Link do komentarza
Share on other sites

@bydlak69, 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 11.01.2019 o 22:31, bydlak69 napisał:

Rozumiem, że jeżeli będę "wciskał" przycisk dłużej niż sekundę to program przeskoczy jeden zbiór zadań i zatrzyma się na kolejnym czekaniu sekundy. 

Jeśli w kodzie byłoby kilka takich fragmentów to stanie się dokładnie tak, jak to opisałeś.

Dnia 11.01.2019 o 22:31, bydlak69 napisał:

Teoretycznie można ustawić zadanie używając tego kodu na długość trzymanego przycisku, tak? 

Nie byłoby to najwygodniejsze rozwiązanie, ale tak, teoretycznie jest to możliwe 🙂

Link do komentarza
Share on other sites

Mam pytanie:

Dlaczego pod koniec artykułu jest napisane:  " while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty"

Prędzej było napisane: "while (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty"

To gdy jest low, to oznacza, że jest wciśnięty czy nie? Z góry dzięki za odpowiedź.

Link do komentarza
Share on other sites

@Panda, 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.

2 godziny temu, Panda napisał:

Prędzej było napisane: "while (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty"

W pierwszym zapisie nic nie robimy (pusta pętla) i czekamy na wciśnięcie przycisku, aby przejść do dalszej pętli programu. W drugim wykonujemy cały czas operacje, które są w pętli i wychodzimy z niej po wciśnięciu przycisku. Zmieniłem komentarze pod koniec artykuły, aby były łatwiejsze w zrozumieniu na "//Czekaj na wciśnięcie przycisku" - mam nadzieję, że teraz będzie prościej 😉

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

Światła drogowe, kojarzą mi się z samochodem i jego reflektorami, natomiast w ćwiczeniu diody kojarzą mi się raczej ze świetlną sygnalizacją uliczną np na niektórych, większych skrzyżowaniach ulic ....

 

PS

Ale kurs ok.

Edytowano przez narbej
Link do komentarza
Share on other sites

Cześć mam pewien problem z warunkiem if, mam pewne dane zapisane w zmiennej buf i chciałbym żeby warunek if odczytywał tylko konkretną wartość, tak wygląda mój warunek 

     if(buf == 8,0,40,0,0,65,0,88){
      Serial.println("odebrałem dane ");
      wlacz=2;
    }}

 

     //tak to mniej więcej ma wyglądać że tylko 65 sprawdzi.
if(buf == 0,0,0,0,0,65,0,0){ // sprawdź tylko wartość 6 bajtu 
      Serial.println("odebrałem dane o mignieciu");
      wlacz=2;
    }}

I teraz działa tak że jeśli wszystko jest to samo to włącz=2; a chcę aby warunek if odebrał i sprawdzał tylko np.65 pomijając wszystkie poprzednie. Poratujecie? 

Dobra udało mi sie 

        Serial.print(buf[i], HEX); Serial.print(",");
      } else {
        Serial.print(buf[i], HEX); Serial.println(";");
      }

       
    }
    Serial.println(buf[5], HEX);//tutaj odczytuje wartość 6

 

Edytowano przez radex324
  • Lubię! 1
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.