我在论坛混迹了一段时间了,用户群体大学生不少,但是讨论电子器件和嵌入式软件的同学寥寥,这让我有些讶异,转念一想,可能是因为我本科就读于通信类院校的原因,接触过的很多人最后都是从事相关嵌入式软硬件开发工作,所以造成了刻板印象吧。
所以今天我们也不会涉及过于底层的嵌入式开发,仅仅将其当作一个电子玩具来进行介绍。
首先,作为电子玩具大家可能熟知的是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
然后点击
进入界面中我们可以看到Installation instructions
和 Firmware
,我们选择下载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之后,会有这两种状态:
,前者为脚本运行态,后者为正常态,上传或者运行你的脚本前请保证你的设备处于正常态,main.py上传后重启是自动运行的,也可以上传其他的脚本,然后打开
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()
访问IP的80端口就可以通过WiFi在网页上控制led的亮灭,也算是简单的物联网吧。
我们再把思维发散,可不可以在esp32上写API端点的服务?可不可以自己做一个远程控制的一个物联网设备?可不可以通过cf的tunnel将esp32上写的东西映射到自己的域名上来实现一些物联网的平台功能?可不可以将毕设老掉牙的51换成这个来让一些思路的实现不再那么寒碜和难开发?
这里是micropython的文档:Overview — MicroPython 1.4.4 documentation
新的东西需要自己开拓,我这篇帖子还是比较粗糙和简单,希望可以给各位一些思路和启示