Adikon Napisano Grudzień 8, 2018 Udostępnij Napisano Grudzień 8, 2018 Witam! Chcę napisać program, który będzie miał takie zadanie. Są dwie diody i chcę, aby jeden przycisk załączał jedną diodę, a drugi drugą obojętnie w jakiej kolejności wcisnę przycisk. Diody mają się zaświecić i dopiero po kolejnym wciśnieciu zgasnąć. Od razu mówię, że mam zestaw pierwszy forbota i przerobiłem kurs do momentu świateł drogowych. Ale chciałem od razu napisać swój program i sprawdzić co wiem, a czego nie. Czytałem sporo o pętlach itd, ale nie mogę tego ogarnąć. Z zawodu jestem elektrykiem, ale teraz mam więcej czasu po pracy i chciałem powrócić do swojego hobby jakim jest elektronika. Niestety programowanie okazało się dla mnie trudniejsze niz myslałem. To jest mój pierwszy samodzielnie napisany kod, który ma za zadanie włączać 3 diody i wyłączać za pomocą jednego przycisku. Ten kod działa mi bez problemu. https://pastebin.com/raw/mHUA5sZY Tutaj próbowałem napisać kod, który miał działać tak jak napisałem na wstępie, ale niestety nic mi z tego nie wychodzi: https://pastebin.com/raw/GswGnkgp Nie mogę po prostu nigdzie znaleźć informacji jak rozdzielić każdy program. Potrafię zrobić na dwa przyciski, ale np po wcisnieciu pierwszego mogę sterować drugim przyciskiem, a chcę aby każdą diodę można było włączać niezależnie. Muszę jeszcze dodać, że z angielskim u mnie nie najlepiej. Na razie chcę ogarnąć język typowo Arduino, a na C może później się zdecyduję. Z góry dziękuję za pomoc. Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 (edytowany) 1 godzinę temu, Adikon napisał: Diody mają się zaświecić i dopiero po kolejnym wciśnieciu zgasnąć Więc musisz zapamiętać ich ostatni stan (0 lub 1) i po ponownym naciśnięciu przycisku wysłać do LEDa zanegowaną wartość ostatniego stanu i zapamiętać nową. Tu można wklejać kod programu - znacznik Kod czyli <> Funkcji delay() raczej staraj się unikać. Tu dużo było na temat przycisków i LED - zobacz Tak poza tym to posprawdzaj swoje nawiasy {}. Chyba masz w swoim programie spory bałagan. Generalnie obowiązuje zasada - każdy otwarty nawias musi być zamknięty. A jak jest u Ciebie? Edytowano Grudzień 8, 2018 przez Belferek Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 Wiem, że nie powinienem on to prosić, ale mógłbyś napisać mi taki krótki program? Wtedy najszybciej się uczę i zaczynam rozumieć czemu tak, a nie inaczej. Te kody służą mi do nauki. Wszystko analizuję i wtedy wiem co i jak🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Gość es2 Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 (edytowany) 1 godzinę temu, Adikon napisał: ale mógłbyś napisać mi taki krótki program? Wtedy najszybciej się uczę i zaczynam rozumieć czemu tak, a nie inaczej. Właśnie najszybciej, najskuteczniej, nauczysz się jak sam napiszesz program. Jak dostaniesz gotowca, to przy następnym programie czy rozwoju tego, znów będziesz potrzebował gotowca mając banalny problem. Codo kodu, dam wskazówkę, zawieszasz program czekając dopóki przycisk jest naciśnięty while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty Poważny błąd! Musisz zrealizować swoje funkcje tak aby zrealizować wielowątkowość. Nie zawieszaj więc programu tylko sprawdzaj czy przycisk jest naciśnięty, jeśli tak, zmień stan diody, jeśli nie program wykonuje się dalej, sprawdzając stan kolejnego przycisku. Pewnie pojawi się problem migania diody gdy przycisk będzie cały czas wciśnięty ale nie wszystko od razu. Edytowano Grudzień 8, 2018 przez es2 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Belferek Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 (edytowany) 2 godziny temu, Adikon napisał: Wszystko analizuję i wtedy wiem co i jak A przeanalizowałeś swój program i poprawiłeś błędy, o których mówiłem - nawiasy? To podstawa do dalszej rozmowy. Zastanowiłeś się jak można zapamiętać w programie czy LED został włączony (wyłączony)? Podpowiadam, że może tak: //na początku programu - poza setup() i loop() #define ON 0 //definiuję sobie stałe ON i OFF - tego będę używał zamiast 0/1 lub LOW/HIGH - to jest to samo #define OFF 1 #define LED D0 //definiuję stałą LED, która odpowiada numerowi portu Arduino, do którego jest LED podłączony int stan_led=OFF; //w tej zmiennej zapamiętam aktualny stan diody LED ..... ..... ..... ..... //i gdzieś tam w programie przełączenie LED stan_led^=OFF; //wykonujemy stan_led=stan_led XOR 1 (czyli albo 0 XOR 1 albo 1 XOR 1 - zamiana OFF->ON lub ON->OFF) digitalWrite(LED,stan_led); Pokaż poprawioną wersję swojego programu to będziemy mogli dalej rozmawiać. Edytowano Grudzień 8, 2018 przez Belferek Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 3 godziny temu, Belferek napisał: Tu dużo było na temat przycisków i LED - zobacz Zlituj się nad nami biednymi - czytałeś to? No i pokaż program. Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 Czytałem. Kombinuję i jedyne co mi wychodzi, to włącz wyłącz na jednym przycisku. Trudno nie będę was męczył. Sam muszę kombinować. Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 No to powodzenia - nikt tu nie jest jasnowidzem i nie widzi Twojej pracy. Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 (edytowany) Kod, który napisałem wstawiłem. Ja naprawdę kombinuję, lecz wielu rzeczy nie rozumiem. Najszybciej uczę się praktycznie. Teoria gorzej wchodzi. 2 godziny temu, es2 napisał: Właśnie najszybciej, najskuteczniej, nauczysz się jak sam napiszesz program. Jak dostaniesz gotowca, to przy następnym programie czy rozwoju tego, znów będziesz potrzebował gotowca mając banalny problem. Codo kodu, dam wskazówkę, zawieszasz program czekając dopóki przycisk jest naciśnięty while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty Poważny błąd! Musisz zrealizować swoje funkcje tak aby zrealizować wielowątkowość. Nie zawieszaj więc programu tylko sprawdzaj czy przycisk jest naciśnięty, jeśli tak, zmień stan diody, jeśli nie program wykonuje się dalej, sprawdzając stan kolejnego przycisku. Pewnie pojawi się problem migania diody gdy przycisk będzie cały czas wciśnięty ale nie wszystko od razu. Tutaj jest dobrze napisane. Tylko właśnie nie wiem, którym nawiasem zawieszam program. Ale chcę dokładnie to co opisał es2. https://pastebin.com/raw/9ERA7sb4 I nadal problem ;/ Edytowano Grudzień 8, 2018 przez Adikon Cytuj Link do komentarza Share on other sites More sharing options...
Aiden_Pearce Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 (edytowany) Wydaje mi się że nie zrozumiałeś. es2 mówi o tym żebyś właśnie tego nie robił, dobrą alternatywą byłaby instrukcja if() 11 minut temu, Adikon napisał: Tylko właśnie nie wiem, którym nawiasem zawieszam program Żadnym. Cała instrukcja zawiesza program, nie nawias. Instrukcja będzie się powtarzać dopóki warunek będzie spełniony. Czyli: dopóki będziesz miał naciśnięty przycisk, instrukcje w nawiasach będą się wykonywać, jak puścisz przycisk - przestaną. Nic się nie wykona dopóki nie puścisz przycisku. Edit: Wiesz, że możesz wstawiać kod na forum? Edytowano Grudzień 8, 2018 przez Aiden_Pearce Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 (edytowany) Nie chciałem zaśmiecać po prostu 🙂 KOD void setup() { pinMode(10, OUTPUT); //Dioda czerwona pinMode(8, OUTPUT); //Dioda zielona pinMode(7, INPUT_PULLUP); pinMode(6, INPUT_PULLUP);//Przycisk digitalWrite(10, LOW); //Wyłączenie diod digitalWrite(9, LOW); digitalWrite(8, LOW); } void loop() { digitalWrite(10, HIGH); //Czerwona delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde if (digitalRead(7) == HIGH); //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde if (digitalRead(7) == HIGH); //Jeśli przycisk jest wciśnięty digitalWrite(8, HIGH); //Zielona delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde if (digitalRead(7) == HIGH); //Jeśli przycisk jest wciśnięty digitalWrite(8, LOW); //Zielona delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde if (digitalRead(7) == HIGH); //Jeśli przycisk jest wciśnięty } Edytowano Grudzień 8, 2018 przez Adikon Cytuj Link do komentarza Share on other sites More sharing options...
Aiden_Pearce Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 (edytowany) To koloruje kod i poprawia widoczność. Nie zaśmieca wątku. Przy okazji: delay(200); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde To na 1000 milisekund? Czy 200 milisekund? Bo się pogubiłem... Edit: eee... mówiąc o wstawianiu kodu.. miałem na myśli raczej narzędzie KOD (ikona <>) Edytowano Grudzień 8, 2018 przez Aiden_Pearce Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 Zmniejszyłem, aby przycisk można było szybciej wciskać. Cytuj Link do komentarza Share on other sites More sharing options...
Aiden_Pearce Grudzień 8, 2018 Udostępnij Grudzień 8, 2018 Szybkie przeróbki: Zamień wszystkie pętle na if() Usuń delay() To ci powinno działać tak jak chcesz Cytuj Link do komentarza Share on other sites More sharing options...
Adikon Grudzień 8, 2018 Autor tematu Udostępnij Grudzień 8, 2018 (edytowany) Poprawiłem. Przepraszam za niedopatrzenie, tymbardziej, że jest to napisane i widoczne. Sorki 😉 A ten kod jest przerobionym kodem z kursu forbota, który steruje światłami drogowymi. Pewnie stąd to podobieństwo. Dacie bana trudno. To jest moje pierwsze konto. Chciałem uzyskać porady tylko. Zaczynam przygodę z arduino, ale od razu chcę kombinować swój kod, aby to wszystko zrozumieć. Nie poddam się choćby nie wiem co. Czytam dużo i z dnia na dzień coś tam wiem więcej. Niestety nie wszyscy są stworzeni do wszystkiego. KOD void setup() { pinMode(10, OUTPUT); //Dioda czerwona pinMode(8, OUTPUT); //Dioda zielona pinMode(7, INPUT_PULLUP); pinMode(6, INPUT_PULLUP);//Przycisk digitalWrite(10, LOW); //Wyłączenie diod digitalWrite(9, LOW); digitalWrite(8, LOW); } void loop() { digitalWrite(10, HIGH); //Czerwona if (digitalRead(7) == HIGH){} //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona if (digitalRead(7) == HIGH){} //Jeśli przycisk jest wciśnięty digitalWrite(8, HIGH); //Zielona if (digitalRead(7) == HIGH){} //Jeśli przycisk jest wciśnięty digitalWrite(8, LOW); //Zielona if (digitalRead(7) == HIGH){} //Jeśli przycisk jest wciśnięty } Nadal nic. Diody świecą bez reakcji na przyciski. Edytowano Grudzień 8, 2018 przez Adikon Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!