Skocz do zawartości
Komentator

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

Pomocna odpowiedź

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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"?

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
Share on other sites
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.

 

Udostępnij ten post


Link to post
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ś?

Udostępnij ten post


Link to post
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 .

Udostępnij ten post


Link to post
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. 

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

@Kriss2707 witam na forum.

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

Udostępnij ten post


Link to post
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...