from machine import Pin, ADC, I2C
from machine import time_pulse_us #serve per misurare la durata dell'impulso echo
from time import sleep_us, sleep #gestione secondi e microsecondi
from math import log
import ssd1306
led = Pin(22, Pin.OUT)
button = Pin(12, Pin.IN, Pin.PULL_DOWN)
button2 = Pin(14, Pin.IN, Pin.PULLDOWN)
i=0 #variabile di stato per il ciclo, se è 0 il programma corre, se è 1 si mette in pausa
distance=400 #valore iniziale della distanza (limite massimo del sensore HC.SR04)
trig = Pin(33, Pin.OUT) #invia l'impulso ultrasuoni
echo = Pin(32, Pin.IN) #riceve l'impulso di ritorno
i2c = I2C(0)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
print('Start!')
while True:
if button.value()==1: #se il bottone è premuto aspetta 4 secondi per poi avviare la misurazione
sleep(4)
i=0 #avvio del programma
while i==0:
if button2.value()==1: #se anche il secondo bottone è premuto
display.fill(0)
dist_prec = 60 #punto di partenza verticale per la linea (60, perchè lo schermo è 64px, quindi parte quasi dal fondo)
for x in range (0,126,3): #avvia un ciclo che sposta un punto sull'asse orizzontale da 0 a 126, avanzando di 3px alla volta
#3 è il passo, più è piccolo più il grafico è dettagliato
if distance<=20: #se la distanza è troppo vicina accende un led d'allarme
led.value(1)
else:
led.value(0)
trig.value(0) #assicura che il pin Trig sia spento
sleep_us(1) #brevissima pausa di stabilizzazione
trig.value(1) #accende il Trigger, quindi spara l'impulso
sleep_us(10) #lo tiene acceso per 10microsecondi
trig.value(0) #spegne il trigger
high_level_time = time_pulse_us(echo, 1) #cronometra quanto tempo il pin Echo resta alto
distance = (high_level_time*340)/2 #calcola la distanza (velocità dal suono* tempo/2) -> /2 perchè vogliamo sapere solo la distanza di andata
distance = distance/10000 #converte il risultato in cm
print('Distanza rilevata al pixel ', str(x), ': ', str(round(distance, 0)), 'cm')
dist_curr = (int(distance))*3 #converte i centimetri in pixel
display.line(x, dist_prec, x+3, dist_curr, 1) #disegna una linea tra il punto vecchio e il punto nuovo
display.show()
dist_prec = dist_curr #aggiorna le varibili, nel ciclo successivo la dist_prec sarà l'attuale dist_curr
sleep(0.5)
if x==123: #se x arriva a 123 pixel il profilo è completo
print('Profilo completato!')
sleep(5)
elif button.value()==1: #se mentre lavoriamo premiamo di nuovo il primo pulsante la misurazione viene bloccata
i=1
print('Sensore in pausa!')
sleep(3) #mostra il grafico 3secondi prima di cancellarlo
display.fill(0)
display.show()
else:
trig.value(0)
sleep_us(1)
trig.value(1)
sleep_us(10)
trig.value(0)
high_level_time = time_pulse_us(echo, 1)
distance = (high_level_time*340)/2
distance = distance/10000
if distance <=20:
led.value(1)
else:
led.value(0)
print('Distanza dal sensore: ', str(round(distance, 0)), 'cm')
display.fill(0)
display.text('Dist = ' +str(round(distance, 1))+ 'cm', 10, 32, 1)
display.show()
sleep(0.5)
led.value(0)