Skocz do zawartości

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


Komentator

Pomocna odpowiedź

A czym się różni "dopóki" od "jeśli"?

while (coś) - dopóki warunek jest spełniony wykonuj następną instrukcję (lub blok)

if (coś) - jeśli warunek jest spełniony, wykonaj następną instrukcję (lub blok)

 

Link do komentarza
Share on other sites

2 godziny temu, ethanak napisał:

A czym się różni "dopóki" od "jeśli"?

while (coś) - dopóki warunek jest spełniony wykonuj następną instrukcję (lub blok)

if (coś) - jeśli warunek jest spełniony, wykonaj następną instrukcję (lub blok)

 

Dzięki wielkie za odpowiedź za odpowiedź. Mam jeszcze jedno odnośnie tych funkcji delay na końcu strony. Nie rozumiem jakim cudem one działają skoro program siedzi już w while, a delay był wcześniej.

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

Kochani, w 1 przykładzie z przyciskiem, mam wszystko podłączone jak trzeba, program skopiowałem, żeby wykluczyć błąd i niestety wciśnięcie guzika nie powoduje żadnej reakcji, zmieniałem też pin i nic, macie pomysł gdzie może być problem?.

Jeśli zamiast jak poniżej:

 pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP);
  digitalWrite(8, LOW); //Wyłączenie diody

zrobię:

 pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP);
  digitalWrite(8, HIGH); //Wyłączenie diody

To dioda po prostu świeci i już.

Andrzej

Ps '

Próbowałem też zrobić przykład ze strony arduino.cc, w którym miała się zapalić dioda koło pinu nr. 13. i też nie zadziałało, ponadto zamiast przycisku próbowałem za pomocą dwóch kabelków wpiętych w miejsca, gdzie były wtyki przycisku i zwierałem je na krótko, też nic ;/

Edytowano przez AndrzejWi
Link do komentarza
Share on other sites

@ethanak, w przypadku kodu gdzie nie ma nic innego w void loop() poza ifem (tak jak na części przykładów z tej lekcji), wychodzi na to samo jakby był tam while więc nie masz co się dziwić @Kubaaa. Słusznie zauważył, że na przykład w kodzie spod "Program ten najlepiej zrealizować z użycie pętli while(), będzie to wyglądało następująco:" można użyć while lub if i będzie to to samo.

Link do komentarza
Share on other sites

Krótki, mówisz... no to masz:

void setup()
{
  pinMode(13,OUTPUT);
  pinMode(12,INPUT_PULLUP);
  digitalWrite(13,LOW);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(12) == LOW) { // klawisz naciśnięty
    digitalWrite(13, HIGH); // zapalamy diodę
    delay(500); // czekamy
    digitalWrite(13, LOW); // gasimy diodę
    delay(500); // czekamy
  }
  Serial.println("Koniec instrukcji IF");
  delay(2000);
}

    
    
    
void setup()
{
  pinMode(13,OUTPUT);
  pinMode(12,INPUT_PULLUP);
  digitalWrite(13,LOW);
  Serial.begin(9600);
}

void loop()
{
  while (digitalRead(12) == LOW) { // klawisz naciśnięty
    digitalWrite(13, HIGH); // zapalamy diodę
    delay(500); // czekamy
    digitalWrite(13, LOW); // gasimy diodę
    delay(500); // czekamy
  }
  Serial.println("Koniec instrukcji WHILE");
  delay(2000);
}

    
    
    

Podłącz klawisz do pinu 12 i wciśnij go na dłużej niż sekundę (np. na 5 sekund) - zobaczysz różnicę.

Trzeba pamiętać, że w programie istnieje jeszcze jedna pętla while, której co prawda nie widać ale jak dobrze poszukasz to znajdziesz. W skrócie wygląda to tak:

int main(void)
{
  setup();
  while (1) loop();
}

Stąd może brać się wrażenie, że while i if robią to samo - w rzeczywistości zadziała tu instrukcja while z funkcji main.

Jeśli z podanych przeze mnie przykładów usuniesz dwie ostatnie linijki (czyli  Serial.println() i delay() ) - programy będą zachowywać się tak samo. Spróbuj sobie odpowiedzieć na pytanie "dlaczego".

Link do komentarza
Share on other sites

12 godzin temu, Gieneq napisał:

@AndrzejWi Wrzuć proszę cały kod programu bo z tego nic nie wynika 😞 

void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody
}
 
void loop()
{
  if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(8, HIGH); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(8, LOW); //Wyłącz diodę
  }
}

Tylko że to kod żywcem wyjęty z lekcji 🙂, więc nie wiem czy to coś da, tak samo wkleiłem go do arduino

 

edit

@Gieneq

Dzięki za reakcję, sprawdziłem jeszcze raz, jeden z kabelków, którego używałem wczoraj nie styka gdzieś 🙂

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

14 godzin temu, AndrzejWi napisał:

którego używałem wczoraj nie styka gdzieś

Zdarza się taki problem, ale fajnie że doszedłeś do niego i udało się rozwiązać 🙂 powodzenia z dalszymi zadaniami

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

11 godzin temu, Gieneq napisał:

Zdarza się taki problem, ale fajnie że doszedłeś do niego i udało się rozwiązać 🙂 powodzenia z dalszymi zadaniami

A dziękuję, No taka pierdoła, a potrafi zablokować postęp. Muszę przywyknąć do używania miernika. 😄

Pozdrawiam serdecznie.

edit

Mam takie oto spostrzeżenie, proszę mnie poprawić jeśli się mylę, z mojej obserwacji wynika, że ta funkcja loop, to nic innego jak pętla while, z jedną tylko różnicą, w loop nie można podać jakiegoś argumentu. poza tym, zawartość loop, wykonuje się nonstop, czy zatem w przypadku, gdy chcemy np. aby dioda na płytce migała tylko w określony sposób, po naciśnięciu guzika np. to nie ma sensu umieszczać tego w while, skoro wystarczy warunek, który mówi o tym, że jeżeli mamy np. LOW na pinie 7, to dioda ma migać. Czy są jeszcze jakieś ograniczenia loop w stosunku do while?

Programowanie w ten sposób różni się nieco od zwykłego programowania tym, że podłączony kontroler cały czas wykonuje określone operacje jeśli jest podłączony do zasilania i trzeba pamiętać o tym, aby go obwarować warunkiem, aby nic nie robił.

Prosty przykład użycia pętli for, z ograniczoną liczbą powtórzeń, jeśli np. nie powiemy mu, ze ma wykonać określoną czynność x razy po kliknięciu, to nic nie da nam zadeklarowanie w pętli max. liczby obrotów, bo wykona ona np. 2 obroty i program znów wraca do obracania, czyli czy jest 2 czy nieskończoność, to i tak wychodzi na to samo.

 

 

 

Edytowano przez AndrzejWi
Link do komentarza
Share on other sites

2 godziny temu, AndrzejWi napisał:

z mojej obserwacji wynika, że ta funkcja loop, to nic innego jak pętla while

Bardzo dobrze wynika. Jeśli dokładnie poszukasz na swoim dysku, znajdziesz plik main.cpp, w którym kluczowa linijka wygląda mniej więcej tak:

while (true) loop();

Wcale nie musisz używać wiringowego setup/loop. Możesz sobie stworzyć funkcję main(), a wtedy kompilator użyje Twojej, a nie tej wbudowanej.

Możesz równie dobrze stworzyć pustą funkcję loop która nigdy nie będzie wywoływana, a cały kod umieścić w setup().

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

14 minut temu, ethanak napisał:

Bardzo dobrze wynika. Jeśli dokładnie poszukasz na swoim dysku, znajdziesz plik main.cpp, w którym kluczowa linijka wygląda mniej więcej tak:


while (true) loop();

Wcale nie musisz używać wiringowego setup/loop. Możesz sobie stworzyć funkcję main(), a wtedy kompilator użyje Twojej, a nie tej wbudowanej.

Możesz równie dobrze stworzyć pustą funkcję loop która nigdy nie będzie wywoływana, a cały kod umieścić w setup().

No ok, alez Twojego doświadczenia, przy bardziej rozbudowanych projektach, lepiej pisać program w oparciu o setup/loop, czy lepiej od początku skupić się na nauce "czystego kodu"?

Link do komentarza
Share on other sites

1 minutę temu, AndrzejWi napisał:

lepiej pisać program w oparciu o setup/loop, czy lepiej od początku skupić się na nauce "czystego kodu"

Co ma wspólnego "czysty kod" (nie wiem co przez to rozumiesz) ze standartem Wiring? Po coś powstał, prawda? Poza tym ta linijka, którą pokazałem to uproszczenie: zajrzyj na własny dysk, zobacz jak w rzeczywistości wygląda main.cpp, pokaż gdzie tam masz jakiś "nieczysty kod" (cokolwiek byś przez to rozumiał)...

Równie dobrze możesz programować bez stdio i napisać własnego printfa... tylko po co?

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.