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