Close

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

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (celkem z 5)
  • Autor
    Příspěvky
  • #7388
    BorgMcz
    Účastník

    Potřeboval bych v jednom projektu v následujícím kódu měnit v posloupnosti jméno :
    RBD::Button jméno (pin);
    toto je zakladní vytvoření funkce, mohu ji tvořit ručně:

    RBD::Button button0(30); 
    RBD::Button button1(31);
    RBD::Button button2(32);

    ale potřeboval bych to tvořit automaticky za pomoci cyklu, něco jako asi takhle:

    for (int x=0; x<15; x++) {
      RBD::Button button(x)(y);
      }

    nevím, jak správně to zapsat, aby IDE pochopilo co chci. Dá se to nějak zapsat?
    Jde mi pouze o to jméno plus cislo v X , Y je jasne.

    #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);
    }
    #7402
    posjirka
    Účastník

    souhlasím se Zbyškem. Asi jedinou variantou je udělat pole objektu (nikoliv proměnných …), které se nadefinuje jako rozěmr pole a poté se pro každý záznam/buňku pole vytvoří instance objektu. Vcelku hezká diskuze a vysvětlení je třeba tu:
    https://forum.arduino.cc/index.php?topic=80913.0

    Zbyšek to napsal velmi správně jen je to v tom textu těžko čitelné.
    v podstatě tě zajímá pouze tato část:

    int BUTTON[] = {2,3,4,5,6};  //button pins
    const int numButtons = 5; 
    
    Bounce bouncer[5];
    
    for( int i = 0; i < numButtons; i++){
       Bounce bouncer[i] = (BUTTON[i], 5);
    }

    Jinak doporučuju použít standardní řadu proměnných, už jen z důvodu omezené kapacity paměti RAM. Například v C# bych si toto dovolil a použil spíš kolekci než pole pro lepší manipulaci se záznamy. V poli musíš nadefinovat jak bude veliké a v případě zmany velikosti provést „přenesní hodnot“. s kolekcí můžeš dělat co chceš. Je však náročná na paměť a Arduino jinepodporuje. Chci tím říst, že stejně na začátku budeš muset nadefinovat kolik těch objektů budeš chtít vytvořt a ověřit si že máš dostatek volných prostředků. Navíc se budeš odkazovat na objekty jako na realtivní adresy, … Prostě mi to trochu v hlavě nabourává tu jednoduchost řešení případů, pro kterou bylo arduino navrženo…. tyto procesy bych spíš řešil na raspberry pi.

    #7406
    BorgMcz
    Účastník

    No zkoušel jsem co se dalo, ale výsledek mám stále s nějakou chybou.
    Nemohl bych to poslat s mailem, kde bych vyznačil problémová místa.
    můj mail mm.svet(za.vi.nac)centrum.cz

    opravdu díky za pomoc

    #7407
    Zbyšek Voda
    Správce

    To vytvoření pole přes
    Bounce bouncer[5];

    jsem také zkoušel, ale nějak to kompilátor nebral. Přitom by to takto mělo C++ podporovat.
    Proto jsem šel tou cestou přes malloc().

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (celkem z 5)
  • Pro reakci na toto téma se musíte přihlásit.