Développement mesure de cuve

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')

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *