microdot网页图表查看温湿度信息

HTML页面代码

网页代码,页面头部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ESP DHT Server</title>
    <script src="<https://cdn.jsdelivr.net/npm/chart.js>"></script>
    <style>
        body { text-align: center; font-family: Arial, sans-serif; }
        h1 { font-size: 40px; margin: 20px; }
        canvas { min-width: 1000px; margin: 0 auto; }
        .info {
            font-size: 24px;
            margin: 20px;
            display: inline-block; /* 让元素并排 */
            vertical-align: middle; /* 垂直居中对齐 */
        }
        .distance-btn {
            font-size: 40px;
            padding: 10px 20px;
            margin: 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .distance-btn:hover {
            background-color: #45a049;
        }
         .button {
            background-color: #f87c01;
            border: none;
            border-radius: 4px;
            color: black;
            font-size: 24px;
        }
        
    </style>

</html>

页面主体(body)

<body>
    <h1>ESP DHT Server</h1>
    <div class="info"><span id="temp">🌡️ Temperature <span id="tempValue">0.0</span> °C</span></div>
    <div class="info"><span id="humi">💧 Humidity <span id="humiValue">0.0</span> %</span></div>
    <div class="info"><div>📏 Distance</div><div class="sensor-value"><span id="distanceValue"> --</span><span class="unit"> cm</span></div></div>
    <button class="button" onclick="getDistance()">Get Distance</button>
    <canvas id="myChart"></canvas>
   
   
</body>

页面脚本

    <script>
        const ctx = document.getElementById('myChart').getContext('2d');
        const chart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: [],
                datasets: [{
                    label: 'Temperature (°C)',
                    data: [],
                    borderColor: 'rgb(75, 192, 192)',
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    fill: true,
                    tension: 0.1
                }, {
                    label: 'Humidity (%)',
                    data: [],
                    borderColor: 'rgb(54, 162, 235)',
                    backgroundColor: 'rgba(54, 162, 235, 0.2)',
                    fill: true,
                    tension: 0.1
                }]
            },
            options: {
                scales: {
                    y: {
                        beginAtZero: false,
                        min: 10,
                        max: 100
                    }
                },
                animation: {
                    duration: 0 // 禁用动画
                }
            }
        });

        function updateData() {
            fetch('/data')
                .then(response => {
                    if (!response.ok) throw new Error('Network response was not ok');
                    return response.json();
                })
                .then(data => {
                    const temp = data.temperature;
                    const humi = data.humidity;
                    const time = new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });

                    // 更新文本显示
                    document.getElementById('tempValue').textContent = temp;
                    document.getElementById('humiValue').textContent = humi;

                    // 添加新数据
                    chart.data.labels.push(time);
                    chart.data.datasets[0].data.push(temp);
                    chart.data.datasets[1].data.push(humi);

                    // 限制数据点数量为8个
                    if (chart.data.labels.length > 8) {
                        chart.data.labels.shift();
                        chart.data.datasets[0].data.shift();
                        chart.data.datasets[1].data.shift();
                    }

                    // 确保更新
                    chart.update();
                })
                .catch(error => console.error('Error fetching data:', error));
        }
        
          function getDistance() {
            fetch('/data')
                .then(response => {
                    if (!response.ok) throw new Error('Network response was not ok');
                    return response.json();
                })
                .then(data => {
                    // 假设服务器返回的数据中包含 distance 字段
                    const distance = data.distance || data.dist || 0;
                    
                    // 更新距离显示
                    document.getElementById('distanceValue').textContent = distance.toFixed(1);
                })
                .catch(error => {
                    console.error('Error fetching distance data:', error);
                    document.getElementById('distanceValue').textContent = 'Error';
                });
        }

        setInterval(updateData, 1000); // Update every 1 second
        updateData(); // Initial call
    </script>

完整网页代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ESP DHT Server</title>
    <script src="<https://cdn.jsdelivr.net/npm/chart.js>"></script>
    <style>
        body { text-align: center; font-family: Arial, sans-serif; }
        h1 { font-size: 40px; margin: 20px; }
        canvas { min-width: 1000px; margin: 0 auto; }
        .info {
            font-size: 24px;
            margin: 20px;
            display: inline-block; /* 让元素并排 */
            vertical-align: middle; /* 垂直居中对齐 */
        }
        .distance-btn {
            font-size: 40px;
            padding: 10px 20px;
            margin: 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .distance-btn:hover {
            background-color: #45a049;
        }
         .button {
            background-color: #f87c01;
            border: none;
            border-radius: 4px;
            color: black;
            font-size: 24px;
        }
        
    </style>
</head>
<body>
    <h1>ESP DHT Server</h1>
    <div class="info"><span id="temp">🌡️ Temperature <span id="tempValue">0.0</span> °C</span></div>
    <div class="info"><span id="humi">💧 Humidity <span id="humiValue">0.0</span> %</span></div>
    <div class="info"><div>📏 Distance</div><div class="sensor-value"><span id="distanceValue"> --</span><span class="unit"> cm</span></div></div>
    <button class="button" onclick="getDistance()">Get Distance</button>
    <canvas id="myChart"></canvas>
    
    <script>
        const ctx = document.getElementById('myChart').getContext('2d');
        const chart = new Chart(ctx, {
            type: 'line',
            data: {
                labels: [],
                datasets: [{
                    label: 'Temperature (°C)',
                    data: [],
                    borderColor: 'rgb(75, 192, 192)',
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    fill: true,
                    tension: 0.1
                }, {
                    label: 'Humidity (%)',
                    data: [],
                    borderColor: 'rgb(54, 162, 235)',
                    backgroundColor: 'rgba(54, 162, 235, 0.2)',
                    fill: true,
                    tension: 0.1
                }]
            },
            options: {
                scales: {
                    y: {
                        beginAtZero: false,
                        min: 10,
                        max: 100
                    }
                },
                animation: {
                    duration: 0 // 禁用动画
                }
            }
        });

        function updateData() {
            fetch('/data')
                .then(response => {
                    if (!response.ok) throw new Error('Network response was not ok');
                    return response.json();
                })
                .then(data => {
                    const temp = data.temperature;
                    const humi = data.humidity;
                    const time = new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });

                    // 更新文本显示
                    document.getElementById('tempValue').textContent = temp;
                    document.getElementById('humiValue').textContent = humi;

                    // 添加新数据
                    chart.data.labels.push(time);
                    chart.data.datasets[0].data.push(temp);
                    chart.data.datasets[1].data.push(humi);

                    // 限制数据点数量为8个
                    if (chart.data.labels.length > 8) {
                        chart.data.labels.shift();
                        chart.data.datasets[0].data.shift();
                        chart.data.datasets[1].data.shift();
                    }

                    // 确保更新
                    chart.update();
                })
                .catch(error => console.error('Error fetching data:', error));
        }
        
          function getDistance() {
            fetch('/data')
                .then(response => {
                    if (!response.ok) throw new Error('Network response was not ok');
                    return response.json();
                })
                .then(data => {
                    // 假设服务器返回的数据中包含 distance 字段
                    const distance = data.distance || data.dist || 0;
                    
                    // 更新距离显示
                    document.getElementById('distanceValue').textContent = distance.toFixed(1);
                })
                .catch(error => {
                    console.error('Error fetching distance data:', error);
                    document.getElementById('distanceValue').textContent = 'Error';
                });
        }

        setInterval(updateData, 1000); // Update every 1 second
        updateData(); // Initial call
    </script>
</body>
</html>

开发板完整代码

from microdot import Microdot,send_file
from machine import Pin
import time
import dht
from mp_connect_wifi import Connect_wifi #导入连接WiFi的工具类

dht_sensor  = dht.DHT11(Pin(5))
trig=Pin(14,Pin.OUT) 
echo=Pin(12,Pin.IN)

global distance
distance=0

def connect_wifi():
    wifi=network.WLAN(network.STA_IF)
    wifi.active(True)
    sleep(1)
    while True:
        sleep(2)
        if wifi.ifconfig()[0]=='0.0.0.0':
            wifi.connect('422','micro422')
        else:
            print('wifi连接成功,IP',wifi.ifconfig()[0])
            break
def read_dht11():
    dht_sensor.measure()  # 测量温湿度
    return dht_sensor.temperature(), dht_sensor.humidity()  # 返回温度和湿度值

def measure_sro4(trig,echo):
    trig.value(0)
    echo.value(0)
        #触发超声波模块测距
    trig.value(1)
    time.sleep_us(10)#触发信号 >= 10us
    trig.value(0) 
  
      #超声波信号发出后,echo为低信号,不断更新微秒计数器t1
    while(echo.value() == 0):
        t1 = time.ticks_us()
        
      #检测回响信号,echo为高时,超声波信号到达,设置微秒计数器t2
    while(echo.value() == 1):
        t2 = time.ticks_us()
    
      #计算两次调用 ticks_ms(), ticks_us(), 或 ticks_cpu()之间的时间,得到当前时间
    t3 = time.ticks_diff(t2,t1)/1000000 #计算出时间差,再换算为秒
  
      # ticks_diff获取的时间差就是测距总时间,再乘声音的传播速度340米/秒,除2(来回)就是距离。
    distance=t3*340/2
    
    #转换为厘米
    result=distance*100 
    
#     print('sro4: ',result)
    return result

app = Microdot()
@app.route('/')
def index(request):
    return send_file('new_index.html')

@app.route('/data')
def get_data(request):
    temp, humi = read_dht11()
    distance=measure_sro4(trig,echo)
    return {'temperature': temp, 'humidity': humi,'distance':distance}

def main():
		connect_wifi()
    app.run(host='0.0.0.0', port=5000)

if __name__=="__main__":
    main()