当前位置: 首页 > article >正文

基于ESP32的Python物联网开发实践 - 通过HTTP API控制LED灯

一个互联网技术玩家,一个爱聊技术的家伙。在工作和学习中不断思考,把这些思考总结出来,并分享,和大家一起交流进步。

一、Esp32

一时兴起买了一个 esp32 的小板子,想玩玩,此前主要使用Arduino进行开发,但受限于其缺乏原生蓝牙和WiFi模块,所以感觉还是不够好玩。现在 esp32 的板子便宜的 10 多块钱一个,基本都有集成的蓝牙和 wifi。我买的是这个板子。

2fc8ecade7a2772f3a2e600c4d5f90ce.png

昨晚到了之后直接拿一个数据线连接了 mac,使用 thonny 来测试连接,一切都很舒畅,在macOS系统上可便捷完成开发环境配置,而且可以使用 python 来开发。感觉也可以给小朋友来玩了。

今天先试试一个简单的例子:通过一个 http 接口的返回结果来控制一个 led 灯的明灭。

二、硬件准备与电路连接:

电路连接如下图所示,比较简单,采用一个电阻与LED灯串联电路设计(电阻用于限流保护LED)。led 要注意正负极。

b4d76484960da4116e6ca768b3203591.png

三、LED基础控制实现:

使用 python 写非常简单,代码如下,基本流程:

  1. 引入 GPIO 控制库

  2. 初始化引脚,设置为输出模式

  3. 对引脚进行 on() 函数和 off() 函数调用控制

  4. 这里另外加了一个 time 控制延时

from machine import Pin
import time

def test_led():
    p5 = Pin(5, Pin.OUT)
    
    while True:
        p5.on()
        print("led on")
        time.sleep(1)
        p5.off()
        print("led off")
        time.sleep(1)

四、网络连接配置

这里的代码是网上直接找的,现成的,几乎没啥改动。

import network
import time

def connect():
    ssid = 'xxx'
    password = 'xxxx'
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        time.sleep(1)
    print('Connected on {ip}'.format(ip = wlan.ifconfig()[0]))

五、服务端API设计

编写一个简单的 api,设计随机响应逻辑:当随机值>50时返回成功状态码,否则返回错误状态。我是在我自己的服务中增加了一个 api:/api/test/led。我是属于 golang 的 gin 框架开发,也是非常简单,基本代码如下:

// 根据随机数返回结果
func CtrlLed(c *gin.Context) {
clientIP := c.ClientIP()
headers := c.Request.Header
funlog.SLoger.Info("led ctrl ip clientIP ", clientIP)
funlog.SLoger.Info("led ctrl headers ", headers)
tdata := rand.Intn(100)
if tdata > 50 {
funlog.SLoger.Info("led ctrl ok ", tdata)
response.OkWithMessage(clientIP+" ok", c)
} else {
funlog.SLoger.Info("led ctrl error ", tdata)
response.FailWithMessageCode(500, clientIP+" error", c)
}
}

五、客户端请求实现

import urequests
def check_ledAPI():
    ret = urequests.get("http://192.168.2.26/api/test/led")
    parsed = ret.json()
    print(parsed)
    print(type(parsed))
    if 0 == parsed["code"]:
        print("ret ok: " + parsed["msg"])
        return True
    else:
        print("ret error try again")
        return False

六、系统联调测试

def ctrl_led():
    p5 = Pin(5, Pin.OUT)
    
    while True:
        islight = check_ledAPI()
        if islight:
            p5.on()
            print("led on")
        else:
            p5.off()
            print("led off") 
        time.sleep(1)
        
if __name__ == "__main__":
    connect()
    ctrl_led()

测试日志如下:

MPY: soft reboot
Connected on 192.168.2.247
{'code': 0, 'data': {}, 'msg': '192.168.2.247 ok'}
<class 'dict'>
ret ok: 192.168.2.247 ok
led on
{'code': 500, 'data': {}, 'msg': '192.168.2.247 error'}
<class 'dict'>
ret error try again
led off
{'code': 500, 'data': {}, 'msg': '192.168.2.247 error'}
<class 'dict'>
ret error try again
led off
{'code': 0, 'data': {}, 'msg': '192.168.2.247 ok'}
<class 'dict'>
ret ok: 192.168.2.247 ok
led on

七、总结

整体效果还是挺好的,开发过程基本没啥卡点,使用 python 开发也非常方便丝滑,确实现在玩这类板子还是非常方便有趣的。该方案兼具趣味性和教学价值,适合作为青少年编程教育的实践案例。



http://www.kler.cn/a/578663.html

相关文章:

  • Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置
  • 策略设计模式-下单
  • 【练习】PAT 乙 1061 判断题
  • p5.js:sound(音乐)可视化,动画显示音频高低变化
  • FastAPI 请求体参数与 Pydantic 模型完全指南:从基础到嵌套模型实战 [特殊字符]
  • 长方形旋转计算最后的外层宽高
  • JAVA实战开源项目:大学城水电管理系统(Vue+SpringBoot) 附源码
  • spring 和JVM之间关系
  • 【AI论文】GEN3C: 基于3D信息的全球一致视频生成技术,实现精确相机控制
  • Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析20250309
  • 51单片机Proteus仿真速成教程——P1-软件与配置+Proteus绘制51单片机最小系统+新建程序模版
  • 十二、Redis Cluster(集群)详解:原理、搭建、数据分片与读写分离
  • 查看电脑信息
  • C++:入门详解(关于C与C++基本差别)
  • [css教程]2025系统全面css教程(四)
  • 【redis】数据类型之geo
  • vs code 设置字体颜色
  • 大模型架构记录3-提示工程
  • VBA使用fso对象合并指定路径的txt文件(含子目录)
  • 第53天:Web攻防-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路