És probable que en alguns casos ens convingui guardar dades en un fitxer per poder-les llegir en un altre moment. Un exemple seria guardar la puntuació més alta assolida fins al moment.
Amb CircuitPithon podem recollir dades i guardar-les en un fitxer de text. Cal, però, tenir en compte que l'accés al directori CIRCUITPY no es pot fer simultàniament des de l'ordinador i des del programa. Per solucionar el problema bloquejarem l'accés al directori de manera que només s'hi pugui accedir des del programa. Però en alguna ocasió voldrem desbloquejar el directori per poder modificar el programa o llegir el fitxer des de l'ordinador. Això ho gestionarem des d'un programa especial que s'anomena boot.py.
El programa boot.py s'executa només després d'un reinici del microcontrolador (botó de reinici o nova connexió de l'alimentació) i no s'executa si es guarda una nova versió del programa o si es fa Control-D des de Mu. Quan s'executa el programa boot.py, es crea un fitxer anomenat boot_out.txt en el que s'hi guardarà el resultat de l'execució; això ens serà útil per saber si aquest programa té algun error.
El nostre programa boot.py funcionarà com comentem a continuació. Si quan es reinicia el microcontrolador hi ha algun polsador premut, se'ns encendrà el NeoPixel de color vermell durant un parell de segons i el sistema quedarà llest per programar o modificar el contingut des de l'ordinador. Si, en canvi quan es reinicia el microcontrolador no hi ha cap polsador premut, se'ns encendrà el NeoPixel de color verd durant un parell de segons i el sistema quedarà preparat per al funcionament normal.
Cada vegada que canviem el mode serà necessàri fer un reinici del microcontrolador després de canvia la posició del commutador. No oblidem, però, que cal extreure la unitat abans de fer el reinici.
El programa boot.py serà el següent:
import board import storage import neopixel import ugame import time
# Objecte per als NeoPixels cadena = neopixel.NeoPixel(board.NEOPIXEL, 5, brightness=0.1)
time.sleep(1) # Pausa
boto = ugame.buttons.get_pressed() # Llegeix els botons
if boto > 0:
cadena[0] = (255, 0, 0) # Vermell
valor = True # Permetem programar
else:
cadena[0] = (0, 255, 0) # Verd
valor = False # Permetem guardar dades
time.sleep(2) # Pausa per veure el color del NeoPixel
storage.remount("/", valor)
Quan acabi d'executar-se aquest programa s'executarà el programa code.py que serà el nostre programa principal. Per fer un exemple senzill, hem fet un programa que està estructurat en tres fases. A la primera fase s'intenta llegir el fitxer per obtenir el valor guardat, que correspondrà a un comptador. Si no es troba el fitxer o està buit, posarem el comptador a zero. A la segona fase l'usuari pot incrementar o decrementar el comptador (sense arribar a valors negatius) fent servir els polsadors UP i DOWN. Si es prem el polsador START els valors es guarden al fitxer. El programa serà el següent:
import board import ugame import digitalio
abans = 0
# Primer mirem si hi ha el fitxer i llegim el valor guardat
try:
with open("/valors.txt", "r") as fitxer:
# Posem "r" per llegir
# Si hi es, llegim el valor
val = fitxer.read()
if val == "":
# Si no hi ha valor, el posem al valor inicial
valor = 0
else:
valor = int(val) # Ho convertim a enter
fitxer.close()
except:
# Si no hi ha fitxer, el posem al valor inicial
valor = 0
print(str(valor))
# Nucli del programa
# Deixem que l'usuari canvii el valor
while True:
boto = ugame.buttons.get_pressed() # Llegeix els botons
if not abans & ugame.K_DOWN and boto & ugame.K_DOWN:
if valor > 0:
valor = valor - 1
print(str(valor))
if not abans & ugame.K_UP and boto & ugame.K_UP:
valor = valor + 1
print(str(valor))
if not abans & ugame.K_START and boto & ugame.K_START:
# El boto START es per guardar el valor
try:
with open("/valors.txt", "w") as fitxer:
# Posem "w" per sobrescriure
# Posariem "a" per afegir
val = str(valor)
fitxer.write(val)
fitxer.close()
except:
print("Error a l'escriure")
abans = boto
Pot succeir que el programa boot.py tingui alguna errada i ens deixi la placa en un estat que no permeti l'escriptura des de l'ordinador. Això ens impediria fer qualsevol programa nou. En cas que això ens passi, hi ha una forma de solucionar-ho. Amb el que explicarem a continuació, s'esborra completament el directori CIRCUITPY; però millor això que haver de llençar la placa.
Per esborrar el contingut del directori CIRCUITPY, anirem a la consola del Mu (botó Seriado, REPL) i allà escriurem les següents dues línies:
import storage storage.erase_filesystem()
prement la tecla Enter després de cada una.

Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.