Skocz do zawartości

Sterowanie paskiem ledów za pomocą arduino i telefonu lub pilota.


Miolhar

Pomocna odpowiedź

Witam.

Na wstępie chciałbym przeprosić jeśli temat już był, mi niestety nie udało się takiego znaleźć (w przypadku istnienia takowego proszę o link). Również przepraszam jeśli wybrałem złą kategorię. Teraz do rzeczy:
Mam pomysł projektu planszy do gry z podświetleniem ledowym. W wielkim skrócie polegało by to na podświetlaniu poszczególnych pól po odblokowaniu ich. Chciał bym abym np. z pozycji aplikacji (lub pilotem podczerwieni) na telefonie mógł wybrać które pole ma się podświetlić. Na przykład chcę podświetlić pole 34 na kolor czerwony więc wybieram lub wpisuję nr 34 i kolor czerwony. Zaznaczam, że nie musi być wyboru koloru gdyż może być on zapisany w programie, że np. ledy od 21 do 30 są czerwone od 31 do 40 zielone itd. W przypadku pilota prosił bym o wiadomość jak wprowadzać liczby większe od 9 np. wyżej wspomniane 34 (gdyż w pilocie mamy przyciski 0-9). Do tego super by było gdy by była możliwość wybrania kilku pól jakie by się podświetlały np. 12,13,14 na zielono; 20,21,24 na czerwono i 10 na niebiesko.  Jeśli ktoś ma pomysł jak to zrobić bardzo proszę o odpowiedź. Z góry serdecznie dziękuję!

Edytowano przez Miolhar
Link do komentarza
Share on other sites

@Miolhar witam na forum 🙂 Wszystko jest do zrobienia. Zadałeś jednak dość ogólne pytanie, więc ciężko o konkretną pomoc. Czego dokładnie nie rozumiesz? Na czym dokładnie utknąłeś? W poniższych artykułach znajdziesz informacje o diodach RGB i sterowaniu za pomocą pilota:

Link do komentarza
Share on other sites

(edytowany)

@Treker dzięki 😄 

Chodzi o zbudowanie układu podświetlenia pól na plansz gry (arduino). Pola które miały by się podświetlać (wszystkie by były opisane numerami) wyły by wybierane za pomocą pilota lub telefonu. 

12 godzin temu, Miolhar napisał:

W wielkim skrócie polegało by to na podświetlaniu poszczególnych pól po odblokowaniu ich przez gracza. Chciał bym abym np. z pozycji aplikacji (lub pilotem podczerwieni) na telefonie mógł wybrać które pole ma się podświetlić.

Np. Gracz 1 odblokował pole 12 w I ćwiartce mapy więc ja wpisuję w aplikacji nr. 12 i to pole się zapala na zielono. Następnie gracz 2 odblokował pole 43 na III ćwiartce mapy, więc wpisuję nr 43 i włącza się czerwone podświetlenie. W tym momencie świecą się pola 12 i 43 kolejno na zielono i czerwono. Podsumowując, chcę zrobić układ posiadający program który podświetlał by kolejne pola po wybraniu ich numeru na pilocie lub telefonie. 

W późniejszym punkcie rozwoju projektu można by zrobić program który po wpisaniu na pilocie np. 22B podświetlało się pole 22 na niebiesko, a 31R oznaczało by podświetlenie pola 31 na czerwono.

Edytowano przez Miolhar
Link do komentarza
Share on other sites

OK, wiemy już co chcesz zrobić. Zadanie wygląda na 2 godziny pracy, ale to Twojej pracy. Być może w przypadku startu od zera, może to być tydzień. Treker pytał czego nie rozumiesz i na czym utknąłeś. Aby zrealizować to co zaplanowałeś musisz nauczyć się paru rzeczy i kupić trochę gratów. Dostałeś linki do dwóch lekcji, po przejściu których będziesz troszkę bliżej celu. Przeczytałeś? Zrozumiałeś? Zaplanowałeś zakupy? Jeśli chcesz coś zrobić, to musisz wykonac pierwszy krok, potem następne i następne. Możemy pomagać jeśli będziesz zadawał konkretne pytania, ale to Twój projekt i Twoja praca. Zacznij od zrozumienia samego sopsobu sterowania tego typu diodek, napisz kilka programów robiących jakieś efekty lub zwyczajnie zapalających po kolei zadane diody, np. wpisane na stałe do jakiejś tablicy. Następnie warto będzie podejść do analizy prostych komend tekstowych, otrzymywanych np. z monitora portu szeregowego. Wtedy będziesz już w stanie zapalać i gasić dowolne diody "z klawiatury komputera". W między czasie zbuduj samo pole gry. A w końcu zajmij się odbiornikiem podczerwieni - jak to działa, jak się to obsługuje i co dostajesz po stronie Arduino, albo modułem BT w przypadku smartfona. Wtedy zostanie już tylko połączenie wszystkeigo w jedną całość. Do roboty: czytaj, ucz się i melduj o postępach.

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

(edytowany)

Okej, wiem już na czym stoję i nie proszę o wykonanie za mnie tego projektu. Zakupy to na pewno: Arduino (uno powinno wystarczyć, jeśli nie proszę o radę jakie będzie lepsze), do tego myślę, że moduł podczerwieni bo raczej pójdę w pilot. Jeśli coś jeszcze się przyda proszę info. Największy problem mam z programem wykonawczym m. in. jak zrobić by dało się z pilota wysłać numery dwucyfrowe

12 godzin temu, Miolhar napisał:

W przypadku pilota prosił bym o wiadomość jak wprowadzać liczby większe od 9 np. wyżej wspomniane 34 (gdyż w pilocie mamy przyciski 0-9)

Oraz jak naprowadzić program aby po wybraniu numeru zapalała się leda przypisana do tego numeru (wiem, że liczy się je od 0 więc pierwsze pole by było pod nr 0). Z samym układem nie będę miał problemu, chodzi o program wykonawczy.

Edytowano przez Miolhar
Link do komentarza
Share on other sites

6 godzin temu, Miolhar napisał:

Największy problem mam z programem wykonawczym m. in. jak zrobić by dało się z pilota wysłać numery dwucyfrowe

@Miolhar to jest coś, co tylko dla człowieka wygląda jak wysyłanie liczb dwucyfrowych. Musisz trochę zmienić podejście do tematu 🙂 Z punktu widzenia układu elektronicznego, on odbierze po prostu 2 cyfry. To Ty jako programista, musisz dorobić taką funkcją, która "domyśli się", że np. dwa numery wysłane po sobie w ciągu 2 sekund mają być łączone w liczbę dwucyfrową.

6 godzin temu, Miolhar napisał:

Oraz jak naprowadzić program aby po wybraniu numeru zapalała się leda przypisana do tego numeru (wiem, że liczy się je od 0 więc pierwsze pole by było pod nr 0). Z samym układem nie będę miał problemu, chodzi o program wykonawczy.

Ujmę to tak - z tego wynika, że na prawdę musisz najpierw poświęcić trochę czasu na poznanie podstaw 🙂 Bo to, że numeracja jest od zera nic nie znaczy. Spróbuj najpierw zrobić cokolwiek praktycznego na Arduino, krok po kroku dojdziesz do tego. Podpowiem tylko, że jak chcesz podłączyć 34 diody to musisz się wyposażyć albo w diody programowalne (link masz już wyżej), albo w zwykłe, którymi będziesz sterował przez ekspander pinów. O ekspanderze przeczytasz tutaj: https://forbot.pl/blog/kurs-budowy-robotow-ekspander-io-serwo-id19365

 

Link do komentarza
Share on other sites

19 godzin temu, Miolhar napisał:

W przypadku pilota prosił bym o wiadomość jak wprowadzać liczby większe od 9 np. wyżej wspomniane 34

Zliczaj czas od wprowadzenia cyfry z pilota. Jesli przez X milisekund nie otrzymasz nowej wartosci - zatwierdź wynik. Jeśli otrzymasz - przesuwasz dotychczasowy wynik o 10 i dopisujesz nową cyfrę jedności, właśnie otrzymaną z pilota.

https://www.arduino.cc/reference/en/language/functions/time/millis/

Edytowano przez rziomber
Link do komentarza
Share on other sites

(edytowany)

Witam ponownie 😛 Przepraszam za moją nadgorliwość ale zależy mi na szybkim ukończeniu tego projektu gdyż jest on mi pilnie potrzebny do zbiórki harcerskiej. Obecnie zetknąłem się z następującymi problemami

Problem nr 1

Zdefiniowanie wartości liczbowej przycisku

#define KEY_1         //numer przycisku na pilocie

jak wybrać aby przycisk nr 1 miał wartość równą 1; przycisk nr 2 równą 2 itd.? W zakomentowanym miejscu będzie numer przycisku którego aktualnie nie mam ale to nie istotne.
Problem nr 2

W jaki sposób sprawić aby zmienna "x" przybierała wartość pierwszego przycisku (0-9) a jeśli w przeciągu 5sek został wybrany drugi przycisk, jego wartość została przyjęta przez zmienną "y"

W przypadku dwóch przycisków, tworzących jeden, dwucyfrowy numer, wzór jest prosty: z = x*10+y gdzie "x" i "y" = kolejno wybierane numery a "z" = numerowi wybranego pola.

if(time.value <= 5000) x = ???				//Jak zdefiniować aby x przyjeło wartość przycisku na pilocie (oznaczone ???)


if(time.value > 5000) z = x * 10 + y		//"z" - numer pola; "x" - wartość pierwszego przycisku; "y" - wartość drugiego przycisku

 

Edytowano przez Miolhar
Link do komentarza
Share on other sites

Ad 1: chyba chodzi Ci o tablicę z przypisywanymi wartościami w pętli for.

Ad 2. NIETESTOWANE! Prawdopodobne, ze coś pomieszałem.

unsigned char receivedDigit;
unsigned int receivedValue = 0;
unsigned long lastTimeReceived = 0;
void loop(){
  if(RECEIVED SOMETHING)
  {
    lastTimeReceived = millis();
    receivedDigit = functionFromIR();
    receivedValue = 10*receivedValue + receivedDigit;
  }
  
  if(lastTimeReceived && millis() - lastTimeReceived > 5000){
    useReceivedValue(receivedValue);
    receivedValue = lastTimeReceived = 0;
  }
  
}

 

Link do komentarza
Share on other sites

(edytowany)

Ad. 1

Być może ale nie wiem czy dokładnie to co powiedziałeś. Chodzi aby każdy przycisk pilota 0-9 miał już nałożoną wartość. Np. przycisk 0 = 0; zostaje wybrany ten przycisk -> zapala się dioda nr 0 (pierwsza w układzie) np. coś takiego

if(x = 0) leds[0] = CRGB(255,0,0); //Nie testowane jeszcze

 

Edytowano przez Miolhar
Link do komentarza
Share on other sites

9 godzin temu, rziomber napisał:

Poza tym nie wystarczy leds[x]?

Teoretycznie wystarczy ale w takiej sytuacji:

leds[x] = CRGB(255,0,0);

wszystkie ledy będą miały przypisany kolor czerwony. Mi zależy aby były cztery kolory. Aby ułatwić sobie stwierdziłem, że dla danych numerów ledów przypiszę od razu konkretny kolor. Czy coś takiego by działało? Czy dobrze myślę?

void loop() {

  if(lastTimeReceived && millis() - lastTimeReceived > 5000){
    useReceivedValue(receivedValue);
    x = receivedValue;
    for (int i = 0; i > -1; i = i + x){
      if(i == 0, 1, 2, 3, 4, 5, 5, 6, 12, 13) leds[i] = CRGB(255,0,0);
      else if(i == 7, 8, 9, 10, 11)leds[i] = CRGB(0,255,0);                   //i tak dalej aż będą 4 takie kolory
    }

    
    lastTimeReceived = 0;

}

 

Link do komentarza
Share on other sites

Napisałeś spory post i wrzuciłeś go na Forum a nie chiało Ci się klikąć "Kompiluj" i przekonać się, że to komletna bzdura?

Zacznij od zrozumienia znaczenia wyrażeń w nawiasie instrukcji for, potem poczytaj o if i tworzeniu wyrażeń warunkowych. W tzw. międzyczasie znajdź fragment podręcznika do języka C w któym piszą o inicjalizacji tablic. Tam będzie wytłumaczone jak sprawić, by w chwili startu programu Twoje leds[] miało takie kolorki jakie sobie wymarzyłeś.Nie możesz pisać co Ci ślina przyniesie na język, chyba że mówimy o jakimś metajęzyku do bardzo ogólnego wyrażania algorytmów - choć wątpię. Tak, zdobycie tej wiedzy wymaga czasu i to miałem na myśli radząc wcześniej byś zaczął czytać, uczyć się i powoli, ze zrozumieniem przerabiać lekcje kursu. Nie zrobisz tego projektu metodą losowego wrzucania bezsensownych kodów. Szansa trafienia na dobry jest zerowa, przykro mi. Bez przeczytania podręcznika do języka jakim chcesz/musisz się tu posługiwać nie będziesz nawet rozumiał porad, jakie różni ludzie będą tu wrzucać. Szkoda na to i Twojego i naszego czasu.

Link do komentarza
Share on other sites

 Po pierwsze: dopiero od kilku dni szukam, czytam, dokształcam się w tej dziedzinie programowania. Wcześniej nie miałem z tym styczności więc proszę o zrozumienie, że czasem faktycznie mogę pisać bzdury. 

Po drugie: wydaje mi się, że forum służy do pomagania sobie a nie tylko do wytykania błędów i nie wnoszenia niczego nowego. Zasady działania FOR lub IF  znam z javy więc jest możliwość, że pomieszałem sposób budowy. Tylko, że w twoim poście jest jedynie 

22 minuty temu, marek1707 napisał:

Napisałeś spory post i wrzuciłeś go na Forum a nie chiało Ci się klikąć "Kompiluj" i przekonać się, że to komletna bzdura?

Mógł byś wyjaśnić czemu bzdura? Ja bardzo przepraszam ale nie znam się jeszcze na tyle aby wiedzieć z czego ta BZDURA wynika. 

Kolejna sprawa: Ja wiem, że chcę w krótkim czasie zrobić coś co wymaga od osoby nowej w tym temacie trochę więcej czasu ale nie bardzo mam wyjście. Przede mną jeszcze 2 inne, dużo większe projekty które robię nie dla siebie tylko dla harcerstwa a dokładniej aby zuchy miały radochę. Z resztą po za tymi projektami mam też szkołę i życie prywatne. Staram się pogodzić na prawdę dużo rzeczy na raz więc chyba sam rozumiesz. Jeśli nie chcecie mi pomóc, podpowiedzieć co i jak, okej rozumiem. Nikogo do niczego nie zmuszam, nie musicie mi odpowiadać na posty. W chwili obecnej jedyne rady jakie otrzymałem to od @rziomber który wskazał mi kilka możliwości rozwiązań i jeden z postów @Treker który podpowiedział w kwestii sterowania ledów. Z twoich postów zaś wynika jedynie, że trzeba czytać. Nic więcej. Powiem tak: jak bym nie wiedział, że trzeba czytać to nie trafił bym na to forum ani na żadne inne. Za takie rady serdecznie dziękuję. Podsumowując, nie chcesz pomagać? Nie pomagaj i nie zabieraj sobie i innym czasu na pisanie postów podobnych do poprzedniego.  Pozdrawiam

Link do komentarza
Share on other sites

@Miolhar staramy się pomóc, ale naprawdę porwałeś się na jakiś wielki (jak dla Ciebie) projekt, a widać, że nie masz z tym żadnego doświadczenia. Naprawdę najlepiej byłoby jednak poświęcić trochę czasu na opanowanie podstaw - zaoszczędzisz na tym mnóstwo czasu. Sklejania programów na chybił-trafił jest mało skuteczne, bo kompilator nie domyśli się co chcesz osiągnąć. Nie mówię tego złośliwe, ale po to przygotowaliśmy na Forbocie ~14 darmowych kursów, aby dosłownie każdy mógł wejść w świat elektroniki. Nie oczekuj jednak, że ktoś zacznie sklejać projekt za Ciebie. Co z tego, że nawet dostaniesz gotowca jak byle zmiana sprawi, że będzie zupełnie zagubiony 😉

Jaki był np. cel tej linijki? Jak to miało według Ciebie działać, co chciałeś osiągnąć?

if(i == 0, 1, 2, 3, 4, 5, 5, 6, 12, 13) leds[i] = CRGB(255,0,0);

Ten warunek nie byłby poprawny (chyba) w żadnym języku programowania - stąd nasze zdziwienie (szczególnie, że sam napisałeś coś na temat znajomości Javy). Jeśli to miał być warunek, który sprawdza czy "i" jest równe 0 lub 1 lub 2 lub 3 itd. to w najprostszym wariancie musisz wykorzystać operatory łączce warunki. Do znalezienia w tym artykule: https://forbot.pl/blog/kurs-arduino-wykresy-liczby-losowe-id9676 Nie rozumiem jednak zupełnie np. czemu w tym warunku jest dwa razy wpisana wartość "5".

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.