Il bus I2C e i relativi sensori.
La mia prima esperienza è stata con il sensore INA219 che effettuala misurazione della corrente di un carico.
Diciamo che per cominciare dobbiamo abilitare l'interfaccia I2C
raspi-config
e nel menù interfacce abilitare l'I2C.
riavviare
Poi installare i tools:
apt-get install i2c-tools
Ho fatto un po di ricerca per capire come fare a leggere i valori del sensore tramite il set dei comandi messi a disposizione da i2c-tools, ma non è stata fruttuosa.
Avrei voluto usare il sistema di interazione più a “basso livello” possibile, quindi con la shell bash, ma l'unica cosa utile che ho trovato è stato il sistema di installazione di alcune librerie python
Quindi installare il pyton-pip
apt-get install python-pip python-smbus
poi
pip install pi-ina219
Quindi in sostanza per poter usare questo sensore non ho avuto alternative che usare il python.
Attraverso un apposito script che poi metterò qui su questa esperienza è possibile leggere i valori e poi trattarli.
Il problema succcessivo è poi quello di visualizzare questi valori su di un browser.
Le prime prove molto interessanti sono state fatte con node-red, molto bello ma non è ancora chiaro come salvare il tutto in un futuro ambiente di lavoro quotidiano.
L'altra prova più “a basso livello” (che per me è più controllabile, anche perchè capisco meglio come funziona) è quella di far scrivere allo script python dei file con su i valori e poi questi saranno letti da una semplice pagina web aggiornata ogni secondo od ogni 2, 3 o altro.
Questa pagina web va a leggere, importare i valori non direttamente dal sensore o da una qualche script python ma dai file scritti dallo script python.
Questo script dovrà essere poi messo all'avvio tramite il meccanisco già usato dell'init.d
Di seguito un primo script di prova
from ina219 import INA219, DeviceRangeError from time import sleep SHUNT_OHMS = 0.1 MAX_EXPECTED_AMPS = 2.0 ina = INA219(SHUNT_OHMS, MAX_EXPECTED_AMPS) ina.configure(ina.RANGE_16V) def read_ina219(): try: print('Bus Voltage: {0:0.2f}V'.format(ina.voltage())) print('Bus Current: {0:0.2f}mA'.format(ina.current())) print('Power: {0:0.2f}mW'.format(ina.power())) print('Shunt Voltage: {0:0.2f}mV\n'.format(ina.shunt_voltage())) except DeviceRangeError as e: # Current out of device range with specified shunt resister print(e) while 1: read_ina219() sleep(1)
Di seguito lo stesso script modificato in modo tale da poter andare a scrivere continuamente in un altro file che poi sarà letto dalla pagina web esposta da apache
from ina219 import INA219, DeviceRangeError from time import sleep SHUNT_OHMS = 0.1 MAX_EXPECTED_AMPS = 2.0 ina = INA219(SHUNT_OHMS, MAX_EXPECTED_AMPS) ina.configure(ina.RANGE_16V) def read_ina219(): try: print('Bus Voltage: {0:0.2f}V'.format(ina.voltage())) print('Bus Current: {0:0.2f}mA'.format(ina.current())) print('Power: {0:0.2f}mW'.format(ina.power())) print('Shunt Voltage: {0:0.2f}mV\n'.format(ina.shunt_voltage())) out_file = open("/home/pi/wri", "w") out_file.write ('Shunt Voltage: {0:0.2f}mV\n'.format(ina.shunt_voltage())) #out_file.write(123ina.power()) out_file.close() except DeviceRangeError as e: # Current out of device range with specified shunt resister print(e) while 1: read_ina219() sleep(1)
Ora la pagina in php che si aggiorna automaticamente ogni 2 secondi e che va a leggere il file scritto continuamente dallo script di prima
<?php header("Refresh: 2; url=" . $_SERVER["PHP_SELF"]); echo "scrivo"; include ("/home/pi/wri"); echo "testo"; ?>
Ovviamente con questo sistema è possibile avere una pagina costantemente aggiornata con i dati e i valori di cui ho bisogno.