Keresés

Új hozzászólás Aktív témák

  • Janos250

    őstag

    válasz Xpod #8400 üzenetére

    Nem kell megfejteni!
    Ennyi a loop lényege:

    void loop() {

    taskDISABLE_INTERRUPTS() ;

    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    transmitOnePixel(lightArray [lightArrayIndexPortWriting][i]) ;
    } ;

    taskENABLE_INTERRUPTS() ;

    delay(1000) ;

    } ; // end loop

    A transmitOnePixel paramétere egy tömb.

    typedef struct RGB {
    uint8_t r, g, b;
    };

    RGB lightArray[2][ledNum] ;

    Az első indexe 0, vagy 1. Amíg az egyik első indexxel a tartalmát küldöd a led szalagra, addig a core0-á a másik indexxel számolod a következő értéket.
    Ezt célszerűen egy
    xTaskCreatePinnedToCore
    hívással célszerű megtenni.

    Ezt:
    void lightShowInCore0Code( void* parameter){
    static uint8_t showNum = 0 ;

    switch (showNum) {
    case 0:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {0,0,0} ;
    } // end for
    lightArray[lightArrayIndexCalculating][0] = RGB {255,255,255} ; // first, last pixel controll
    lightArray[lightArrayIndexCalculating][ledNum - 2] = RGB {255,255,255} ;
    lightArray[lightArrayIndexCalculating][3] = RGB {255,255,255} ;
    break;
    case 1:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {(128-i*(128/ledNum)),i*(128/ledNum),0} ;
    } // end for
    break;
    case 2:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {0,0,32} ;
    } // end for
    break;
    case 3:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {0,32,0} ;
    } // end for
    break;
    case 4:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {32,0,0} ;
    } // end for
    break;
    case 5:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {(128-i*(128/ledNum)),0,i*(128/ledNum)} ;
    } // end for
    break;
    default:
    for ( uint8_t i = 0 ; i < ledNum ; i++) {
    lightArray[lightArrayIndexCalculating][i] = RGB {16,16,16} ;
    } // end for
    }

    showNum++ ;
    showNum = showNum % 6 ;


    vTaskDelete(NULL);

    } ; // end lightShowInCore0Code

    csak mintapéldának írtam hasraütésszerűen náhány verziót, ami a case szerint sorra veszi.

    A
    static uint8_t showNum = 0 ;
    miatt sorra veszi őket.

    Persze lehet a kész könyvtárakkal is, ha már azzal kezdted el, bizonyára úgy is kell mennie.
    A vékony drót esetét én sem értem, de vannak még csodák.

    Ha valamelyik led nem azt csinálja, amit kellene:
    az többnyire amiatt van, hogy 1 msec időközönként megszakít, és ilyenkor túlszalad az idő.
    Próbáld meg esetleg tiltani a megszakítást azon a magon, amíg tart az adatok feltöltése a szalagra!

Új hozzászólás Aktív témák

Hirdetés