Utility.
sizeof(variable)
Restituisce il peso della variabile variabile in byte, funziona con variabili numeriche di tutti i tipi, array, stringhe.
// array di diverso tipo
byte arrayB[5];
int arrayI[5];
long arrayL[5];
float arrayF[5];
String myString = "Electron 32";
// emette il peso totale dell'array
Serial.println(sizeof(arrayB)); // output: 5
Serial.println(sizeof(arrayI)); // output: 10
Serial.println(sizeof(arrayL)); //output: 20
Serial.println(sizeof(arrayF)); // output: 20
Serial.println(sizeof(myString)); // output: 10
// visualizziamo il numero di celle nell'array, dividendo per il peso di uno.
Serial.println(sizeof(arrayB) / sizeof(arrayB[0])); // output: 5
Serial.println(sizeof(arrayI) / sizeof(arrayI[0])); // output: 5
Serial.println(sizeof(arrayL) / sizeof(arrayL[0])); // output: 5
Serial.println(sizeof(arrayF) / sizeof(arrayF[0])); // output: 5
PROGMEM
L'utility consente di inserire i dati (singoli valori, array, stringhe) nella memoria Flash del microcontrollore nella fase di caricamento dello sketch e di leggerli durante il funzionamento, risparmiando così memoria SRAM. Esempio di utilizzo:
// memorizzare più numeri interi
const uint16_t ints[] PROGMEM = {65000, 32796, 16843, 10, 11234};
// memorizzare più decimali
const float floats[] PROGMEM = {0.5, 120.25, 0.9214};
// memorizzare
più caratteri
const char message[] PROGMEM = {"Hello!"};
void setup()
{
Serial.begin(9600);
Serial.println(pgm_read_word(&(ints[2]))); // visualizzerà 16843
Serial.println(pgm_read_float(&(floats[1]))); // visualizzerà 120.25
for (byte i = 0; i < 13; i++)
Serial.print((char)pgm_read_byte(&(message[i])));
// visualizzerà Hello!
}
La funzione principale per leggere dal programma è pgm_read_<type >. Possiamo usare questi 4:
- pgm_read_byte(data); - per il 1 byte (char, byte, int8_t, uint8_t).
- pgm_read_word(data); - per 2 byte (int, word, unsigned int, int16_t, int16_t).
- pgm_read_dword(data); - per 4 byte (long, unsigned long, int32_t, int32_t).
- pgm_read_float(data); - per i numeri in virgola mobile.
Attenzione! Quando si leggono numeri negativi (signed), è necessario eseguire il cast del tipo di dati. Esempio:
// сохраняем несколько целых с разными знаками
const int16_t ints[] PROGMEM = {65000, 32796, -16843};
void setup()
{
Serial.begin(9600);
Serial.println((int)pgm_read_word(&(ints[2]))); // visualizzerà
-16843
}
F()
La cosiddetta "macro F()" consente di archiviare stringhe nella memoria Flash senza occupare spazio nella SRAM. Funziona in modo molto semplice ed efficiente, permettendoti di realizzare un dispositivo con comunicazione/debug avanzata tramite la porta Seriale e non pensare ad una RAM intasata:
// questo output (stringa, testo) occupa 18 byte di RAM.
Serial.println("Hello <username>!");
// questo output non occupa nulla in RAM, grazie a F().
Serial.println(F("Type /help to help"));
Leggi di più su PROGMEM qui.