Skocz do zawartości

Sterowanie diodami za pomocą przycisków


Adikon

Pomocna odpowiedź

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. 

Link do komentarza
Share on other sites

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 przez Belferek
Link do komentarza
Share on other sites

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🙂

Link do komentarza
Share on other sites

Gość es2
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 przez es2
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

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 przez Belferek
Link do komentarza
Share on other sites

(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 przez Adikon
Link do komentarza
Share on other sites

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 przez Aiden_Pearce
Link do komentarza
Share on other sites

(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 przez Adikon
Link do komentarza
Share on other sites

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 przez Aiden_Pearce
Link do komentarza
Share on other sites

(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 przez Adikon
Link do komentarza
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...

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.