Skocz do zawartości

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


Komentator

Pomocna odpowiedź

9 minut temu, ethanak napisał:

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?

"czysty kod" to mój taki skrót myślowy. Nie jestem przekozakiem programowania(programistycznie wychowałem się na php) i dla mnie istnieje rozróżnienie na dwie możliwości, czysty język, lub framework, Więc czy setup/loop, to coś takiego jak framework, czy taki powiedzmy podstawowy C/C++?

Bo jeśli to drugie, to pytam tylko czy lepiej się uczyć na tych nakładkach, czy na czymś bardziej podstawowym.

Przepraszam, jeśli nie wyrażam się dość jasno, być może to wynika z mojej ignorancji.

Pozdrawiam serdecznie.

 

Link do komentarza
Share on other sites

10 godzin temu, AndrzejWi napisał:

programistycznie wychowałem się na php

Taaa... to wiele wyjaśnia 😉

10 godzin temu, AndrzejWi napisał:

dla mnie istnieje rozróżnienie na dwie możliwości, czysty język, lub framework

Tak z ciekawości: czy w świecie Programistów PHP takie cosie jak:

  1. gd
  2. mysqli
  3. phpmailer

to elementy czystego języka czy frameworki?

10 godzin temu, AndrzejWi napisał:

Bo jeśli to drugie, to pytam tylko czy lepiej się uczyć na tych nakładkach, czy na czymś bardziej podstawowym.

Ucz się tego, czego Ciebie uczą. Wyjdź z założenia, że nauczyciel z zasady wie więcej niż uczeń i decyduje, czego się takowy uczeń powinien uczyć żeby się nauczyć.

A poza tym przyznaj się: w link który Ci podesłałem to pewnie nawet nie kliknąłeś?

Link do komentarza
Share on other sites

8 godzin temu, ethanak napisał:

A poza tym przyznaj się: w link który Ci podesłałem to pewnie nawet nie kliknąłeś?

Nawet kliknąłem, ale coś mi jeszcze umyka. 🙂

 

Co do pytania z 3 punktami, to nie wiem, nie bywam w tym świecie, zawodowo nie zajmuję się programowaniem.😉

Umiem tylko pisać programy, których sam potrzebuję i znam się tak na poziomie max b2 .

Link do komentarza
Share on other sites

Dnia 14.07.2020 o 10:52, ethanak napisał:

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

U mnie nic nie ma. Programy działają tak samo. W internecie szczątkowe informacje na ten temat. 

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, Kubaaa napisał:

Nie właśnie 😔

void setup() {
  
  pinMode(8, OUTPUT);
  pinMode(7, INPUT_PULLUP);
   
    }



void loop() {
               if(digitalRead(7) == LOW) //jeśli guzik ma stan niski
                 {
                  digitalWrite(8, HIGH); // dioda się świeci
                  } 
                if(digitalRead(7) == HIGH) //jeśli guzik ma stan wysoki
                  {
                  digitalWrite(8, LOW); // dioda się nie świeci
                  }

Podłącz przycisk i diodę. jak naciśniesz, to się zapali, jak puścisz zgaśnie.

void setup() {
  
  pinMode(8, OUTPUT);
  pinMode(7, INPUT_PULLUP);
   
    }



void loop() {
            while(digitalRead(7) == HIGH) //jeśli guzik ma stan wysoki
               {
                  digitalWrite(8, LOW); // dioda się świeci
                  delay(1000); // spowolnienie, żeby był efekt
                  digitalWrite(8, HIGH); // dioda się nie świeci
                  delay(1000);
                }
             }

W tym wypadku, możesz uzyskać ten efekt, nie ruszając guzika.

 

Dzięki pętli, sekwencja może trwać w nieskończoność, a przy warunku tylko raz i za każdym razem gdy chcesz mignąc, musisz nacisnąć guzik.

Chłopaki gdzieś tutaj tłumaczyli i ja też o tym pisałem, że loop to taki while. A Ty twierdzisz, że if to to samo, no więc gdyby nie było loop, to nie mógłbyś uzyskać efektu migania samym if'em, możesz to uzyskać tylko dlatego, że loop jest potraktowane pętlą while i powoduje sekwencje. Inaczej mówiąc, te dwa programiki pokazują, co by się działo, gdybyś nie umieszczał tego w loop, tylko tak po prostu(gdyby się dało)

 

 

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

C:\Users\LENOVO\Documents\Arduino\sketch_aug02d\sketch_aug02d.ino: In function 'void loop()':
sketch_aug02d:16:2: error: a function-definition is not allowed here before '{' token
  {
  ^
sketch_aug02d:29:3: error: expected initializer before 'digitalWrite'
   digitalWrite(10, LOW); //Czerwona
   ^~~~~~~~~~~~
C:\Users\LENOVO\Documents\Arduino\sketch_aug02d\sketch_aug02d.ino: At global scope:
sketch_aug02d:53:1: error: expected declaration before '}' token
 }
 ^
exit status 1
a function-definition is not allowed here before '{' token

 

 

Czy ktoś może pomóć i powiedzieć gdzie jest błąd? takie błędy pokazuje program...niestety ja zupełnie się nie znam i nie wiem jak pomóc synowi.

Link do komentarza
Share on other sites

7 godzin temu, Gieneq napisał:

@Kriss2707 witam na forum.

Patrząc na to no cóż, ciężko stwierdzić. Najlepiej jak wstawisz tu kod. 🙂 

void setup() {

  pinMode(10, OUTPUT); //Dioda czerwona

  pinMode(9, OUTPUT); //Dioda żółta

  pinMode(8, OUTPUT); //Dioda zielona



  pinMode(7, INPUT_PULLUP); //Przycisk



  digitalWrite(10, LOW); //Wyłączenie diod

  digitalWrite(9, LOW);

  digitalWrite(8, LOW);

}



void loop()

{

  digitalWrite(10, LOW); //Czerwona

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

  digitalWrite(8, HIGH); //Zielona

  delay(1000); //Czekamy 1 sekundę

  digitalWrite(10, LOW); //Czerwona

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

  digitalWrite(8, LOW); //Zielona

  delay(1000); //Czekamy 1 sekundę

  digitalWrite(10, HIGH); //Czerwona

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

  digitalWrite(8, LOW); //Zielona

  delay(1000); //Czekamy 1 sekundę

  digitalWrite(10, HIGH); //Czerwona

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

  digitalWrite(8, LOW); //Zielona

  delay(1000); //Czekamy 1 sekundę

}

 

to jest kod ze szkolenia ze strony forbot...

Edytowano przez Gieneq
Link do komentarza
Share on other sites

@Kriss2707 co prawda kod który wstawiłeś nie kompiluje mi się ale to wina jakiegoś dziwnego kodowania znaków, ale kod z kursu jest ok.

Najwyraźniej problem jest z samym programem. Dla testu - wejdź w przykłady i sprawdź czy przykład blink się skompiluje.

Jeżeli nie, to może był problem z instalacją. Spróbuj pobrać i instalować jeszcze raz Arduino IDE.

Jaki to system?

Link do komentarza
Share on other sites

"Prawdopodobnie pomyślałeś tutaj o instrukcji warunkowej if. Jednak jak chciałbyś zrealizować miganie diodą?"

void setup() {

pinMode(10, OUTPUT);

pinMode(6, INPUT_PULLUP);

}

void loop() {

if (digitalRead(6) == LOW) {
   

digitalWrite(10, HIGH);

    delay(500);

    digitalWrite(10, LOW);

    delay(500);
}
}

Nie wiem czemu gdyż przygodę z Arduino zacząłem jakieś 12h temu ale u mnie działa na IF 

EDIT:

Nie działa natomiast żaden z dwóch programów z kursu, świeci zielona dioda a przycisk robi nic...

 

 

Edytowano przez Gieneq
Dopisanie pojedynczego zdania zamiast tworzenia nowego wpisu
Link do komentarza
Share on other sites

@KosMar witam na forum 🙂 a jak masz podłączony przycisk?

23 godziny temu, KosMar napisał:

Nie wiem czemu gdyż przygodę z Arduino zacząłem jakieś 12h temu ale u mnie działa na IF 

Też będzie działać, w tym programie efekt będzie taki sam, ale już w innych nabierze to znaczenia (chociażby w kolejnym ćwiczeniu poniżej cytatu).

Link do komentarza
Share on other sites

Cześć!

Zrobiłem w pełni zadania, ale chciałem się sprawdzić i zmodyfikować ostatni z nich. Z racji, że mimo  puszczeniu przycisku, cała sekwencja musi się skończyć, chciałem:

1. Ustawić, aby sekwencja świateł kończyła się w miejscu, w którym odrywam palec od przycisku

2. Po ponownym naciśnięciu pętla zaczynała się od początku.

Obecnie mam coś takiego:

void loop()
{
  while(digitalRead(7) == LOW) { //aktywacja pętli przyciskiem
  digitalWrite(12, LOW); //Czerwona OFF
  digitalWrite(10, LOW); //Żółta OFF
  digitalWrite(8, HIGH); //Zielona ON

  delay(500); // Opóźnienie wyłączenia = Długość świecenia zielonej
  
  digitalWrite(12, LOW); //Czerwona OFF
  digitalWrite(10, LOW); //Żółta OFF
  digitalWrite(8, LOW); //Zielona OFF


    while(digitalRead(7) == HIGH) { //puszczenie przycisku i zatrzymanie pętli
       digitalWrite(12, LOW); //Czerwona OFF
       digitalWrite(10, LOW); //Żółta OFF
       digitalWrite(8, LOW); //Zielona OFF
    }

  digitalWrite(12, LOW); //Czerwona OFF
  digitalWrite(10, HIGH); //Zółta ON
  digitalWrite(8, LOW); //Zielona OFF
  
  delay(500); // Długość świecenia Żółtej
  
  digitalWrite(12, LOW); //Czerwona OFF
  digitalWrite(10, LOW); //Żółta OFF
  digitalWrite(8, LOW); //Zielona OFF

  
    while(digitalRead(7) == HIGH) { //puszczenie przycisku i zatrzymanie pętli
       digitalWrite(12, LOW); //Czerwona OFF
       digitalWrite(10, LOW); //Żółta OFF
       digitalWrite(8, LOW); //Zielona OFF
    }

  digitalWrite(12, HIGH); //Czerwona ON
  digitalWrite(10, LOW); //Żółta OFF
  digitalWrite(8, LOW); //Zielona OFF
  
  delay(500); //Długość świecenia czerwonej
  
  digitalWrite(12, LOW); //Czerwona OFF
  digitalWrite(10, LOW); //Żółta OFF
  digitalWrite(8, LOW); //Zielona OFF
//Pętla automatycznie zatrzymana bez potrzeby wywoływania while jak wyżej
  }
}

I o ile swoje zadanie z punktu pierwszego spełnia, tyle po ponownym naciśnięciu pętla jest kontynuowana.

 

Czy jest jakiś sposób, aby ustawić by pętla w pewnym momencie, po spełnieniu danego warunku zostałaby przerywana i wracała na początek?

Link do komentarza
Share on other sites

4 godziny temu, Opinel napisał:

Czy jest jakiś sposób, aby ustawić by pętla w pewnym momencie, po spełnieniu danego warunku zostałaby przerywana i wracała na początek?

Jeśli chciałbyś w dowolnym momencie wyjść z pętli to możesz wywołać polecenie "break;". Więcej na ten temat znajdziesz np. w dokumentacji Arduino: https://www.arduino.cc/reference/en/language/structure/control-structure/break/

  • Pomogłeś! 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.