from machine import Pin, ADC, I2C
from math import log
from time import sleep
import ssd1306 #Moduto per il display
B = 3950 #Temperatura caratteristica espressa in Kelvin
T0 = 298.15 #Temperatura di riferimento in Kelvin
R0 = 10e3 #Resistenza alla temperatura di riferimento, 10000
sensor = ADC(35) #Configurazione dell'ADC con il pin 35
led_rosso = Pin(23,Pin.OUT)
led_verde = Pin(32,Pin.OUT)
button = Pin(25,Pin.IN)
sensor.atten(ADC.ATTN_11DB) #Attenuazione di 11 dB per controllare il range di
#tensione che l'ADC può misurare
i2c = I2C(0) #Creazione dell'oggetto i2c, interfacia
display = ssd1306.SSD1306_I2C(128, 64, i2c) #Inizializzazione del display OLED
def init_display(): #Funzione per definire il display
display.fill(0) #Spegnimento di tutti i pixel
display.text("Sensore di",25, 0, 1)
display.text("Temperatura", 15, 10, 1)
display.text("Premi il bottone", 0, 20, 1)
while True:
if button.value()==1: #Controllo avvenuta pressione del pulsante
digital_value = sensor.read() #Lettura del valore fornito in ingresso al pin
analog_value = digital_value*3.6/4095 #Conversione del valore digitale attraverso la formula
#Vm=ACDout*Vref/((2^k)-1),
#la scheda ESP32 ha una risoluzione a 12 bit, perciò (2^12)-1=4095
#Calcolo della temperatura in funzione della tensione misurata:
ln=log(analog_value/(3.6-analog_value))
T_k=1/((1/T0)+(1/B)*ln) #Temperatura espressa in Kelvin
T_c=T_k-273.15 #Temperatura espressa in Celsius
print('Valore digitale:', digital_value, 'Valore analogico:', analog_value, 'V')
print("La temperatura misurata è:", T_c, "°C")
print("Tempo di risposta:", response_time, 'millisecondi')
print() #Rigo vuoto tra le diverse stampe
#Uso degl indicatori visivi: se la temperatura è superiore a 36.5 °C
#si accende il led rosso, altrimenti si accende il led verde
if T_c>36.5 :
led_rosso.value(1)
led_verde.value(0)
else :
led_rosso.value(0)
led_verde.value(1)
init_display() #Chiamata della funzione
#Stampa sul dispaly OLED della temperatura misurata:
#con str convertiamo il valore della variabile T_c in una stringa mentre con
#round arrotondiamo il valore alla seconda cifra decimale. Le ultime due righe permettono
#di mostrare le informazioni sul display per 10 secondi
display.text('T = '+str(round(T_c,2))+' C', 25, 50, 1)
display.show()
sleep(10)
else:
#Se il pulsante non è premuto si visualizza sul display sempre la stessa scritta iniziale
#ed entrambi i led sono spenti
init_display()
led_verde.value(0)
led_rosso.value(0)
display.show()