Skocz do zawartości

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


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 😉

  • 4 tygodnie później...
  • 1 miesiąc później...

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:)

 

@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
  • 2 tygodnie później...
  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? 😛 

@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 🙂

  • 3 tygodnie później...

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ź.

@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
(edytowany)

Ś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
  • 1 miesiąc później...
(edytowany)

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

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...