Pomocné premenné

sizeof()

Veľkosť, ktorú zaberá dátový typ alebo premenná sa dá zistiť operátorom sizeof.

sizeof(x);    // x je akýkoľvek typ premennej alebo poľa (napr. int, float, byte, array)

Operátor sizeof je vhodný pre prácu s poľami (napr. konštantné reťazce).

char myStr[] = "Tento text vypisujeme po jednom znaku";
int i;

void setup(){
  Serial.begin(9600);
}

void loop() { 
  for (i = 0; i < sizeof(myStr) - 1; i++){
    Serial.print(i, DEC);
    Serial.print(" = ");
    Serial.write(myStr[i]);
    Serial.println();
  }
  delay(5000); 
}

Tento program vypisuje textový reťazec po jedenom znaku z reťazcového poľa myStr. Dĺžku reťazca zistíme zápisom sizeof(myStr) – 1. Mínus jedna je tam preto, lebo v cykle začíname od nuly, pretože indexovanie poľa myStr[i] je tiež od nuly.


PROGMEM

PROGMEM je kľúčové slovo pri deklarácii premennej. Hovorí kompilátoru “daj túto informáciu do pamäte flash, namiesto do SRAM”. PROGMEM je súčasťou knižnice pgmspace.h, ktorá je k dispozícii len pre AVR architektúru. Takže najprv treba zahrnúť knižnicu v hornej časti programu použitím #include a potom zadefinovaním premennej:

#include <avr/pgmspace.h>

const#include <avr/pgmspace.h>

const dataType variableName[] PROGMEM = {data0, data1, data3...};
// dataType je akýkoľvek dátový typ okrem float
// variableName je názov pre pole dát

Arduino prekladač prijíma všetky nižšie uvedené definície, ktoré sú si synonymom. Avšak pokusy ukázali, že v rôznych verziách IDE Arduino, môže PROGMEM pracovať na jednom mieste ale na inom nie.

const dataType variableName[] PROGMEM = {};   // správny zápis
const PROGMEM  dataType  variableName[] = {}; // správny zápis
const dataType PROGMEM variableName[] = {};   // špatný zápis

Pre väčší počet premenných rovnakého typu, môžeme zadefinovať pole (aj s konštantnou veľkosťou, prípadne ak ju nezadáme, kompilátor ju priradí automaticky):

const char denvTyzdni[7][9] PROGMEM = {              // [7] počet dní [9] max. počet znakov (+1) 
  {0x4e, 0x65, 0x64, 0x65, 0xbe, 0x61, 0x20, 0x20},  // Nedeľa      (jednotlivé znaky zadané v hex)
  {"Pondelok"},                                      // Pondelok    (zadané ako konštantný reťazec)
  {'U', 't', 'o', 'r', 'o', 'k', ' ', ' '},          // Utorok      (zadané ako znaková konštanta)
  {0x53, 't', 'r', 0x65, 0x64, 0x61, 0x20, 0x20},    // Streda      (kombinácia)
  {0x8A, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x20},  // Štvrtok
  {0x50, 0x69, 0x61, 0x74, 0x6f, 0x6b, 0x20, 0x20},  // Piatok 
  {0x53, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x20, 0x20}   // Sobota
};

// ...

Upozorňujem, že premenné musia byť definované buď ako globálne premenné alebo definované pomocou kľúčového slova static.

Používanie PROGMEM vyžaduje dvojfázový postup. Takto zadefinované hodnoty sa zapíšu do pamäte Flash spolu so skompilovaným programom a zostávajú na jednom mieste bez zmeny. Hodnotu už nieje možné meniť ani počas behu programu. Takže po zapísaní dát do pamäte Flash, potrebujeme teraz špeciálnu metódu (funkciu), ktorá je tiež definovaná v knižnici pgmspace.h, na čítanie dáta z pamäte Flash späť do pamäte SRAM, do nejakej svojej zadefinovanej premennej, kde už s načítanou hodnotou v našej premennej môžeme robiť niečo užitočné. Napríklad vypísať reťazec alebo chybovú hlášku na displej, pripadne sériový port.

// ...

Serial.print(FPSTR(denvTyzdni[6]));   // vypíše na port Sobota, [6] = Sobota (indexuje sa od 0 = Nedeľa)

Ďalší príklad s načítaním údajov z pamäte Flash:

#include <avr/pgmspace.h>


// uložíme si nejaké celé čísla do Flash pamäti (zaberajú po dva bajty typu uint16_t čo je aj typ word)
const PROGMEM  uint16_t charSet[]  = { 65000, 32796, 16843, 10, 11234};  

// a aj nejaké znakové pole do premennej singMessage
const char signMessage[] PROGMEM  = {"Tento text je ulozeny vo Flash pamati"};

unsigned int displayInt;
int k;        // počítadlo adresy
char myChar;


void setup() {
  Serial.begin(9600);
  while (!Serial);

  // sem dáme kód, ktorý sa nám spustí len raz:
  // načítavanie celého čísla z premennej charSet do premennej displayInt (typ unsignet int je aj typ word)
  for (k = 0; k < 5; k++)
  {
    // do premennej displayInt si načítame z Flash pamäti celé číslo z premennej charSet, sú to dva bajty typu word
    displayInt = pgm_read_word_near(charSet + k);  // a preto použijeme: pmg_read_word_near(adresa premennej charset) 
    Serial.println(displayInt);                    // vypíšeme načítaný znak na sériový port
  }
  Serial.println();  // nový riadok

  // načítavanie znakov z premennej singMessage do premennej myChar (typ char = byte)
  int len = strlen_P(signMessage);                 // zistíme si počet znakov v premennej singMessage 
  for (k = 0; k < len; k++)          
  {
    myChar =  pgm_read_byte_near(signMessage + k); // tu použijeme: pmg_read_byte_near(adresa singMessage)
    Serial.print(myChar);                          // a vypíšeme na sériový port
  }

  Serial.println();
}

void loop() {
  // tu môže byť opakujúci sa kód programu

}

Často je vhodné pri práci s veľkým množstvom textu, ako je napríklad projekt s LCD displejom, nastaviť pole reťazcov. Vzhľadom k tomu, že reťazce sú samotné polia, je to v skutočnosti príklad dvojrozmerného poľa. Kód nižšie ilustruje ako použiť pole reťazcov.

/*
 Ako uložiť a načítavať tabuľku reťazcov z Flash

 Informácie nájdete tu:
 https://www.nongnu.org/avr-libc/user-manual/pgmspace.html

 Nastavenie tabuľky reťazcov si vyžaduje dva kroky
 Ako prvé si zadefinujeme reťazce
*/

#include <avr/pgmspace.h>

const char string_0[] PROGMEM = "Text 0";   // "Text 0" uložený prvý reťazec, zmeňte si ho na ľubovolný
const char string_1[] PROGMEM = "Text 1";
const char string_2[] PROGMEM = "Text 2";
const char string_3[] PROGMEM = "Text 3";
const char string_4[] PROGMEM = "Text 4";
const char string_5[] PROGMEM = "Text 5";


// Ako druhé si nastavíme tabuľku, ktorá odkazuje na reťazce

const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

char buffer[30];    // uistite sa, že buffer je dosť veľký pre najdlhší reťazec

void setup()
{
  Serial.begin(9600);
  while(!Serial);
  Serial.println("OK");
}


void loop()
{
  /* Použitie tabuľky reťazcov si vyžaduje použitie špeciálnych funkcií pre načítavanie dát. 
     Funkcia strcpy_P skopíruje reťazec z pamäte Flash do premennej "buffer" v pamäti RAM. 
     Uistite sa, aby bola premenná "buffer" dostatočne veľká.
 */
  for (int i = 0; i < 6; i++)
  {
    strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i])));   // kopírovanie (do, odkiaľ(referencia na tabuľku))
    Serial.println(buffer);
    delay( 500 );
  }
}

Spomeňme ešte funkciu F()macro. Ak použijete napr.

Serial.print("Tento text je ulozeny v RAM");

tak použitý reťazec je normálne uložený v pamäti RAM. Ak váš program používa veľa takýchto textov, môžete si ľahko zaplniť pamäť RAM. Ak máte voľný pamäťový priestor v pamäti Flash, môžete ľahko naznačiť prekladaču, že reťazec má byť uložený vo FLASH pamäti a to pomocou syntaxe:

Serial.print(F("Tento text je ulozeny vo Flash"));

Tento text je preložený a upravený zo stránok arduino.cc pod licenciou Creative Commons Attribution-ShareAlike 3.0.

Výber na čítanie...

DHT11 a DHT22 – meranie teploty a vlhkosti
DHT11 a DHT22 – meranie teploty a vlhkosti

Na meranie teploty a vlhkosti v interiéry som vyskúšal známe senzory DHT11 (modrý) a DHT22 (biely). V článku som spomenul rozdiely, zapojil senzory s Arduinom Nano, vyhľadal vhodnú knižnicu, vyskúšal nejaké tie programy a samozrejme niečo som i nafotil. ...

Čítať viac...

Arduino história
Arduino história

Arduino [čítaj Arduíno] je v informatike názov malého jedno-doskového počítača založeného na mikrokontroléri ATmega od firmy Atmel. Svojim návrhom sa snaží podporiť výučbu informatiky v školách a oboznámiť študentov s tým, ako sú pomocou počítačov riadené rôzne zariadenia ...

Čítať viac...

Arduino Knižnice návod na inštaláciu
Knižnice – návod na inštaláciu

Knižnice určené pre Arduino sú priečinky (adresáre), ktoré združujú viac súborov so zdrojovými kódmi. Vďaka týmto zdrojovým kódom máme potom jednoduchší a prehľadnejší vlastný program, keď chceme pripojiť nejaký zložitejší modul, senzor, displej a podobne. Napríklad pri stiahnutí programovacieho ...

Čítať viac...

Obľúbené produkty...

TTP229L Touch Key USB Shield

9.19 EUR

9.19 EUR

Keyestudio PLUS Board Basic Starter Kit

23.00 EUR

20.01 EUR

Keyestudio ESP32 Learning Kit

97.07 EUR

50.48 EUR

Keyestudio CAN-BUS Shield MCP2515

18.56 EUR

13.36 EUR

Vyhľadať články
Programovanie...
  • Terárne operátory

    Terárne operátory alebo označované aj ako podmienené operátory sú pomerne neobvyklé. Preto bude v...

  • Konverzie

    Možno ste sa už pri programovaní dostali do situácie, kedy si program robil s číslami a dátovými ...

  • Relačné operátory

    Relačné operátory sú < > = == !=. Sú definované pre operandy všetkých základných dátových typov. ...

  • Funkcie náhodných čísiel

    Náhodné čísla zvyčajne pozostávajú zo zložitých sérií algoritmov, ktoré sú štatisticky predvídate...

  • Dátové typy

    Celočíselné dátové typy môžu obsahovať modifikátory unsigned respektíve signed, čím môžeme požado...

Podpora webu
Na kávu už prispeli
Dátum Meno Suma
08.01.2024 Veres Dusan 10€
15.05.2023 Ivan Danis 10€
28.09.2022 Ivan Vrab 7€
14.05.2022 Nemcic Marian 10€
04.02.2022 Robert Bilko 5€
29.01.2022 Peter Buffa 5€
19.11.2021 Rastislav Rehak 5€
16.09.2021 Anton Strela 5€
13.09.2021 Juraj Jedlak 5€
02.09.2021 Michal Marek 7€
08.08.2021 František Uhrík 5€
21.07.2021 Juraj Hrdina 5€
25.03.2021 Jan Nemec 10€
16.03.2021 Igor Pavlov 5€
25.02.2021 Lukas Lacuch 5€
06.11.2020 Pavol Balint 5€
05.11.2020 Marek Horečný 5€
05.10.2020 Jan Kusnir 5€
27.04.2020 Jan Zuskin 15€
26.04.2020 Dušan Sojka 5€
24.02.2020 Juraj Lackanič 5€
22.01.2020 František Žilinec 10€
20.05.2018 Tomáš F. 2€
17.12.2018 Pavol P. 5€
QR Donate 10Eur