Skocz do zawartości

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


Komentator

Pomocna odpowiedź

Cześć! Jako, że to mój pierwszy post to na początku warto się przywitać!

Prawdopodobnie pomyślałeś tutaj o instrukcji warunkowej if. Jednak jak chciałbyś zrealizować miganie diodą? To wbrew pozorom trudniejsze zadanie od napisanego wcześniej ciągłego świecenia

Wcale nie jest to takie trudne, oto moja propozycja i w zasadzie tak samo zachowują się światła w Warszawie. Jeżeli byśmy zastosowali jakiś kontakt sprawdzający zanik napięcia zamiast przycisku to byśmy mieli automatyczny tryb awaryjny (żółtego światła).

void setup() {
 pinMode(LED_BUILTIN, OUTPUT);//Built-in LED
 pinMode(2, INPUT_PULLUP); //Button  
 pinMode(3, OUTPUT); //Green light
 pinMode(4, OUTPUT); //Yellow light
 pinMode(5, OUTPUT); //Red light
 //Light off
 digitalWrite(LED_BUILTIN, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
}
void loop() {
 if(digitalRead(2) == HIGH) { //Normal mode
   digitalWrite(3, HIGH); //zielone
   delay(5000);
   digitalWrite(3, LOW);
   digitalWrite(4, HIGH);
   delay(1500);
   digitalWrite(5, HIGH);
   digitalWrite(4, LOW);
   digitalWrite(5, HIGH);
   delay(1500);
   digitalWrite(5, HIGH);
   digitalWrite(4, HIGH);
   delay(1500);
   digitalWrite(4, LOW);
   digitalWrite(5, LOW);
 } else { //Emergency mode after voltage down
   digitalWrite(3, LOW);
   digitalWrite(5, LOW);
   digitalWrite(4, LOW);
   delay(1000);
   digitalWrite(4, HIGH);
   delay(1000);
 }
}
Link do komentarza
Share on other sites

farquad, tak jest to możliwe 🙂

kaktus283, nie rozumiem Twojego zamysłu. Oczywiście Twój program zadziała, jednak w takiej sytuacji przycisk praktycznie nie wpływa świecenie świateł. Po jednym wciśnięciu przycisku wykonywany jest cały cykl świecenia. Program, który pojawił się w kursie pozwala przechodzić przyciskiem do następnych trybów. Oba podejścia tak naprawdę rozwiązują dwa różne zadania stąd dziwi mnie porównanie obu rozwiązań 🙂

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

kiniu14, niestety nie wiemy jaki zestaw kupiłeś i jakie dokładnie przyciski tam znalazłeś. Najlepiej będzie jeśli sprawdzisz miernikiem wyprowadzenia swoich przycisków i dostosujesz połączenia do swojego sprzętu. Na przyszłość pamiętaj, że _kursSprzet

Link do komentarza
Share on other sites

patryczek803, if, to instrukcja warunkowa, a while to pętla. Z definicji służą do zupełnie innych rzeczy. Mógłbyś wkleić Twój program po tej zamianie, abym wiedział, co dokładnie u siebie zrobiłeś?

Link do komentarza
Share on other sites

Najpierw zastanów się co tak naprawdę w tym programie będzie powodować zmianę stanu wyjścia. Bo przecież nie sama detekcja stanu: "wciśnięty" czyli nie trywialne wykrycie jakiegoś stanu na wejściu przycisku. Gdyby tak było, to w czasie całego czasu naciśnięcia zmieniałbyś stan wyjścia wielokrotnie, prawda?

Link do komentarza
Share on other sites

Chodzi o przycisk na wejściu (stykowy, lub dotykowy z chwilowym zadziałaniem przekaźnika) - rozumiem kwestię, że trzeba wyeliminować niestabilność styku - tu dałbym jakąś zwłokę czasową.

Trudność mam przy oprogramowaniu wyjścia: Raz inicjuję wejście to na wyjściu chcę stan wysoki, potem znów inicjuję wejście i chcę stan niski... i tak w kółko (docelowo jeszcze ma być czasówka zerująca wyjście po jakimś czasie)

Do tej pory robiłem takie rzeczy na LOGO czy Telematiku, ale w arduino jestem początkujący i czekając na książki z kursem dopytuję o interesujące mnie kwestie 🙂

Link do komentarza
Share on other sites

Dobrze, że dopytujesz. Nie pisałem o żadnych niestabilnościach zestyku - to sprawa późniejsza. Zapomnij o automatyce, telematikach itp rzeczach. Miałeś się zastanowić co zmienia stan wyjścia - proste pytanie. Z punktu widzenia programu masz pin wejściowy na który dostajesz, powiedzmy, stan 0 gdy przycisk jest wciśnięty i stan 1 gdy puszczony. To jeszcze raz: co (jakie wydarzenie) powinno zmieniać stan wyjścia (na przeciwny) żebyś dostał takie działanie jak opisałeś? Jeśli to wymyślisz, będziesz wiedział jakie zdarzenie musisz w programie wykrywać i zaraz też wpadniesz na to jak to zrobić. Bez tego dalej nie pójdziesz.

Link do komentarza
Share on other sites

Domyślam się, że chodzi o zbocze. Narastające lub opadające.

Tylko, że jego wykrycie to jedno. Drugie to fakt, że ono zawsze będzie takie samo - wyjście będzie musiało reagować odwrotnie na co drugie zbocze na wejściu

Link do komentarza
Share on other sites

Na razie się tym nie przejmuj. Programowanie Arduino jest wbrew pozorom dużo większym wyzwaniem niż programowanie sterowników przemysłowych. One z definicji mogę robić wiele rzeczy na raz. Skupiasz się na jednej a reszta wykonuje się równolegle: liczą się czasy, wyzwalają się i gasną wyjścia monostabilne uzależnione od jakichś wejść lub innych sygnałów itd. Z resztą na pewno wiesz lepiej.

Tutaj tak nie ma. Masz jeden procesor i jeden program robiący jedną rzecz, ciągnący jeden wątek. Jeśli sam nie zadbasz o to by móc robić kilka rzeczy na raz, utkniesz jak większość początkujących w programach opartych o niezliczone wywołania delay() marnujące potencjał procesora i uniemożliwiające robienie ciekawych rzeczy.

A wracając do początku: jak wykryć zbocze? Wyobraź sobie, że masz napisać funkcję którą wołasz dość często, a ona ma oddać true gdy nastąpiła zmiana stanu przycisku (gdzieś między kolejnymi jej wywołaniami) z puszczonego na wciśnięty. Umiesz to zrobić?

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

Witam

jestem nowy w Arduino, dopiero co kupiłem starter kit i mam pytanie:

1. jak podłącze arduino po usb do komputera następnie załaduje jakiś program wyjme usb i potem znowu podłącze pod usb to w pamięci mikrokontrolera będzie ostatnio załadowany program tak? jeśli tak to jak najbezbieczniej wyzerować program w mikrokontrolerze tak żeby po złożeniu nowego układu elektronicznego i podłączeniu pod usb nie wystartował stary program bo może coś pomieszać w nowym układzie, czy najlepiej wgrywać przed odłączeniem usb po prostu program "blink" czy jest inny sposób?

2. co robi przycisk RESET na płytce arduino? czy on uruchamia załadowany program od nowa czy resetuje do zera mikrokontroler?

3. teraz pytanie ktore niejako jest związane bezpośrednio z tym tematem do artykułu, a mianowicie chciałbym się zapytać o światła drogowe:

jak zrobić żeby po wciśnieciu przycisku (i puszczeniu go) uruchamiała się sekwencja świateł drogowych a przy następnym wciśnieciu tego samego przycisku wszystkie diody zgasły (czyli wyłączamy układ)

jestem na początku kursu i pewnie brakuje mi tu jakiejś opcji/funkcji warunkowej jakby ktoś mógł podać kod jak to zrobić to będę wdzięczny, a może prościej prosiłbym o kod który działa tak:

wciskam przycisk raz (puszczam) i miga sobie jedna dioda co sekunde -> wciskam przycisk drugi raz (puszczam) i przestaje migać dioda -> wciskam przycisk trzeci raz i znowu miga i tak dalej

to już bym sobie dopasował do przykładu ze światłami drogowymi

z góry dzięki za pomoc i prosze o wybaczenie pytań laika 🙂

Link do komentarza
Share on other sites

AmatorArduino, witam na forum 🙂

1) Z tego, co wiem, to Arduino IDE nie ma opcji kasowania programu wgranego do Arduino. Najprościej wgrywać więc ręcznie "pusty" program (taki jak niżej) lub wspomnianego "blinka".

void setup() {
 // put your setup code here, to run once:

}

void loop() {
 // put your main code here, to run repeatedly:

}

2) Przycisk Reset odpowiada za zresetowania mikrokontorolera, czyli uruchomienie programu od nowa. Jego wciśnięciu nie powoduje usunięcia programu. Zachęcam do testów w praktyce 🙂

3) Do rozwiązania opisanego przez Ciebie problemu najlepiej wykorzystać zmienną, która pozwoli zliczać wciśnięcia przycisku. Informacje na ten temat są opisane w dalszej części kursu. Proponuję więc iść spokojnie dalej - wszystko powinno się rozjaśnić 🙂

Link do komentarza
Share on other sites

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

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.