Skocz do zawartości

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


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.

 

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ś?

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 .

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. 

(edytowany)
32 minuty temu, Kubaaa napisał:

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

Kuba, a programowałeś kiedyś w czymś?

Edytowano przez AndrzejWi
(edytowany)
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
  • 3 tygodnie później...

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.

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

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

(edytowany)

"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

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

  • 3 miesiące później...

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?

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

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