from machine import Pin, ADC, I2C
from time import sleep
import ssd1306
i2c=I2C(0) #Creazione dell'oggetto i2c, interfaccia
#Inizializzazione del display OLED
display=ssd1306.SSD1306_I2C(128, 64, i2c)
#Inizializzione i pin per i LED
led_verde=Pin(25, Pin.OUT) #Pin per il sensore sinistro
led_giallo=Pin(26, Pin.OUT) #Pin per il sensore destro
#Configurazione dell'ADC con i pin
sensor_dx= ADC(35)
sensor_sx= ADC(32)
#Attenuazione di 11dB per controllare il range di tensione che l'ADC può misurare
sensor_dx.atten(ADC.ATTN_11DB)
sensor_sx.atten(ADC.ATTN_11DB)
def get_weight(T): #funzione per stimare il peso esercitato sul sensore
if 0.75<T<3.6: #T è la tensione letta dall'ADC
weight=(T-3.89)/(-0.017) #prima retta di calibrazione, peso inferiore ai 225 gr
elif 0<T<0.75:
weight=(T-0.81)/(-0.0007) #seconda retta di calibrazione, peso superiore ai 200 gr
else:
weight=0 #fuori dal range di calibrazione
return weight
while True:
display.fill(0)
#Lettura dei valori digitali dall'ADC per entrambi i sensori
digital_value_dx=sensor_dx.read()
digital_value_sx=sensor_sx.read()
#Conversione dei valori digitali in valori di tensione analogica
analog_value_dx=digital_value_dx*3.6/4095 #tensione di riferimento 3.6
analog_value_sx=digital_value_sx*3.6/4095
print('Tensione di destra', analog_value_dx, 'V')
print('Tensione di sinistra', analog_value_sx, 'V')
#Se non viene esercitata pressione entrambi i ledi sono spenti
if analog_value_dx==3.6 and analog_value_sx==3.6:
#pressione nulla, tensione massima (diminuisce con la pressione)
led_verde.value(0)
led_giallo.value(0)
#Al contrario, controlliamo in che modo viene applicata la pressione
elif abs(analog_value_dx-analog_value_sx)<0.5: #soglia massima per la differenza tra le tensioni
#Se la differenza di carico è inferiore ad una soglia scelta si accendono entrambi i led
led_verde.value(1)
led_giallo.value(1)
peso_dx=get_weight(analog_value_dx)
peso_sx=get_weight(analog_value_sx)
display.text('Postura', 33, 0, 1)
display.text('equilibrata', 20, 10, 1)
display.text('Carico a dx', 20, 22, 1)
display.text(str(round(peso_dx,2))+' gr', 25, 32, 1)
display.text('Carico a sx', 20, 44, 1)
display.text(str(round(peso_sx,2))+' gr', 25, 54, 1)
elif analog_value_dx<analog_value_sx: #carico sbilanciato verso destra
led_giallo.value(1)
led_verde.value(0)
display.text('Postura', 33, 0, 1)
display.text('sbilanciata',20, 10,1)
display.text('verso destra', 14, 20, 1)
peso_dx=get_weight(analog_value_dx)
display.text('Carico', 32, 32, 1)
display.text(str(round(peso_dx,2))+' gr', 25, 42, 1)
else:
led_giallo.value(0) #carico sbilanciato verso sinistra
led_verde.value(1)
display.text('Postura', 33, 0, 1)
display.text('sbilanciata',20, 10,1)
display.text('verso sinistra', 13, 20, 1)
peso_sx=get_weight(analog_value_sx)
display.text('Carico', 32, 32, 1)
display.text(str(round(peso_sx,2))+' gr', 25, 42, 1)
display.show()
sleep(10) #Attesa di 10s prima di effettuare una nuova lettura