Close

Odpověď na: Jak na název s automatickým posunem jména

Úvodní stránka Fórum Hardware Arduino Jak na název s automatickým posunem jména Odpověď na: Jak na název s automatickým posunem jména

#7390
Zbyšek Voda
Správce

Dobrý den, pošlu vám celý kód určený pro LEDky ze článku.

class LED{
    private: 
        int pin;
        boolean stav = LOW; //výchozí stav LED je vypnuto
        void nastav(boolean);

    public: 
        LED(int);
        void zapni();
        void vypni();
        void prepni();
        boolean vratStav();
};

LED::LED(int p){
    pin = p;
    pinMode(pin, OUTPUT);
    digitalWrite(pin, stav);
}

void LED::zapni(){
    nastav(HIGH);
}

void LED::vypni(){
    nastav(LOW);    
}

void LED::prepni(){
    nastav(!stav); //nastaví LED na obrácenou hodnotu (0->1, 1->0)
}

void LED::nastav(boolean s){
    stav = s;
    Serial.print("Nastavuji ");
    Serial.print(stav);
    Serial.print(" na pinu ");
    Serial.println(pin);
    digitalWrite(pin, stav);
}

boolean LED::vratStav(){
    return stav;     
}

#define NO_OBJECTS 6

LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));

void setup() {
    Serial.begin(9600);
    
    for(int i = 0; i < NO_OBJECTS; i++){
        LEDS[i] = LED(i);
    }
   
    for(int i = 0; i <= 10; i++){
        LEDS[2].prepni();
        delay(500);    
    }
}

void loop() {
}

Důležité části jsou:

#define NO_OBJECTS 6
Řekne programu, že bude celkem 6 LEDEK/TLAČÍTEK…

LED *LEDS = (LED*)malloc(NO_OBJECTS * sizeof(LED));
Vytvoří se ukazatel na datový typ LED. Funkce malloc alokuje v paměti prostor pro budoucí pole – potřebuje vědět, jak bude velké. Proto se jí jako parametr předá velikost jednoho objektu LED (sizeof) ponásobená počtem objektů v poli. Funkce malloc vrací datový typ void*, takže je potřeba ho ještě před uložením do LEDS přetypovat na LED*. Dále už se dá s LEDS pracovat jako s normálním polem.

Nevím, jestli je toto nejjednodušší cesta, ale nenapadla mě jednodušší.

    for(int i = 0; i < NO_OBJECTS; i++){
        LEDS[i] = LED(i);
    }

Do pole LEDS poukládá objekty LED na daných pinech.

   for(int i = 0; i <= 10; i++){
        LEDS[2].prepni();
        delay(500);    
    }

Postupně bliká ledkami.

Snad to je pochopitelné. Kód by měl jednoduše jít předělat pro vaše potřeby. Pole by mohlo vypadat takto:

RBD::Button *pole = (RBD::Button*)malloc(NO_OBJECTS * sizeof(RBD::Button));

Jeho naplnění potom:

for(...){
    pole[i] = RBD::Button(i);
}