Finalisation du programme et du code de calcul de la hauteur de cuve. Testé et fonctionnel avec quelques vérifications supplémentaire et apport de condition pour éviter les bugs
Formule finale adapté de gblanc.fr
Moitié basse, quand h<R

Moitié haute, quand h>R

Pour la mesure de la distance, connaissant la vitesse du son, penser à diviser par 2 la distance pour tenir compte du temps d’aller-retour que l’on supposera identique

Code final, main.py
import rp2
import network
import ubinascii
import machine
import urequests as requests
import time
from secrets import secrets
import socket
from machine import Pin
import math
rp2.country('FR')
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)
ssid = secrets['ssid']
pw = secrets['pw']
wlan.connect(ssid, pw)
timeout = 10
while timeout > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
timeout -= 1
print('Waiting for connection...')
time.sleep(1)
def blink_onboard_led(num_blinks):
led = machine.Pin('LED', machine.Pin.OUT)
for i in range(num_blinks):
led.on()
time.sleep(.2)
led.off()
time.sleep(.2)
wlan_status = wlan.status()
blink_onboard_led(wlan_status)
if wlan_status != 3:
raise RuntimeError('Wi-Fi connection failed')
else:
print('Connected')
status = wlan.ifconfig()
print('ip = ' + status[0])
print('mask = ' + status[1])
print('gateway = ' + status[2])
print('DNS = ' + status[3])
def get_html(html_name):
with open(html_name, 'r') as file:
html = file.read()
return html
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('Listening on', addr)
led = machine.Pin('LED', machine.Pin.OUT)
while True:
try:
cl, addr = s.accept()
print('Client connected from', addr)
r = cl.recv(1024)
# print(r)
r = str(r)
###SENSOR MESURE START
trig = Pin(17, Pin.OUT)
echo = Pin(16, Pin.IN, Pin.PULL_DOWN)
trig.value(0)
time.sleep(0.1)
trig.value(1)
time.sleep_us(2)
trig.value(0)
while echo.value()==0:
pulse_start = time.ticks_us()
while echo.value()==1:
pulse_end = time.ticks_us()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17165 / 1000000
distance = round(distance, 4) /100
print ('Distance:',"{:.4f}".format(distance),'m')
distanceString = str("{:.4f}".format(distance))
time.sleep(1)
###SENSOR MESURE END
pageResponse = '{ \"distance\" : \"',distanceString,'\" }'
cl.send('HTTP/1.0 200 OK\r\nContent-type: application/json\r\n\r\n')
cl.send("{")
cl.send('\"hauteur\" : { \"mesure\" : \"')
cl.send(distanceString)
cl.send('\" , \"units\" : \"m\"}')
#Volume max de la cuve en m3
Vmax = 5
#longeur de la cuve
L=2.75
#Rayon de la cuve
R=0.76
#hauteur du capteur par rapport au fond de la cuve
Hcapteur=2
#hauteur de la cuve
h = Hcapteur-distance
print ('hauteur eau:',"{:.4f}".format(h),'m')
#Calcul du volume
if (R <= h and 2*R>=h):
V = L * R * R * (math.acos(1-(h/R))-(1-h/R)*math.sqrt(h/R*(2-h/R)))
elif (R > h and 2*R>=h):
V = L * R * R * (math.pi-math.acos((h/R)-1)+(h/R-1)*math.sqrt(h/R*(2-h/R)))
else:
V = -1
print ('Volume:',"{:.4f}".format(V),'m3')
cl.send(', \"volume\" : { \"compute\": \"')
cl.send(str("{:.4f}".format(V)))
cl.send('\", \"units\" : \"m3\"}')
cl.send(', \"filling\" : { \"compute\": \"')
cl.send(str("{:.4f}".format(V/Vmax)))
cl.send('\", \"units\" : \"%\"}')
cl.send("}")
cl.close()
except OSError as e:
cl.close()
s.close()
print('Connection closed')