Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Il numero dei caratteri massimo che sarà inviato di volta in volta sulla seriale */
- #define BUFFER_SIZE 100
- /*
- * Se usi ESP8266, puoi evitare in quanto implementa direttamente Serial.printf()
- * Per un utilizzo più generico è necessaro un buffer che conterrà la stringa di testo da inviare.
- */
- char txBuffer[BUFFER_SIZE];
- unsigned int cont = 0;
- int T1 = 150;
- int T2 = 360;
- /*
- * L'implementazione di printf (e di tutte le funzioni derivate) non supporta i float
- * per risparmiare RAM, ma si risolve brillantemente con variabili int ed un po' di matematica
- */
- float T3 = 15.8;
- void setup() {
- Serial.begin(115200);
- }
- void loop() {
- cont++;
- /* Prepariamo la stringa. Per l'elenco completo dei codici di formattazione
- * (%d, %u etc etc) fai riferimento ai manuali del C++ come ad esempio qui
- * http://www.cplusplus.com/reference/cstdio/printf/
- * Puoi usare anche i caratteri non stampabili come New Line \n, oppure TAB \t etc etc
- */
- Serial.println();
- Serial.println();
- Serial.println("Esempio sprintf");
- sprintf(txBuffer, "Contatore: %u \tVariabile T1: %d \tVariabile T2: %d\n", cont, T1, T2);
- Serial.println(txBuffer);
- /*
- * Per un utilizzo più "sicuro" a volte è preferibile usare snprintf() perché nel caso in cui
- * la stringa superi la dimensione del buffer non succede nulla di strano. I caratteri vengono
- * semplicemente ignorati (con sprintf invece no, l'ESP8266 ad esempio potrebbe anche resettarsi).
- *
- * Non cambia nulla ad eccezione che bisogna specificare anche la lunghezza del buffer
- */
- Serial.println("Esempio snprintf 1");
- snprintf(txBuffer, BUFFER_SIZE, "Contatore: %u \tDifferenza T2-T1: %d\n", cont, T2 - T1);
- Serial.println(txBuffer);
- // Oppure in questo modo più "generico"
- Serial.println("Esempio snprintf 2");
- snprintf(txBuffer, sizeof(txBuffer), "Contatore: %u \tSomma T1+T2: %d\n", cont, T1 + T2);
- Serial.println(txBuffer);
- /* Il discordo per i float si fa leggermente più complicato, ma nulla di trascendentale.
- * In questo esempio definiamo anche che il testo dovrà avere una lunghezza fissa ed il
- * cosiddetto "padding zero" ovvero lo zero davanti anche nel caso in cui non sia necessario
- * al fine di rispettare la larghezza imposta. Per quanto riguarda la parte frazionaria la otteniamo
- * con una semplice moltiplicazione ed un modulo. Se basta 1 cifra decimale (var * 10)%10
- * E' necessario fare il casting della variabile flot ad int.
- */
- Serial.println("Esempio variabile float");
- sprintf(txBuffer, "Variabile T3 float: %03d,%d °C\n", (int)T3, (int)(T3 * 100)%100, (char)223);
- Serial.println(txBuffer);
- /*
- * Se usi questa tecnica con display LCD (utilissima per gestire il numero di caratteri fisso e predefinito)
- * spesso il carattere "°" non è direttamente supportato dal display come testo semplice ed allora puoi passare
- * direttamente il valore corrispondente cosi come da tabella caratteri che trovi nel datasheet del controller (di solito HD44780)
- *
- * sprintf(txBuffer, "Variabile T3: %03d.%d %cC\n", (int)T3, (int)(T3 * 10.0)%10, (char)223);
- * lcd.print(txBuffer);
- */
- delay(5000);
- }
Add Comment
Please, Sign In to add comment