Close

Odpověď na: adresovatelný led pásek, změna efektů

Úvodní stránka Fórum Vaše projekty Arduino adresovatelný led pásek, změna efektů Odpověď na: adresovatelný led pásek, změna efektů

#10513
Vojtěch Vosáhlo
Účastník

Pokud to tedy chápu správně, místo použití příkazu switch mám použít vypsaní všech možností podmínkou if

To úplně neříkám. Já použil if pouze protože jsem volal jen jednu funkci, jen kvůli jednoduchosti. Vy můžete nadále používat switch case. Pokud byste chtěl mít kód optimalizovaný na max, dá se použít něco takového:


#include <Adafruit_NeoPixel.h>
#include"IRremote2.h"

///Deklarace pouzitych funci
void funkce1();
void funkce2();

#define pinIN 4
#define PIN   6
// Parametr 1 = počet pixelů (LED diod) na pásek
// Parametr 2 = číslo PINu Arduina
// Parametr 3 = pixel type flags, add together as needed:
// NEO_KHZ800  800 KHz kmitočet pro pásky s WS2812 LED diodami)
// NEO_GRB  Pixely jsou zasílány ve formátu GRB 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(36, 6, NEO_GRB + NEO_KHZ800);
IRrecv dalkoveOvl(pinIN);
decode_results vysledek;
char pozice;

typedef void (* Caller)();
Caller funkce[] = {&funkce1, &funkce2}; ///FUNKCE KTERE CHCETE VOLAT
char serial_prikazy[] = {'1', '2'}; ///PRIKAZY KORESPONDUJICI S FUNKCEMI tzn. 1 vola funkce1
int32_t ir_prikazy[] = {0x00FFA25D, 0xFFE21D};
char data;

void setup(){
  pixels.begin();
  Serial.begin(9600);
  pixels.show();
  delay(250);
  dalkoveOvl.enableIRIn();
}

///////////////////////////////////////////////////////////////////////
//////////////FUNKCE KTERE BUDOU VOLANE PRIKAZY //////////////////////
void funkce1(){
  dalkoveOvl.resume();

  while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
  {
    pixels.setPixelColor(6, pixels.Color(255,255,255));
    pixels.show();
    delay(1000);
    pixels.setPixelColor(6, pixels.Color(0,0,0));
    pixels.show();
    delay(200);    
    pixels.setPixelColor(6, pixels.Color(255,255,255));
    pixels.show();
    delay(1000);
    pixels.setPixelColor(6, pixels.Color(0,0,0));
    pixels.show();
    delay(200);
  }
}

void funkce2(){
  dalkoveOvl.resume();

  while(!(Serial.available() || dalkoveOvl.decode(&vysledek)))
  {
    pixels.setPixelColor(16, pixels.Color(255,255,255));
    pixels.show();
    delay(1000);
    pixels.setPixelColor(16, pixels.Color(0,0,0));
    pixels.show();
    delay(200);    
    pixels.setPixelColor(16, pixels.Color(255,255,255));
    pixels.show();
    delay(1000);
    pixels.setPixelColor(16, pixels.Color(0,0,0));
    pixels.show();
    delay(200);
  }
}

/////////////////////////////////////////////////////////////////////

void loop(){
  
    if(Serial.available() || dalkoveOvl.decode(&vysledek)){
      
    data = Serial.read();
    
        for(int i = 0; i < sizeof(funkce); i++){
            if(data == serial_prikazy[i] || vysledek.value == ir_prikazy[i]){
              
                funkce[i]();
              
              }
          
          }
          
    }
}

Prakticky si na začátku zapíšete všechny různé funkce a pak už se jen volají podle příkazů. Je to kratší a nemusíte používat switch case.
Nejdůležitější je deklarovat si na začátku všechny „blikací a svítící“ funkce asi takto

void funkce1();
void funkce2();

Těch tam může být kolik chce.
Poté si zapíšete příkazy které funkce spouští jako tady: `Caller funkce[] = {&funkce1, &funkce2}; ///FUNKCE KTERE CHCETE VOLAT
char serial_prikazy[] = {‚1‘, ‚2‘}; ///PRIKAZY KORESPONDUJICI S FUNKCEMI tzn. 1 vola funkce1
int32_t ir_prikazy[] = {0x00FFA25D, 0xFFE21D};`

V Caller funkce[] jsou zapsány samotné funkce které se budou volat, zapisujete je jako &nazevfunkce. V serial_prikazy[] jsou sériové příkazy které spouští dané funkce tzn. příkaz na 1. pozici spustí funkci na 1. pozici v tom Caller funkce[]. V poli ir_prikazy[] jsou opět korespondující příkazy které spouští funkce. Musí být zapsány jako 0x00vasirkod. Ten kód co jsem přihodil by měl fungovat jako ten váš se switch case nebo if. Schválně zkuste a uvidíme.

Obnovení předešlé animace kdyžtak vyřešíme jestli tohle bude fungovat.