Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Illustratum, dzięki za miłe słowa - powodzenia podczas nauki 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam!

Wymyśliłem sobie aby napisać program, który będzie włączał diodę zieloną tylko wtedy kiedy zostaną spełnione 4 warunki. Jeżeli którykolwiek lub kilka warunków nie zostanie spełnione, ma się zapalać jedna lub kilka diod czerwonych. Problem jest taki, że nie wiem co robię źle. Używam tylko IFów, ELSEów oraz WHILE. A może nie da się tego napisać tylko przy pomocy tych komend?

Tak wygląda mój program:

#define error1 2

#define error2 3

#define error3 4

#define error4 5

// Diody sygnalizujace blad

#define start 6

// Dioda sygnalizujaca brak bledow i zezwalajaca na start

#define pierwszy 8

#define drugi 9

#define trzeci 10

#define czwarty 11

// Warunki do spelnienia (np. Wylaczniki krancowe)

void setup() {

pinMode (error1, OUTPUT);

pinMode (error2, OUTPUT);

pinMode (error3, OUTPUT);

pinMode (error4, OUTPUT);

pinMode (start, OUTPUT);

pinMode (pierwszy, INPUT);

pinMode (drugi, INPUT);

pinMode (trzeci, INPUT);

pinMode (czwarty, INPUT);

digitalWrite(error1, LOW);

digitalWrite(error2, LOW);

digitalWrite(error3, LOW);

digitalWrite(error4, LOW);

digitalWrite(start, LOW);

}

void loop() {

while

(digitalRead(pierwszy) == HIGH);

(digitalRead(drugi) == HIGH);

(digitalRead(trzeci) == HIGH);

(digitalRead(czwarty) == HIGH);

digitalWrite(start, HIGH);

if (digitalRead(pierwszy) == LOW) {

digitalWrite(error1, HIGH);

} else {}

if (digitalRead(drugi) == LOW) {

digitalWrite(error2, HIGH);

} else {}

if (digitalRead(trzeci) == LOW) {

digitalWrite(error3, HIGH);

} else {}

if (digitalRead(czwarty) == LOW) {

digitalWrite(error4, HIGH);

} else {}

}

Co robię źle?

Z góry dzięki za jakieś podpowiedzi

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Udostępnij ten post


Link to post
Share on other sites

Po pierwsze nauczyć się czytać i rozumieć to co czytasz. Konkretniej chodzi o

Uwaga! Wszystkie kody programów muszą być umieszczane wewnątrz tagów (code] (/code]!

Jeśli chodzi o odpowiedź na pytanie to zastanów się jak wygląda struktura pętli while w C/C++, przeanalizuj swój program, może coś zauważysz.

Udostępnij ten post


Link to post
Share on other sites

Podstawowy błąd jaki popełniłeś to próby programowania w C przed przeczytaniem tej książki:

http://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm

Przez pierwszy tydzień powinna to być Twoja lektura do poduszki a potem stać na półce w zasięgu ramienia. Przez pierwsze pół roku pisania programów będziesz po nią sięgał co najmniej raz dziennie. Alternatywą jest gubienie się w najprostszych rzeczach i nierozumienie działania tego co się napisało. Sam zakup płytki Arduino, instalacja jego IDE i próby używania jakichś przypadkowych struktur języka (nie komend!) wziętych z przykładów bez jakiegokolwiek przygotowania teoretycznego to strata czasu. Twojego i naszego.

Udostępnij ten post


Link to post
Share on other sites

Krótkie pytanie. Czy za pomocą digitalRead da się odczytać stan OUTPUT?

Udostępnij ten post


Link to post
Share on other sites

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);
 }
}

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Witam. Kupiłem inny zestaw startowy z Arduino w którym mam przyciski z 4 wyprowadzeniami. Co muszę zmienić w kodzie/podłączeniu aby wszystko działało poprawnie?

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

Nie rozumiem dlaczego zostało napisane, że przy użyciu funkcji if nie zrealizujemy migania diodą? Zamieniłem while z if i działa tak samo. Mogłby mi ktoś to wytłumaczyć?

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie:

Jak powinien wyglądać program, który będzie włączał i wyłączał wyjście po pojedynczym naciśnięciu przycisku na wejściu?

Udostępnij ten post


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

Udostępnij ten post


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

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