#Importazioni
from machine import ADC, Pin, I2C
from time import ticks_ms, ticks_diff, sleep_ms
from custom_library import show_msg, contraction_level, set_leds, send_to_shell
import ssd1306
#Configurazione
fs=10 #Frequenza di campionamento in Hz
Ts= int(1000/fs) #Periodo di campionamento in ms
#Configurazione dei Pin per il sensore FSR mediante ADC
FSR_PIN = 35
adc = ADC(Pin(FSR_PIN))
#Definizione dei Pin collegati ai Led
LED1_PIN = 26
LED2_PIN = 25
LED3_PIN = 33
LED4_PIN = 32
#Configurazione dei Pin come uscite deigitali
led1= Pin(LED1_PIN, Pin.OUT, value=0)
led2= Pin(LED2_PIN, Pin.OUT, value=0)
led3= Pin(LED3_PIN, Pin.OUT, value=0)
led4= Pin(LED4_PIN, Pin.out, value=0)
#Configurazione display Oled
#I2C sta per Inter-Integrated Circuit (I quadro C): utilizzo qiesto protoccolo perchè sfrutta
#2 fili ed è utlizzato tipicamente per sensori, Oled, RTC
I2C_SCL = 22
I2C_SDA = 21
OLED_LARGHEZZA= 128 #Il display ha 128 colonne di pixel in orizzontale
OLED_ALTEZZA= 64 #Il display ha 64 righe di pixel in verticale
i2c = I2C(0, scl=Pin(I2C_SCL), sda=Pin(I2C_SDA))
#Metto 0 poiche l'ESP32 ha al suo interno due circuiti fisici dedicati all'I2C
oled= ssd1306.SSD1306_I2C(OLED_LARGHEZZA, OLED_LUNGHEZZA, i2c)
#Sto usando uno scherm che funziona con il driver SSD1306 e comunica via I2C
#Con i2c gli passo la variabile creata prima
#Parametro MVC è la soglia di riferimento
MVC = 4000
treshold=5 #Soglia minima di attivazione (in percentuale)
#Loop
while true:
t0= ticks_ms() #Inizio della misura del tempo
#Lettura del valore corrente dal sensore FSR
raw=adc.read()
#Calcolo del livello di contrazione muscolare
perc = contraction_level(raw, MVC)
#Visualizzazione sulla shell di Thonny
send_to_shell(raw, int(perc))
#Visualizzazione sul display Oled
show_msg(oled, "Livello di contrazione:", "{:.1f}%".format(perc), level)
#Accensione dei led
level = set_leds(perc, threshold, led1, led2, led3, led4)
#Calcolo del tempo di elaborazione trascorso dall'inizio del ciclo (t0)
elapsed = ticks_diff(ticks_ms(), t0)
#Verifica della necessità di aspettare acnora
delay = Ts - elapsed
#Controllo
if delay > 0:
#Ritardo del ciclo per rispettare il refresh dovuto
sleep_ms(int(delay))