'''Simulare in Wokwi un sensore ad ultrasuoni per la misurazione della
distanza da un oggetto.
1. Aggiornare periodicamente il valore di distanza misurato.
2. Visualizzare in tempo reale la distanza misurata su un display.
3. Accendere un LED se la distanza è al di sotto di un valore scelto.'''
from machine import time_pulse_us, Pin, I2C
from time import sleep_us, sleep
import ssd1306 #PER L'UTILIZZO DEL DISPLAY
trigger=Pin(27, Pin.OUT)
#trigger è un pin di input per il sensore e di output per la scheda
echo=Pin(26, Pin.IN)
#echo è un pin di output per il sensore e di input per la scheda
led=Pin(32, Pin.OUT)
velocità=340 #velocità del suono in m/s
i2c=I2C(0)
display=ssd1306.SSD1306_I2C(128, 64, i2c)
def display_init(): #funzione per inizializzare il display
display.fill(0)
display.text('Sensore ad', 25, 0, 1) #25 pixel da sx e 0 dall'alto
display.text('ultrasuoni', 25, 10, 1) #25 pixel da sx e 10 dall'alto
while True:
'''Per avviare la misurazione della distanza è sufficiente fornire un
breve impulso per 10 microsecondi in ingresso al pin di trigger, quindi
verrà inviato un burst di ultrasuoni di 8 cicli a 40 kHz (frequenza più
bassa rispetto a quella delle onde usate per l'ecografia) appena il
trigger viene riportato al valore basso. In corrispondenza dell'emissione
delle onde il pin collegato a echo assume valore 1 mentre quando l'eco del
segnale viene ricevuto dalla sorgente il pin va a 0.
Cosa vuol dire? Per conoscere il tempo impegato dall'onda a percorrere due
volte la distanza tra oggetto e sorgente (in andata e ritorno) dobbiamo
misurare per quanto tempo echo resta ad 1, ciò lo facciamo tramite la
funzione time_pulse_us (microsecondi).'''
'''NOTA, l'alimentazione per il sensore deve essere di 5V e la corrente
massima tollerata è 15 mA!!!'''
led.value(0)
trigger.value(1)
sleep_us(10) #segnale trigger alto per 10 microsecondi, impulso fornito
trigger.value(0) #segnale trigger basso, emissione dell'onda
hltime=time_pulse_us(echo, 1) #controllo per quanto tempo echo è alto
#alla funzione dobbiamo passare il nome del pin e il valore (0/1) per
#il quale effettuare il controllo
#hltime sta per high level time
distanza=((hltime/1e6)*velocità)/2 #ricorda, andata e ritorno
#divido hltime per 10^6 perchè da microsecondi passo in secondi
#in modo date da trovarmi con l'unità di misura della velocità
print("La distanza misurata è:", distanza, "m")
display_init()#chiamata della funzione
display.text('D:'+str(round(distanza,2))+' m', 35, 30, 1)
display.show()
display.fill(0)
if distanza <1: #distanza minore di 1 metro
led.value(1)
sleep(0.5)
else:
led.value(0)
sleep(3) #aggiornamento periodico