【ESP32+MicroPython】热点模式及网页控制

在物联网项目中,ESP32作为接入点(AP)可以生成热点网络,设备连接到ESP32后,可以通过Web页面进行交互,例如控制LED的亮灭。本文将讲解如何在MicroPython下实现:

  1. ESP32作为Wi-Fi热点;
  2. 创建简单的Web服务器;
  3. 控制LED的亮灭。

通过学习本教程,你将能够使用ESP32在局域网中创建网页控制器,实现LED灯的远程控制。

搭建ESP32热点

ESP32作为Wi-Fi接入点,可以创建热点,供其他设备连接。热点模式适用于无需外部网络的本地控制场景。

代码实现

我们首先定义一个函数,使ESP32创建一个热点并显示其IP地址。

import network

def create_ap(ssid, password):
    ap = network.WLAN(network.AP_IF)       # 配置为AP模式
    ap.active(True)                        # 激活AP模式
    ap.config(essid=ssid, password=password)  # 设置热点SSID和密码

    print("热点已启动,IP地址为:", ap.ifconfig()[0])

# 启动热点
create_ap("ESP32_Hotspot", "12345678")
  • network.WLAN(network.AP_IF):配置Wi-Fi为AP模式。
  • ap.config(essid=ssid, password=password):设定热点的名称和密码。
  • ap.ifconfig():获取网络配置,ap.ifconfig()[0]返回IP地址。

现在,ESP32将创建一个名为ESP32_Hotspot的Wi-Fi热点,密码为12345678。设备可以连接此热点进行通信。

创建Web服务器

ESP32作为HTTP服务器,可以在用户访问其IP地址时返回网页并接受用户的请求,接下来我们将搭建简单的服务器,实现网页控制LED。

代码实现

我们创建一个简单的Web服务器,允许用户通过点击网页上的按钮来控制LED的开关。

import socket
from machine import Pin

# LED连接的GPIO引脚
led = Pin(2, Pin.OUT)

def web_page():
    """生成网页内容"""
    # HTML代码,包含按钮用以控制LED状态
    html = """
    <html>
    <head>
        <title>ESP32 LED控制</title>
    </head>
    <body>
        <h2>ESP32 LED 控制器</h2>
        <p>点击按钮来切换LED状态。</p>
        <a href="/?led=on"><button>LED ON</button></a>
        <a href="/?led=off"><button>LED OFF</button></a>
    </body>
    </html>
    """
    return html

# 创建并启动服务器
def start_server():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', 80))
    s.listen(5)
    print("服务器启动,监听端口80")

    while True:
        conn, addr = s.accept()
        print("客户端连接自", addr)
        request = conn.recv(1024).decode()
        print("请求内容:", request)
        
        # 检测请求中的LED控制指令
        if '/?led=on' in request:
            led.value(1)  # 点亮LED
        elif '/?led=off' in request:
            led.value(0)  # 熄灭LED
        
        # 返回HTML页面
        response = web_page()
        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()

# 运行服务器
start_server()
  • LED控制:在web_page()中生成一个简单的HTML页面,包含两个按钮:LED ONLED OFF。这些按钮指向带有不同参数的URL,用于控制LED。
  • 请求解析if '/?led=on' in request检测GET请求中的参数来判断是否需要点亮或熄灭LED。
  • HTTP响应conn.send()用于将网页内容返回给客户端。

运行效果

  • 将ESP32连接至电源,其他设备连接至ESP32_Hotspot热点。
  • 打开浏览器访问ESP32的IP地址(如192.168.4.1)。
  • 点击按钮即可控制LED的亮灭状态。

状态反馈

在实际应用中,通常需要在页面上实时显示LED的状态。我们可以对网页进行扩展,使页面根据LED状态动态显示。

def web_page():
    """生成带状态反馈的网页内容"""
    # 检查LED当前状态
    if led.value() == 1:
        led_state = "ON"
    else:
        led_state = "OFF"

    html = """
    <html>
    <head>
        <title>ESP32 LED控制</title>
    </head>
    <body>
        <h2>ESP32 LED 控制器</h2>
        <p>LED 当前状态: <strong>{}</strong></p>
        <a href="/?led=on"><button>LED ON</button></a>
        <a href="/?led=off"><button>LED OFF</button></a>
    </body>
    </html>
    """.format(led_state)
    return html

刷新页面时会动态显示LED状态(ON或OFF),更便于用户了解设备当前状态。

完整代码

以下是实现上述功能的完整代码,将ESP32设为热点,启动Web服务器,并通过网页控制LED。

import network
import socket
from machine import Pin

# 创建热点
def create_ap(ssid, password):
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ap.config(essid=ssid, password=password)
    print("热点已启动,IP地址为:", ap.ifconfig()[0])

# LED控制代码
led = Pin(2, Pin.OUT)

def web_page():
    """生成网页内容并包含LED状态"""
    led_state = "ON" if led.value() == 1 else "OFF"
    html = """
    <html>
    <head>
        <title>ESP32 LED控制</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h2>ESP32 LED 控制器</h2>
        <p>LED 当前状态: <strong>{}</strong></p>
        <a href="/?led=on"><button>LED ON</button></a>
        <a href="/?led=off"><button>LED OFF</button></a>
    </body>
    </html>
    """.format(led_state)
    return html

def start_server():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(('', 80))
    s.listen(5)
    print("服务器启动,监听端口80")

    while True:
        conn, addr = s.accept()
        print("客户端连接自", addr)
        request = conn.recv(1024).decode()
        print("请求内容:", request)
        
        if '/?led=on' in request:
            led.value(1)  # 点亮LED
        elif '/?led=off' in request:
            led.value(0)  # 熄灭LED
        
        response = web_page()
        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()

# 启动程序
create_ap("ESP32_Hotspot", "12345678")
start_server()

总结

本文介绍了ESP32在MicroPython环境下的Wi-Fi热点模式、简单Web服务器搭建及GPIO控制方法。通过将这些功能组合,你可以构建基于ESP32的局域网控制系统,实现对LED等外设的网页控制。这种方法非常适合本地物联网项目,如家居自动化、传感器数据展示等。

猜你喜欢

转载自blog.csdn.net/2303_80346267/article/details/143526202