想成为一名geek?你只要略懂python就可以

我在论坛混迹了一段时间了,用户群体大学生不少,但是讨论电子器件和嵌入式软件的同学寥寥,这让我有些讶异,转念一想,可能是因为我本科就读于通信类院校的原因,接触过的很多人最后都是从事相关嵌入式软硬件开发工作,所以造成了刻板印象吧。

所以今天我们也不会涉及过于底层的嵌入式开发,仅仅将其当作一个电子玩具来进行介绍。

首先,作为电子玩具大家可能熟知的是arduino,因为其庞大的软件库和简单的语法而便于开发并验证方案,但是因为其开发的语言为C语言,因此对于很多非开发相关背景的朋友们来说,可能并不愿意去学习这种比较原始的语言,因为应用面对于这些朋友来说过于狭窄。

所以这里我推荐的是使用micropython来进行简单的嵌入式开发,首先其使用的是python语言开发,其次是其将硬件层完全抽象化,不用考虑太多硬件的问题。那么稍微懂那么一点的同学可能就会问了:唉?完全抽象了怎么适配的各种千奇百怪的MCU的?所以这里我推荐使用的是esp32的系列芯片,基本micropython是全系列支持的,性能也相对较强,当然树莓派也是可以的,但是除了PICO好像没必要使用micropython开发,因为直接烧上linux就行了。

我这里就不过多解释micropython是如何将python脚本在片上跑起来的了,直接告诉你如何使用。

你需要什么?
一台window或者linux电脑
可以终端中pip的python环境
安装ch340驱动 (CH340 Drivers for Windows, Mac and Linux)
一块开发板(建议新手直接淘宝搜索购买esp32 wroom的开发板)

首先,到这个官方固件下载站中下载对应MCU的固件(如果想用其他的支持的MCU,推荐使用核心开发板套件,无论你是什么MCU,很多人taobao下单都是直接集成开发板,如果实在是想买集成开发板,请根据该下载站对应MCU同型号的开发板购买,可以自行改源码编译固件适配的当我放屁)

我们打开下载站可以看到会有选择器,我的开发板比较老了,是esp32芯片,较新款的可能是c3s3等,我们这里点击进入MCU这一栏的esp32

然后点击
image

进入界面中我们可以看到Installation instructionsFirmware,我们选择下载bin后缀的固件,进入终端,使用 pip install esptool 安装所需工具,将开发板连接到电脑以后,输入Installation instructions中写的指令流程,端口在Windows使用设备管理器查看,linux直接lsusb即可。也可以使用传统烧录方式,这里不赘述。

成功烧录固件以后我们需要一个开发环境,网上大多推荐thnooy,因为我平时使用的编辑器是vscode(主要copilot好用),所以推荐一个插件pymakr,直接插件商店搜索安装即可,使用前记得安装node.js,其他没有什么可说的。

最后我们来说说一个micropython的工程中至少有什么:
boot.py(每次重启时执行的脚本)
main.py(开机后自动执行的脚本)

首先建立一个新文件夹,命名为你的工程名称,点击pymakr界面的create project,选择你新建立的文件夹,选择空,这个工程就建立好了,可以看到文件夹中出现了我所说的两个脚本文件。注意在project中添加你的devices

连接到devices之后,会有这两种状态:
image
image
,前者为脚本运行态,后者为正常态,上传或者运行你的脚本前请保证你的设备处于正常态,main.py上传后重启是自动运行的,也可以上传其他的脚本,然后打开
image
import YOURS.py运行,终端推荐始终打开。

这里我贴一个经典的esp32的demo(arduino上的demo思路,这个是我自己糊的)

# main.py -- put your code here!
import socket
import network
from machine import Pin

led = Pin(2, Pin.OUT)  # 根据你的IO绑定的器件进行设置
led.value(0)  # 初始化为低电平(熄灭)

ssid = 'YOUR WIFI NAME'
password = 'YOUR WIFI PASSWORD'

wlan = network.WLAN(network.STA_IF)  # 创建 STA 接口
wlan.active(True)  # 激活接口
wlan.connect(ssid, password)  # 连接到 Wi-Fi

while not wlan.isconnected():  # 等待连接成功
    pass

print('Connected to WiFi:', ssid)
print('IP address:', wlan.ifconfig()[0])

def web_page():
    if led.value() == 1:
        button_label = "Turn OFF"
    else:
        button_label = "Turn ON"

    html = f"""
    <html>
    <head>
        <title>ESP32 Web Server</title>
    </head>
    <body>
        <h1>ESP32 LED Control</h1>
        <button id="ledButton" onclick="toggleLED()">{button_label}</button>
        <script>
            function toggleLED() {{
                var xhttp = new XMLHttpRequest();
                xhttp.open("GET", "/toggle", true);
                xhttp.send();
            }}

            function updateButton() {{
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() {{
                    if (this.readyState == 4 && this.status == 200) {{
                        document.getElementById("ledButton").innerHTML = this.responseText;
                    }}
                }};
                xhttp.open("GET", "/led_state", true);
                xhttp.send();
            }}

            setInterval(updateButton, 1000); // 每秒更新一次,我的esp32太老,快了掉wifi
        </script>
    </body>
    </html>
    """
    return html

def toggle_led():
    led.value(not led.value())

# 创建 socket 并监听
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

print('Web server started')

while True:
    conn, addr = s.accept()
    print('Got a connection from %s' % str(addr))
    request = conn.recv(1024)
    request = str(request)

    if request.find('/toggle') == 6:
        toggle_led()
        response = web_page()  # 更新网页内容
    elif request.find('/led_state') == 6:  # 处理 /led_state 请求
        if led.value() == 1:
            response = "Turn OFF"
        else:
            response = "Turn ON"
    else:
        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()

image

访问IP的80端口就可以通过WiFi在网页上控制led的亮灭,也算是简单的物联网吧。

我们再把思维发散,可不可以在esp32上写API端点的服务?可不可以自己做一个远程控制的一个物联网设备?可不可以通过cf的tunnel将esp32上写的东西映射到自己的域名上来实现一些物联网的平台功能?可不可以将毕设老掉牙的51换成这个来让一些思路的实现不再那么寒碜和难开发?

这里是micropython的文档:Overview — MicroPython 1.4.4 documentation
新的东西需要自己开拓,我这篇帖子还是比较粗糙和简单,希望可以给各位一些思路和启示

33 个赞

想开发一个遥控跳蛋

19 个赞

you can try it

1 个赞

帮我想想怎么让它自动识别G点

6 个赞

得加压力传感器吧

2 个赞

要加一个能照亮通道的灯吗?

3 个赞

这是可以说的吗

2 个赞

是不是要像扫地机器人那样进行全局建模?

1 个赞

mark一下

1 个赞

记得加上针孔摄像头和麦克风

1 个赞

这不对吧

1 个赞

总感觉更依赖人体工学,而非传感,这个位置不需要太精确吧:thinking:,而且你让这个帖子的讨论氛围变得有些微妙:joy:

3 个赞

我找不到女朋友,所以无处发泄

1 个赞

哈哈评论区怎么突然变色了我说

1 个赞

那还是买一个比较方便

1 个赞

其实这类产品已经有了,不过实现方式不是这个…

1 个赞

说说看

1 个赞

主要是干这个的可能不太有时间划水和分享,我手里还有个 esp32-box 一直想接入 OpenAI api 做小助手的,一直没去搞 :see_no_evil:

1 个赞

好啊,少见的嵌入式

1 个赞

那个box我看了,IDF有库的,有密钥和baseurl就行了,相关套件比较齐全

1 个赞