Skocz do zawartości

Sterowanie diodami za pomocą przycisków


Pomocna odpowiedź

Napisano

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. 

(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 przez Belferek

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🙂

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

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