File di log con micropython su ESP8266

Quando si fanno delle prove con esp8266 collegato tramite porta usb è facile vedere l’andamento del programma perché basta la funzione print per mostrarne l’avanzamento e darci informazioni su cosa sta facendo.

Ma se il dispositivo deve funzionare con una batteria, potremmo aggiungere un display, ma dovremmo essere sempre li a guardare e comunque non avrebbe memoria di quello che è stato fatto.

Peggio ancora se il dispositivo si blocca o resta senza energia, come facciamo a sapere cosa è successo? La risposta è: un file di LOG, cioè un file su cui scriviamo tutto ciò che succede e che ci serve sapere e con cui possiamo ricostruire la sequenza che ha eseguito il programma e i valori che ha rilevato.

Usare i file di testo

Micropython supporta le funzioni per l’utilizzo dei file di testo, che sono la forma più comoda per conservare informazioni per rivederle in un secondo momento. Questo è un semplice esempio di come scrivere un file

f = open('log.txt', 'w')  
f.write('riga di log\n')
f.close()

Semplice vero, l’oggetto f è il nostro file chiamato log.txt (o qualsiasi nome volete dargli), quella W dopo il nome del file nella funzione open definisce come apriamo il file, in questo caso in scrittura (Write).

Al posto della lettera w, che crea il file al momento dell’apertura e se già esiste lo cancella prima di ricrearlo, possiamo utilizzare la lettera a (Append) per aprirlo in aggiunta, in questo caso se non esiste lo crea, se esiste aggiunge le informazioni in coda.

La funzione write scrive la stringa che riceve come parametro e la funzione close chiude il file, se ve la scordate i dati potrebbero non essere stati salvati.

Stringhe

Non ci si stanca mai a parlare di stringhe ma è importante sapere come utilizzarle, una stringa è una informazione di tipo alfanumerico, una sequenza di caratteri come una parola o una frase.

Per concatenare delle stringhe possiamo utilizzare il comando +; se ad esempio vogliamo scrivere sul file in nome di una variabile seguito dal suo valore possiamo scrivere f.write(‘nome_variabile ‘ + nome_variabile + ‘\n’)

Il primo nome variabile è fra apici e viene scritto così come è, il secondo viene sostituito dal suo valore e il \n finale aggiunge un a capo per migliorare la lettura del file.

Se la variabile non è una stringa bisogna convertirla utilizzando la funzione str(). f.write(‘sono_un_intero ‘ + str(sono_un_intero) + ‘\n’)

Timer – il tempo

Importante in un file di log è sapere quando si è generato un determinato evento per cui conviene sempre fare precedere il messaggio che scriviamo dall’orario in cui l’abbiamo scritto.

Per farlo possiamo utilizzare la funzione time.time() senza bisogno di importare unna, questa funzione ci restituisce i secondi passati dal momento di accensione del dispositivo. Immaginiamo di voler vedere quanto dura una batteria con il nostro esp8266, basta scrivere un messaggio di log ogni minuto e quando troviamo il nostro dispositivo spento andiamo a leggere il file di log e vedremo a quanti secondi ha scritto l’ultimo messaggio, quei secondi sono la durata della batteria.

Le funzioni

Non è opportuno riscrivere le istruzioni in vari punti del programma quando hanno la stessa funzione, in quel caso si scrive una funzione e la si richiama nei vari punti. Nel caso nostro dobbiamo aprire il file, scrivere il testo preceduto dal numero di secondi e chiudere il file.

Ricordatevi che dobbiamo chiudere il file ogni volta per non perdere i dati, si potrebbe usare anche la funzione flus() ma non l’ho trovata affidabile.

Una funzione la si definisce con def nome_funzione(parametri): (i due punti sono importanti in quanto fanno capire dove iniziano le istruzioni della funzione).

Le istruzioni della funzione vanno indentate per permettere di capire dove finiscono. Questo un esempio di un programma che ogni 10 secondi aggiorna il file di log.

def scrivilog(testo):
  f = open('log.txt', 'a')  
  f.write(str(time.time())+testo+'\n')
  f.close()
  print(str(time.time())+testo)
  
scrivilog('*** inizio programma ***')
while True:
  scrivilog('*** sono passati 10 secondi ***')      
  sleep(10)

Come vedete il programma inizia con la funzione scrivilog che si occupa di tutto, noi gli passiamo solo il testo da scrivere, i secondi e il ritorno a capo lo aggiunge la funzione.

Per leggere il file possiamo utilizzare l’ambiente di upycraft, basta posizionarsi sul file e utilizzare la funzione open, o possiamo usare questo semplice sorgente

print("inizio lettura ----------------------")
f=open("log.txt","r")
print(f.read())
f.close()
print("fine lettura ------------------------")

Devo dire che dopo un po’ di problemi trovati con la programmazione ho preso l’abitudine di utilizzare sempre i file di log quando scrivo e collaudo un programma, si rivelano sempre utili, basta ricordarsi di eliminare le istruzioni nella versione definitiva per evitare di riempire la memoria.

Maurizio

Lascia un commento