'''Simulare in Wokwi un sensore di temperatura basato su termistore NTC
opportunamente interfacciato alla board ESP32.
1. Aggiornare il valore periodicamente solo mentre si tiene premuto un tasto.
2. Aggiungere un led che lampeggia una volta ad ogni nuovo valore mostrato.
3. Aggiungere una scritta sul display che indichi all'utente di premere il pulsante
e stampare sul display il valore della temperatura misurata.'''
'''NOTE:
• Non esiste in Wokwi il ‘semplice’ termistore.
• Il componente ‘Analog Temperature Sensor (NTC) è quello che più si avvicina
alle specifiche richieste ed è composto da un termistore in serie ad una
resistenza Rs. --->PARTITORE DI TENSIONE!!!
➢ Il termistore è collegato al GND, Rs al pin Vcc
➢ Il termistore è caratterizzato da β = 3950 K, T0 = 25 °C, R0 = 10 kΩ
➢ La resistenza Rs posta in serie è uguale a 10 kΩ'''
from machine import Pin, ADC, I2C
from math import log #logaritmo naturale
from time import sleep
import ssd1306
B=3950 #temperatura caratteristica espressa in Kelvin
T0=298.15 #temperatura di riferimento in Kelvin
R0=10e3 #resistenza alla temperatura di riferimento
Rs=10e3 #resistenza in serie
'''DA KELVIN A CELSIUS -273.15 !!!'''
#Il termistore legge la temperatura del corpo ma restituisce un valore digitale,
#per poterlo utilizzare lo convertiamo tramite l'ADC
sensor=ADC(13) #pin configurato
button=Pin(12, Pin.IN)
led=Pin(33, Pin.OUT)
i2c=I2C(0)
display=ssd1306.SSD1306_I2C(128, 64, i2c)
def init_display():
display.fill(0)
display.text('Temperature', 20, 0, 1) #20 pixel da sx e 0 dall'alto
display.text('Sensor', 40, 8, 1) #niente spazio di leading
display.text('_______________________', 1, 16, 1) #1 pixel da sx e niente leading
display.text('Push the button', 5, 32, 1) #5 pixel da sx e 8 pixel di leading
while True:
if button.value()==1: #controllo se il pulsante è premuto
d_val=sensor.read() #lettura del valore, ADCout
#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
Vm=d_val*3.3/4095
print("Valore digitale:", d_val, "Valore analogico:", Vm, "V")
'''Il termistore è un sensore di temperatura, come la otteniamo?
A partire dalla tensione misurata Vm sfruttiamo il partitore di
tensione per ricavare la resistenza che comprare nella relazione
caratteristica del termistore R-T: R=R0*e^β(1/T-1/T0). Risolvendola
poi considerando come incognita T troviamo la temperatura!'''
ln=log(Vm/(3.3-Vm))
T_k=1/ (1/T0 + ln/B)
T_c=T_k-273.15
#Lampeggio del LED ad ogni valore mostrato
led.value(1) #accensione
sleep(0.2) #ritardo
led.value(0) #spegnimeto
sleep(0.8) #ritardo
print("La temperatura misurata è:", T_c, "°C")
print()
'''Se non cancelliamo quello che sta scritto sul display e con .text()
creiamo un nuvo testo nello stesso punto del precedente, questi si sovrappongono!
Ci serve anche il testo precedente perciò scriviamo sotto.'''
init_display()
display.text('T = '+str(round(T_c,2))+' C', 25, 50, 1)
#con str convertiamo il valore della variabile T_c in una stringa
#round arrotonda
display.show()
sleep(1) #acquisisci un nuovo dato ogni secondo
else:
led.value(0)
init_display() #chiamata della funzione per definire il display
display.show()