Skocz do zawartości
xirtt

Dwa przyciski i 14 diod led

Pomocna odpowiedź

Zaczynam zabawę z ARDUINO UNO. Potrzebuje odłączyć linijkę z 14 diod led i do tego dwa przyciski chwilowe.

Jeden przycisk po naciśnięciu i podania masy na wejście, przesuwa świecenie jednej diody led w linijce w prawo, a drugi przycisk w lewo.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Kurs arduino poziom 1, forbot.pl. I wszystko jasne. Zrobisz o wiele wiecej po tych kilku godzinach nauki. Tutaj nikt gotowego kodu ci nie wklei.

W sumie do odłączenia;-) linijki ledów, kurs Ci niepotrzebny...

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites

Do odłączenia linijki można użyć odsysacza, linki albo gorącego powietrza. I trochę cierpliwości.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
18 godzin temu, xirtt napisał:

Potrzebuje odłączyć linijkę z 14 diod led i do tego dwa przyciski chwilowe.

Z tym odłączeniem to z pewnością literówka. Teoretycznie potrzebowałbyś 16 portów procesora a tylu nie masz. Powinieneś więc rozpatrzyć matrycę np. 4 x 4 (4 wiersze i 4 kolumny). Daje to możliwość podłączenia 16 elementów (LED, przycisk...). Taki przycisk np. łączysz jednym końcem z odpowiednim wierszem i drugim końcem z odpowiednią kolumną. Chcąc odczytać jego stan wybierasz wiersz i kolumnę. Linie wierszy i linie kolumn podłączasz do odpowiednich portów Arduino. Tu znajdziesz przykład matrycy LED 8x8 - zobacz

Zwróć uwagę na schemat - piszę o takiej  konstrukcji i podłączeniu.

Możesz także pójść inną drogą np. expander portów procesora np. PCF8574 i wykorzystanie tego układu lub specjalizowane układy do sterowania matrycami LED.

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, Belferek napisał:

Teoretycznie potrzebowałbyś 16 portów procesora a tylu nie masz.

Jak to nie? D2 do D13, A0 do A3 to już 16, a gdzie A4/A5 i D0/D1?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wydaje mi się, że jak linijka z 14 ledami to pewnie są programowalne... a to raczej banał w zaprogramowaniu...

Udostępnij ten post


Link to post
Share on other sites

To była literówka. Oczywiście podłączyć  zwykłe diody led.

Zrobiłem coś takiego , jeden przycisk działa . nie wiem jak dopisać drugi przycisk.

Coś takiego......

id setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);

  pinMode(A0, INPUT_PULLUP);
  pinMode(A1, INPUT_PULLUP);
 
  digitalWrite(2, LOW;
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
}
 
void loop()
{
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty
 
  digitalWrite(2, LOW);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty
 
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty
 
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty
 
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, HIGH);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty  

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty  

  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
 
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(A0) == HIGH) {} //Jeśli przycisk jest wciśnięty  
}
 

Udostępnij ten post


Link to post
Share on other sites

Poczytaj jeszcze o pętli "for"...

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, ethanak napisał:

Jak to nie? D2 do D13, A0 do A3 to już 16, a gdzie A4/A5 i D0/D1?

No tak masz rację ethenak - z przyzwyczajenia odpuściłem wejścia analogowe, gdyż z reguły wykorzystuję je do innych niż OUTPUT celów.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dziękuje za odpowiedzi. 

Przyciski dałem na A0 i A1. Diody jak widać . A0 załącza diodę zawsze jedną w prawo, i to działa. Chciałem żeby A1, załączał diodę zawsze jedną w lewo.

Przyjaciele , może ma ktoś wiedzę bardziej praktyczną jak to zapisać w programie.

Pozdrawiam.

Edytowano przez xirtt

Udostępnij ten post


Link to post
Share on other sites

Zadeklaruj zmienną typu int ( powiedzmy o nazwie nr_diody) i przypisz jej wartość początkową 2 (pierwszy pin do którego masz podłączoną diodę). Następnie warunek if ( przycisk wciśnięty) i ustawiasz stan wysoki na pinie nr_diody+1 oraz niski na nr_diody. Czekasz swoją sekundę i zwiększasz wartość zmiennej nr_diody o jeden. Teraz drugi niemal identyczny warunek dla drugiego przycisku, tak aby zapalała się dioda wcześniejsza. Myślę, że wymyślisz co trzeba zmienić, aby działał. 

Pojawi się mały problem gdy światełko na diodach dojdzie do ostatniej diody, ale powinieneś poradzić.

Udostępnij ten post


Link to post
Share on other sites

Napisałem coś takiego , ale nie działa ......

 int (2);
  if (digitalRead(A1) == HIGH) {}
  digitalWrite(2+1, LOW);
  delay(1000);

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Przeglądałeś, chociaz pobieżnie, kurs arduino na Forbocie jao Cię prosiłem??

Edytowano przez SOYER

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
14 godzin temu, xirtt napisał:

 int (2);

Powiedz nam jakie zadanie ma realizować ten fragment kodu z Twojego programu - co chciałeś osiągnąć?

Napisałeś: if (digitalRead(A1) == HIGH) {}

Jeśli programik nie działa to powinieneś się zastanowić dlaczego, gdzie jest błąd? Nie wiem jak Ty, ale ja i pewnie większość czytających odczyta ten warunek IF jako:

Jeśli na A1 jest stan wysoki to nie rób NIC.

O to Ci chodziło?

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites

1. Zamiast int (2); powinno być:

int nr_diody=2; // deklarujesz zmienną typu integer (liczba całkowita) o nazwie nr_diody i przypisujesz jej początkową wartość 2

2. Przyciski podejrzewam, że masz połączone z masą (GND), więc po wciśnięciu przycisku będzie stan niski :

 if (digitalRead(A1)==LOW) { instrukcje które mają zostać wykonane gdy przycisk zostanie wciśnięty

3. Zapalanie i gaszenie diody odwołującą się do zmiennej nr_diody:

digitalWrite(nr_diody, HIGH); // ustawia stan wysoki na pinie nr_diody czyli 2

digitalWrite(nr_diody+1, LOW); //ustawia stan niski na pinie nr 3 (2+1)

nr_diody=nr_diody+1; // zwiększa zmienną nr_diody o 1, czyli teraz zmienna nr_diody wynosi 3

Wszystko to i wiele więcej znajdziesz na kursie FORBOTA o którym pisał Ci SOYER. 

 

Udostępnij ten post


Link to post
Share on other sites
Gość
Ten temat został zamknięty.

×
×
  • Utwórz nowe...