【ESP32】WIFI模块开发HTTP控制面板


前言

ESP32开发板自带WIFI模块的,本次案例通过串口配置ESP32的WIFI,然后开启HTTTP服务,基于服务发送API接口控制ESP32的GPIO功能。


提示:以下代码都保存于ESP32设备里面,最后通过调用main.py文件循环监听串口和HTTP服务。

一、实战内容介绍

本次实战是用Thonny工具,在ESP32设备新建py文件,项目具备保存WIFI SSID和密码功能,也可以同串口连接查看和更新密码。

二、项目简介

1. 更新Wifi配置

代码如下(示例):代码为加载和保存wifi 。

import ujson

def save_dict_to_file(data_dict):
    with open("config.json", 'w') as f:
        ujson.dump(data_dict, f)

def load_dict_from_file(filename):
    try:
        with open(filename, 'r') as f:
            return ujson.load(f)
    except:
        return {}  # 文件不存在时返回空字典

2. 串口更新Wifi

通过串口Uart1 发送如下命令更新ESP存储的WIFI。

R_WIFI: 读取当前WIFI配置
W_WIFI_SSID your_ssid: 更新wifi名
W_WIFI_PWD your_password: 更新wifi密码

示例代码如下:

# ESP32 代码:uart_echo.py
from machine import UART
import time
from load_config import load_dict_from_file, save_dict_to_file


def reload_wifi(received_data):
    if "R_WIFI" in received_data:
        wifi_setting = load_dict_from_file('config.json')
        ret = f"SSID: {wifi_setting['SSID']}, PWD: {wifi_setting['PWD']}"
    elif "W_WIFI_SSID" in received_data:
        ssid = received_data.split(' ')[1].strip()
        wifi_setting = load_dict_from_file('config.json')
        wifi_setting['SSID'] = ssid
        save_dict_to_file(wifi_setting)
        ret = "SSID set successful !"
    elif "W_WIFI_PWD" in received_data:
        pwd = received_data.split(' ')[1].strip()
        wifi_setting = load_dict_from_file('config.json')
        wifi_setting['PWD'] = pwd
        save_dict_to_file(wifi_setting)
        ret = "PWD set successful !"
    else:
        pass
    return ret+ '\n'
    
    

def uart1_handler(received):
    """处理串口信息 """
    ret = reload_wifi(received)    
    return ret
            


3. 处理HTTP接口响应

WIFI连接成功后开启服务,并且接收API响应,代码如下。


import network
import socket
import time
from html_page import get_html_index, get_html_alert
from set_gpio import led_status, set_io_value
import re
import machine


# 处理 HTTP 请求
def handle_request(conn):
    request = conn.recv(1024).decode()  # 接收客户端请求
    print("收到请求:\n", request)
    
    # 解析请求方法(GET/POST)
    if "GET / HTTP/1.1" in request:
        response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
        response += get_html_index()
    elif "GET /led/on HTTP/1.1" in request:
        led_status(True)
        response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
        response += get_html_index()
    elif "GET /led/off HTTP/1.1" in request:
        led_status(False)
        response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
        response += get_html_index()
    elif "GET /gpio/set" in request:
        request = request.split('\n')[0]
        match = re.search(r'pin=(\d+)&state=(\d+)', request)
        if match:
            pin = int(match.group(1))
            state = int(match.group(2))
            set_io_value(pin, state)
        response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"
        response += get_html_alert(f"GPIO PIN{pin} SET {state} !")
    elif "GET /restart HTTP/1.1" in request:
        machine.soft_reset()  # 软复位(等同于reset)
        machine.hard_reset()  # 硬复位(部分固件支持)
    else:
        response = "HTTP/1.1 404 Not Found\r\n\r\n"
    
    conn.send(response.encode())  # 发送响应
    conn.close()

# 启动 HTTP 服务器
def start_http_server(sock):
    conn, addr = sock.accept()
    handle_request(conn)


4. main.py

以下是主程序,循环监听串口和HTTP请求。

# ESP32 代码:uart_echo.py
from machine import UART
import time
from connect_wifi import connect_wifi as _connect_wifi
import network
from http_server import start_http_server
from uart_send import uart1_handler
import network
import socket

WIFI_CONNECTED = None

# 配置 Wi-Fi
this_wifi = network.WLAN(network.STA_IF)  # 设置工作站模式
this_wifi.active(True)

if __name__ == "__main__":
    uart = UART(1, baudrate=115200, tx=17, rx=16)
    ret = _connect_wifi(this_wifi)
    if ret[0] is 0:
        WIFI_CONNECTED = True
        print(f"Wifi Connected,IP地址:{ret[1]}")
    else:
        WIFI_CONNECTED = False
        print(ret[1])
    if WIFI_CONNECTED:
        addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1]  # 监听 80 端口
        sock = socket.socket() # 避免被占用,先关闭再打开
        sock.close()
        sock = socket.socket()
        sock.bind(addr)
        sock.listen(5)
        print("HTTP 服务器已启动,访问地址: http://" + network.WLAN(network.STA_IF).ifconfig()[0])
    while True:
        if uart.any():  # 检查是否有数据
            received_data = uart.read().decode('utf-8').strip()
            ret = uart1_handler(received_data)
            uart.write(ret)
        if WIFI_CONNECTED:
            start_http_server(sock)
        


三、运行结果

运行主程序,通过串口发送WIFI的SSID和密码,更新配置,点击板载复位按钮,Thonny终端打印如下信息表明Wifi已经连接,服务已经启动:

在这里插入图片描述

打开浏览器,访问如上地址,浏览器显示ESP32返回的Response网页,如下:

在这里插入图片描述
通过对浏览器页面的按钮就可以自由控制ESP32内部的GPIO,和控制显示LED状态。


总结

以上就是基于Micropython开发ESP32,实现物联网开发的样例,项目代码见我的仓库:https://gitee.com/andyhus/esp32-wifi-control-panel/blob/master/README.md

### ESP8266 WiFi模块与ASR-PRO语音模块集成使用指南 #### 硬件连接说明 为了实现ESP8266 Wi-Fi模块与ASR-PRO语音识别模块之间的通信,需按照如下方式完成硬件连接: | 设备 | GPIO引脚 | | --- | --- | | ESP8266 TXD | 连接到 ASR-PRO RXD | | ESP8266 RXD | 连接到 ASR-PRO TXD | | GND (共地) | 将两个设备的地线相连 | 确保供电电压匹配,通常情况下两者都工作于3.3V逻辑电平。 #### 软件配置与编程环境搭建 建议采用Arduino IDE作为开发工具,在安装好必要的库文件之后可以轻松编写控制程序。对于ESP8266的支持可以通过Arduino IDE中的板子管理器来获取并安装相应的固件包;而对于ASR-PRO,则需要下载官方提供的SDK或API接口文档以便调用其功能函数[^1]。 #### 示例代码展示 下面给出一段简单的Python风格伪代码用于演示如何通过串行端口接收来自ASR-PRO解析后的命令字符串,并据此执行特定操作(例如发送HTTP请求)。实际应用时应转换成C/C++语法适配Arduino平台。 ```cpp #include <ESP8266WiFi.h> // 假设已定义好Wi-Fi SSID和密码常量 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; void setup() { Serial.begin(9600); // 初始化Wi-Fi连接... } void loop() { if(Serial.available()){ String command = Serial.readStringUntil('\n'); if(command.equals("turn_on_light")){ turnOnLight(); }else if(command.equals("check_temperature")){ checkTemperature(); } // 更多指令处理... delay(50); } } ``` 此段代码展示了基本框架结构,具体细节取决于项目需求以及所使用的第三方服务API设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值