Skocz do zawartości

Arduino MP3Player + 4x adresowalne RGB + pilot + PANEL TM1638


PowerTGS440

Pomocna odpowiedź

Witam,

takie coś jak na zdjęciu (sterowane Arduino MEGA256) i moje pytanie, jak podpiąć pilota i czy w ogóle się da aby reagował od razu ? czasami dzieje się tak, że wykonywane są inne wątki - a trochę ich jest : sterowanie 4 zestawami adresowalnych RGB + wyświetlacz LC na którym jest czas (czasami pokazuje co innego, jak temperatura, wilgotność, poziom natężenia światła w pokoju lub na zewnątrz), progress BAR (ten uruchamiania co 1 sekundę) dla odtwarzanej muzyki, i jeśli odtwarzana jest muzyka pokazuje to na LC, jeśli nie i tak wchodzi w metodę by wyświetlić sekundnik zegara. 

Jednym słowem, zmuła zaczęła się od czasu podłączenia LED'ów które mają błyskać podczas odtwarzania MP3.

Jest też panel TM1638, ale na nim tylko są informacje o stanie przekaźnika (8 sztuk) do sterowania oświetleniem (z pilota lub panelu). Sama pętla LOOP to tylko 3 instrukcje, najgorszy problem z 2 wątkami do obsługi adresowalnych LEDÓW, jeden jest wykonywany co 103ms, drugi co 154ms i one lubią mi przyblokować pilota, aczkolwiek nie wykonują złożonych instrukcji, w sumie ogarniają 16+16+8+8 diód.

Nie ma tam długich pętli : 4x (dla każdego paska osobne) wejście -> ustawienie nowej sekwencji kolorów do wyświetlenia (nie zbyt skomplikowane obliczenia), potem wyczyszczenie paska, krótka pętla od 0 do 7 lub od 0 do 15 która zapala na nowo w danym kolorze poszczególne LED'y i wyjście z uruchomionego wątku. Chciałbym zejść z 103ms i 154ms do 50 (by szybciej to błyskała) ale te wartości są optymalne by pilot reagował, poniżej tego jest ZONK !!! pilot nie reaguje, sekundy nie są odświeżane co 1sekundę, progress BAR działa jak chce (a jego wyznacznikiem jest upłynięta sekunda).

Wątki czasowo się nie nakładają, gdy dochodzi do takiej krytycznej sytuacji jest to korygowane, żeby było jasne !!!

Już się zastanawiam, że mogłem to zrobić na Arduino DUE, które jest dużo szybsze, bo nie wiem czy tu obejdę problem czasu reakcji pilota.

// --- L O O P ------------------------------------------------------------------------------- //
void loop()                                                                                    //
{                                                                                              //
    Pilot -> Update();            // --- sprawdź odczyty z pilota ---------------------------- //
    Panel -> Update();            // --- sprawdź odczyty z panela ---------------------------- //  
    thread.process();             // --- sprawdź wątki do wykonania -------------------------- //    
}                                                                                              // 
// --- KONIEC PĘTLI GŁÓWNEJ ------------------------------------------------------------------ //

W programie jest tylko użyta jeden raz funkcja delay !!! (mówię o tym, bo zaraz pojawią się setki doradców, że to od tego) -użyłem tylko (na chwilę póki co), dlatego bo jak muzyka nie gra paski LED nie błyskają za szybko to działało i wciśniecie przycisku powodowało przełączanie ON/OFF w niekontrolowanej postaci - włącza przekaźnik i wyłącza go od razu. Mogłem to obejść inaczej, ale w tym jednym przypadku mówię TAK:  delay jest spoko, ale tylko czasami 🙂 ten jeden raz w aplikacji złożonej już z ponad 6000 linijek mojego kodu dostał przyzwolenie, na razie tylko - i tak go wywalę bo mnie irytuje sama nazwa, chociażby opóźnienie miał bym zyskać efektem wizualnym paskami to to zrobię, póki co nie mam na to czasu, są ważniejsze rzeczy do zrobienia.

WikiCosmoPlayer.jpg

void PANEL::Update()                                                                                   //
{                                                                                                      //
  word keys = p -> getButtons();            // zapisz do keys kod przycisku -------------------------- //      
  if(keys>0 && keys<17)                     // wykonaj tylko wtedy gdy wcisniety przycisk ------------ //
  {                                                                                                    //
    delay(150);                             // jeśli odczytano kod klawiatury z PANEL poczekaj 150ms - //  
                                                                                                       //
    switch(keys)                                                                                       //
    {                                                                                                  //
    case  1: r -> RelaySwitch(0); break;                    // przełącz przekaźnik nr. 1 ------------- //
    case  2: r -> RelaySwitch(1); break;                    // przełącz przekaźnik nr. 2 ------------- //
    case  3: r -> RelaySwitch(2); break;                    // przełącz przekaźnik nr. 3 ------------- //
    case  4: r -> RelaySwitch(3); break;                    // przełącz przekaźnik nr. 4 ------------- //
    case  5: r -> RelaySwitch(4); break;                    // przełącz przekaźnik nr. 5 ------------- //
    case  6: r -> RelaySwitch(5); break;                    // przełącz przekaźnik nr. 6 ------------- //
    case  7: r -> RelaySwitch(6); break;                    // przełącz przekaźnik nr. 7 ------------- //
    case  8: r -> RelaySwitch(7); break;                    // przełącz przekaźnik nr. 8 ------------- //
    case  9:                                                // przycisk nr. 9 ------------------------ //
           {                                                                                           //
             if( F_music_auto ) VU1 -> SwapColor();         // jeśli gra muzyka, zmień kolory          //
             break;                                                                                    //
           }                                                                                           //
    case 10:                                                // przycisk nr. 10 ----------------------- //
           {                                                                                           //
             if( F_music_auto ) VU2 -> SwapColor();         // jeśli gra muzyka, zmień kolory          //
             break;                                                                                    //
           }                                                                                           //
    case 11:                                                // przycisk nr. 11 ----------------------- //
           {                                                                                           //
             if( F_music_auto ) VU3 -> SwapColor();        // jeśli gra muzyka, zmień                  //
             break;                                                                                    //
           }                                                                                           //
    case 12:                                                // przycisk nr. 12 ----------------------- //
           {                                                                                           //
             if( F_music_auto ) VU4 -> SwapColor();         // jeśli gra muzyka, zmień kolory          //
             break;                                                                                    //
           }                                                                                           //
    case 13: wikiMP3 -> PlayerUpdate(1); break;             // jeśli przycisk nr. 13 włącz PLAY MP3    //
    case 14: wikiMP3 -> PlayerUpdate(0); break;             // jeśli przycisk nr. 14 włącz STOP MP3    //
    case 15:                                                                                           //
           {                                                // jeśli gra muzyka czyli flaga jest TRUE  //
             if( F_music_auto) wikiMP3 -> PlayerUpdate(2);  // jeśli przycisk nr. 15 poprzedni MP3 FILE//
             break;                                                                                    //
           }                                                                                           //
    case 16:                                                                                           //
           {                                                // jeśli gra muzyka czyli flaga jest TRUE  //
             if (F_music_auto) wikiMP3 -> PlayerUpdate(3);  // jeśli przycisk nr. 16 nastepny MP3 FILE //     
             break;                                                                                    //
           }                                                                                           //
    default: break;                                                                                    //
    }; // --- koniec instrukcji SWITCH --------------------------------------------------------------- //
  }    // --- koniec wejście warunkowego IF ---------------------------------------------------------- //   
}      // --- koniec obsługi czy_wciśnięto_przycisk (PanelUpdate) ------------------------------------ //                           

już nie wiem co optymalizować, tak chyba już jak widać zbędne rzeczy gdy nie ma potrzeby są nie ruszane. Tak wygląda obsługa pilota, tu nie ma delay'a bo tą bibliotekę pisałem sam od podstaw - irytowała mnie IRremote.h - po odczycie dostaję kod w postaci liczby 8-bitowej z przedziału 0-98, ponowne wciśnięcie przycisku zwróci jego kod dopiero po upływie 1sec, inaczej zostanie zignorowany. Więc nie ważne co jest w środku, opóźnienia nie wynikają z metody. Raz musi być wykonane.

// -------------------------------------------------------------------------------------------- //
void PILOT::Update()                                                                            //
{                                                                                               //
  uint_fast8_t kod = 99;                            // maks. zwraca wartość to 98, ustaw na 99  //
  if (Pilot_decode())                               // jeśli przycisk zdekodowany  ------------ //
  {                                                                                             //
    if(Pilot_isReleased()) kod = Pilot_keycode;     // jeśli wciśniety zapisz do key ---------- //
    Pilot_resume();                                                                             //
  }                                                                                             //   
  if(kod <99)                                                                                   //
  {                                     // jeśli kod mniejszy niż 99 to wykonaj insr. SWITCH    //
  switch (kod)                                                                                  //
  {                                                                                             //
      case  0:  r -> RelayAllOff(); break;                  //  0 -> włacz wszystkie przekaźniki//
      case  1:  r -> RelaySwitch(0); break;                 //  1 -> przekaznik nr. 1 --------- //
      case  2:  r -> RelaySwitch(1); break;                 //  2 -> przekaznik nr. 2 --------- //                              
      case  3:  r -> RelaySwitch(2); break;                 //  3 -> przekaznik nr. 3 --------- //
      case  4:  r -> RelaySwitch(3); break;                 //  4 -> przekaznik nr. 4 --------- //
      case  5:  r -> RelaySwitch(4); break;                 //  5 -> przekaznik nr. 5 --------- //
      case  6:  r -> RelaySwitch(5); break;                 //  6 -> przekaznik nr. 6 --------- //
      case  7:  r -> RelaySwitch(6); break;                 //  7 -> przekaznik nr. 7 --------- //
      case  8:  r -> RelaySwitch(7); break;                 //  8 -> przekaznik nr. 8 --------- //
      case  9:  r -> RelayAllOn(); break;                   //  9 -> wlacz wszyskie przekazniki //
      case 90:  wikiMP3 -> PlayerUpdate(1); break;          // play                             //
      case 91:  if(F_P) wikiMP3 -> PlayerUpdate(2); break;  // utwór poprzedni                  //
      case 92:  if(F_P) wikiMP3 -> PlayerUpdate(3); break;  // utwór nastepny                   //
      case 93:  if(F_P) wikiMP3 -> PlayerUpdate(4); break;  // volume UP                        //
      case 94:  if(F_P) wikiMP3 -> PlayerUpdate(5); break;  // volume DOWN                      //      
      case 95:  if(F_P) wikiMP3 -> PlayerUpdate(0); break;  // stop                             //
      default:  break;                                                                          //
    }   // koniec SWITCH                                                                        //
  }     // koniec IF - kod poprawny, wejdź to switch                                            //
}       // koniec PILOT::Update()                                                               //
// -------------------------------------------------------------------------------------------- //

 

Edytowano przez PowerTGS440
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.