HC-SR04超音波模組&網頁顯示


HC-SR04超音波模組&網頁顯示

tags: micropython, ‘hc-sr04’

超音波模組測試參考-https://blairan-esp32-micropython.blogspot.com/2021/07/blog-post.html

基於以上的基本測試,加入WiFi網頁伺服器即可顯示於網頁

接線

————————–    

//  * | HC-SC04 | ESP32  |    

//  * ———————    

//  * |   Vcc   |   3.3V  |    

//  * |   Trig  |   32    | 

//  * |   Echo  |   33    |     

//  * |   Gnd   |   GND   | 

//  * ———————


上傳HC-SR04.py檔至板上

HC_SR04.py

import machine, time
from machine import Pin
 
class HCSR04:
    """
    Driver to use the untrasonic sensor HC-SR04.
    The sensor range is between 2cm and 4m.
    The timeouts received listening to echo pin are converted to OSError('Out of range')
    """
    # echo_timeout_us is based in chip range limit (400cm)
    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
        """
        trigger_pin: Output pin to send pulses
        echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
        echo_timeout_us: Timeout in microseconds to listen to echo pin. 
        By default is based in sensor limit range (4m)
        """
        self.echo_timeout_us = echo_timeout_us
        # Init trigger pin (out)
        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
        self.trigger.value(0)
 
        # Init echo pin (in)
        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)
 
    def _send_pulse_and_wait(self):
        """
        Send the pulse to trigger and listen on echo pin.
        We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
        """
        self.trigger.value(0) # Stabilize the sensor
        time.sleep_us(5)
        self.trigger.value(1)
        # Send a 10us pulse.
        time.sleep_us(10)
        self.trigger.value(0)
        try:
            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
            return pulse_time
        except OSError as ex:
            if ex.args[0] == 110: # 110 = ETIMEDOUT
                raise OSError('Out of range')
            raise ex
 
    def distance_mm(self):
        """
        Get the distance in milimeters without floating point operations.
        """
        pulse_time = self._send_pulse_and_wait()
 
        # To calculate the distance we get the pulse_time and divide it by 2 
        # (the pulse walk the distance twice) and by 29.1 becasue
        # the sound speed on air (343.2 m/s), that It's equivalent to
        # 0.34320 mm/us that is 1mm each 2.91us
        # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 
        mm = pulse_time * 100 // 582
        return mm
 
    def distance_cm(self):
        """
        Get the distance in centimeters with floating point operations.
        It returns a float
        """
        pulse_time = self._send_pulse_and_wait()
 
        # To calculate the distance we get the pulse_time and divide it by 2 
        # (the pulse walk the distance twice) and by 29.1 becasue
        # the sound speed on air (343.2 m/s), that It's equivalent to
        # 0.034320 cm/us that is 1cm each 29.1us
        cms = (pulse_time / 2) / 29.1
        return cms

主程式碼

**main.py**

from machine import Pin #匯入i2c相關模組和腳位模組

from HC_SR04 import HCSR04

import socket, network

  

ssid="基地台名稱"

password="基地台密碼"

wifi = network.WLAN(network.STA_IF)

wifi.active(True)

wifi.connect(ssid, password)

  

sensor=HCSR04(trigger_pin=32, echo_pin=33, echo\_timeout\_us=100000)

  

while wifi.isconnected()==False:

    pass

print("Connected Successful!")

print("IP: {}".format(wifi.ifconfig()))

  

def readDist():

    global dist

    dist=round(sensor.distance_cm(), 1)

    print("The distance is {:.1f} cm".format(dist))

    return dist

  

def htmlPage():

    html="""

        <html>

    <head>

      <meta charset="utf-8" />

      <meta http-equiv="refresh" content="1" />

      <meta name="viewport" content="width=device-width, initial-scale=1.0" />

      <style>

        h1  {text-align: center; background-color: orange; margin-right:5px;}

        dl { width: 320px; margin: 12px auto; }

        dt { 

          font-size: 20pt; color: #444; background-color: #ddd;

          margin: 6pt 0; padding: 6pt 12pt;

        }

        dd {

          text-align: right; padding-right: 6pt;

        }

        .num { font-size: 36pt; color: dodgerblue; }

      </style>

      </head>

    <body>

      <p><h1>ESP32 HC-SR04 Distance Test</h1></p>

      <dl>

        <dt>Distance:</dt>

        <dd class=num>"""+str(dist)+"""cm</dd>

      </dl>

    </body>

    </html>

    """

    return html

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('', 80))

s.listen(5)

  

while True:

    conn, addr = s.accept()

    print('Got a connection from %s' % str(addr))

    req = conn.recv(1024)

    print('Content = %s' % str(req))

    DRead = readDist()

    response = htmlPage()

    conn.send("http/1.1 200 OK\\n")

    conn.send("Content-Type: text/html\\n")

    conn.send("Connection: close\\n\\n")

    conn.sendall(response)

    conn.close()

解析

匯入machine, sockt, network, HC_SR04模組


from machine import Pin 

from HC_SR04 import HCSR04

import socket, network

設定wifi連線

ssid="基地台名稱"

password="基地台密碼"

wifi = network.WLAN(network.STA_IF)

wifi.active(True)

wifi.connect(ssid, password)

while wifi.isconnected()==False:

    pass

print("Connected Successful!")

print("IP: {}".format(wifi.ifconfig()))

超音波測距

sensor=HCSR04(trigger_pin=32, echo_pin=33,echo_timeout_us=100000)

讀取距離的函式

def readDist():

    global dist

    dist=round(sensor.distance_cm(), 1)

    print("The distance is {:.1f} cm".format(dist))

    return dist

前端網頁

def htmlPage():

    html="""

        <html>

    <head>

      <meta charset="utf-8" />

      <meta http-equiv="refresh" content="1" />

      <meta name="viewport" content="width=device-width, initial-scale=1.0" />

      <style>

        h1  {text-align: center; background-color: orange; margin-right:5px;}

        dl { width: 320px; margin: 12px auto; }

        dt { 

          font-size: 20pt; color: #444; background-color: #ddd;

          margin: 6pt 0; padding: 6pt 12pt;

        }

        dd {

          text-align: right; padding-right: 6pt;

        }

        .num { font-size: 36pt; color: dodgerblue; }

      </style>

      </head>

    <body>

      <p><h1>ESP32 HC-SR04 Distance Test</h1></p>

      <dl>

        <dt>Distance:</dt>

        <dd class=num>"""+str(dist)+"""cm</dd>

      </dl>

    </body>

    </html>

    """

    return html

  

socket套接

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(('', 80))

s.listen(5)

  

while True:

    conn, addr = s.accept()

    print('Got a connection from %s' % str(addr))

    req = conn.recv(1024)

    print('Content = %s' % str(req))

    DRead = readDist()

    response = htmlPage()

    conn.send("http/1.1 200 OK\n")

    conn.send("Content-Type: text/html\n")

    conn.send("Connection: close\n\n")

    conn.sendall(response)

    conn.close()

文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄