Il notebook mostra come usare \(\texttt{Analog Discovery 2}\) per instaurare una connessione seriale di tipo \(\texttt{I2C}\).
In questo caso lo script comunica con il sensore \(\texttt{LPS331AP}\) e utilizza i seguenti registri:
0x20 registro di configurazione generale per accendere (!) e impostare i parametri di misura
0x2B registro di lettura del LSB della Temperatura
Interpretazione della lettura. Il sensore risponde con 2 bytes che codificano la temperatura. I due bytes vengono entrambe codificati come un uint16 che chiameremo utemp. La conversione finale richiede
temp = 42.5 + utemp/480
Lettura della pressione. può essere implementata in modo analogo, cercando il registro giusto e la conversione corretta
Qualche accortezza. Ricordiamo che il sensore fornisce i necessari {} per il corretto funzionamento dell’interfaccia I2C, quindi è fondamentale che il sensore sia alimentato altrimenti l’avvio del bus I2C darà un errore.
Code
import tdwfimport matplotlibmatplotlib.use('TkAgg')import matplotlib.pyplot as plt import time# -[LPS331AP - Qualche registro]---------------------------------------------------WHO_AM_I =0x0FCTRL_REG1 =0x20STATUS_REG =0x27TEMP_OUT_L =0x2BTEMP_OUT_H =0x2CSAD =0x5dPRESS_OUT_H =0x2APRESS_OUT_L =0x29PRESS_OUT_XL =0x28# -[Configurazione AD2]---------------------------------------------------------# 1. Connessiene con AD2 e selezione configurazionead2 = tdwf.AD2()# 2. Configurazione alimentazionead2.vdd =3.3ad2.power(True)# 3. Impostazione bus I2Ci2c = tdwf.I2Cbus(ad2.hdwf) # default 100kHz, SCL = D00, SDA = D01# 4. Apre la comunicazione I2C come Mastersht = tdwf.I2Cdevice(ad2.hdwf,SAD)# -[Configurazione sensore]------------------------------------------------------sht.write([CTRL_REG1,0x07]) # Seleziona registrosht.write([CTRL_REG1,0xF0]) # Seleziona registro# -[Funzioni di gestione eventi]-----------------------------------------------def on_close(event):global flag_run flag_run =Falsedef on_key(event):global flag_runif event.key =='escape': # termina programma flag_run =False# -[Ciclo di misura]-----------------------------------------------------------# 1. Creazione figura e link agli eventifig, ax = plt.subplots(figsize=(12,6))fig.canvas.mpl_connect("close_event", on_close)fig.canvas.mpl_connect("key_press_event", on_key)# 2. Inizializzazione variabiliTTv = []PPv = []mytime = []flag_first =Trueflag_run =Truestart_time = time.time()# 3. Ciclo di misurawhile flag_run: time.sleep(0.2) sht.write(TEMP_OUT_L+0x80) # scrive un registro (con autoincremento) sht.read(2) # legge 2 bytes# Complemento a due TT = sht.vals[0] +256.0*sht.vals[1]print(sht.vals[0])if TT >=0x8000: TT = TT-0x10000 rTT =42.5+TT/480# Conversione temperatura TTv.append(rTT)print(f"T = {rTT:.2f}C") mytime.append(time.time()-start_time) mytime = mytimeif flag_first: flag_first =False hp1, = plt.plot(mytime, TTv, "o", color="tab:orange") plt.grid(True) plt.ylabel("Temperature [C]") plt.xlabel("Time [s]") plt.title("Press ESC to exit") plt.show(block=False) plt.tight_layout()else: hp1.set_ydata(TTv) hp1.set_xdata(mytime) ax.relim() ax.autoscale_view() fig.canvas.draw() fig.canvas.flush_events() # ---------------------------------------#plt.close(fig)ad2.close()