Arduino: Lettore universale di API

Con questo articolo vorrei mostrarvi i rudimenti per visualizzare su display i risultati di qualsiasi API-REST.

In particolare la visualizzazione delle API Weather di Salvatore Serafino.

Il codice è quasi identico  a quello per la bacheca elettronica “tuco”, per questo motivo credo che modificando opportunamente il firmware possiamo dire che è “universale”.

Il problema del buffer:

Risposte GET molto grandi (molti caratteri) implicano l’uso di buffer molto grandi che manderebbero in overflow il microcontroller senza visualizzare nulla (se ci va bene!).

In questo caso la risposta è memorizzata in un buffer poco più grande di 305 char.

305 char sono 305byte in memoria  (cira 0.3kb).

Sarebbe stato un lavoro più pulito se avessi utilizzato librerie che gestiscono file json; per arduino ho trovato questa: https://github.com/interactive-matter/aJson

Le domande da porci ogni volta sono:

Vale davvero la pena immergere nel proprio binario un’altra libreria a scapito della memoria flash?

Quanta ram avrebbe utilizzato?

La RAM dell’atmega328 (arduino uno/duemilanove) è da 2kb (due cappa, non otto giga!), utilizzata non solo per il buffer…

Seppur il codice viene ottimizzato dal compilatore avr-gcc è buona norma non affaticare il controller che lavoro a soli 16MHz (mega non giga! “single core”!).

Infatti è raro trovare codici che fanno uso di allocazione dinamica, strutture dati complesse ed oggetti avanzati: la StandardTemplateLibrary è ridotta all’osso.

La memoria flash è di soli 32Kb, ed è consigliabile non includere troppe librerie.

Questo codice porta via circa 19kb di flash memory.

Per arginare questi problemi bisogna demandare il carico di lavoro al server.

L’ideale sarebbe: tante GET ben parametrizzate che restituiscono piccole informazione per piccoli buffer.

Ecco perché le api dovrebbero essere ben parametrizzare per restituire poca roba!

Dopo questa piccola premessa analizziamo tutte le fasi della produzione:

HW:

L’hardware che ho usato è sempre lo stesso: router, ethernet shield, arduino duemilanove e un lcd 16×2 seriale.

Questa volta ho utilizzato un lcd più piccolino ma con meno ingombro di cavetterie: solo 4 fili!

Per la precisione vengono utilizzati due cavi (data e clock) per il bus seriale i2c e due cavi per l’alimentazione (+5v e gnd).

Non è il massimo per la lettura ma per la prototipazione rapida è un must.

Documentazione e wiring: http://learn.adafruit.com/i2c-spi-lcd-backpack

Librerie extra:

Per pilotare il convertitore seriale-i2c ho utilizzato la libreria LiquidCrystal ottimizzata da Adafruit: https://github.com/adafruit/LiquidCrystal

Inizializzazione:

viene fatta nella void function setup() e consiste nell’invocazione dei seguenti metodi:

lcd.begin(16, 2); //inizializzazione del display 16x2
Serial.begin(9600);//inizializzazione della porta seriale a 9600baud
Ethernet.begin(mac);//inizializzazione della scheda Ethernet con il proprio mac

La struttura del loop():

myConnect() connessione al server
esecuzione del comando GET
parse() lettura e memorizzazione della risposta in un buffer
disconnect() disconnessione dal server
stampa() parsing del buffer
stampa del buffer su lcd

 

 

 

 

Demando tutti i dettagli implementativi nei commenti del codice.

Codice:

Api-Photo-courtesy-mammedomani.it_

Video:

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.