Micropython是Python 3编程语言的精益实现,其中包括Python标准库的一小部分。它经过优化,可以在微控制器上运行,该微控制器是单个集成电路上的小型低功率计算机。
这是一些关键特征:
交互式提示: Micropython在连接和动力时运行交互提示(repl)。
广泛的库:这些包含特定于硬件的模块,例如机器,网络等,使您可以控制GPIO引脚,连接到WiFi等等。
python语法:它使用python语法,使学习和使用易于学习。
效率: Micropython设计为在记忆使用和速度方面都有效率。
安装:
要开始,您需要在微控制器上安装Micropython固件。此过程因设备而异,但通常涉及下载固件,然后使用工具将其刷到板上。
与Micropython的Hello World:
让我们看一个闪烁LED的基本示例(“ Hello,World!”等效于硬件世界)。
from machine import Pin
from time import sleep
led = Pin(2, Pin.OUT)
while True:
led.on()
sleep(0.5)
led.off()
sleep(0.5)
此脚本执行以下操作:
- 它从
machine
模块中导入Pin
类,并从time
模块中导入sleep
函数。 - 它将
led
定义为第2销并将其设置为输出。 - 在无限的循环中,它打开LED,等待半秒,关闭LED,然后再等半秒。
与REPL互动:
将Micropython刷到板上后,您可以连接到它以开始编程。通常,您可以通过USB上的串行连接来执行此操作。连接后,您将看到Python提示>>>,您可以在其中键入命令并立即查看其输出。
使用数字输入
Micropython允许您阅读按钮,开关或任何数字输入的状态。例如,如果您将按钮开关连接到引脚5,则可以按以下方式读取其状态:
from machine import Pin
button = Pin(5, Pin.IN)
while True:
print(button.value())
此脚本连续打印按钮的状态。
使用模拟输入
微控制器通常具有可以读取模拟值的引脚,例如不同的电压。您可以使用Micropython的ADC(模数转换器)类:
from machine import Pin, ADC
from time import sleep
adc = ADC(Pin(32)) # assuming an analog sensor is connected to pin 32
while True:
print(adc.read())
sleep(1)
此脚本每秒都会读取并打印模拟值。
与微顿群岛联网
Micropython的最大优势之一(尤其是在具有网络能力的硬件(例如ESP8266或ESP32)上)是其网络功能。这是连接到Wi-Fi网络的一个简单示例:
导入网络
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect("<your ssid>", "<your password>")
# Wait for the module to connect to the wifi
while station.isconnected() == False:
pass
print('Connection successful')
print(station.ifconfig())
此脚本尝试使用提供的密码连接到给定的SSID,然后等待直到建立连接。连接后,它将打印包含分配的IP地址的网络配置。
脉冲宽度调制(PWM):
PWM是一种以数字方式获得模拟结果的技术。它通常用于控制需要不同功率的伺服器,LED和其他设备。这是使用PWM控制LED的亮度的一个示例:
from machine import Pin, PWM
from time import sleep
pwm = PWM(Pin(5)) # create PWM object from a pin
pwm.freq(500) # set frequency
pwm.duty(512) # set duty cycle
while True:
for duty in range(0, 1024, 10):
pwm.duty(duty)
sleep(0.005)
这将导致LED逐渐消失。
计时器和中断:
Micropython还可以处理硬件中断和计时器。这些可用于时间敏感的操作或需要定期进行的任务:
from machine import Pin, Timer
led = Pin(5, Pin.OUT)
timer = Timer()
def toggle_led(timer):
led.value(not led.value())
timer.init(period=500, mode=Timer.PERIODIC, callback=toggle_led)
此脚本将每500毫秒切换LED的状态。
处理文件:
Micropython还提供了一个PYB模块,其中包含用于文件I/O操作的功能。这是您可以写入文件的方式:
with open('myfile.txt', 'w') as f:
f.write('Hello, MicroPython!')
这是您可以从文件中读取的方法:
with open('myfile.txt', 'r') as f:
print(f.read())
网络服务器:
Micropython甚至允许您创建一个简单的Web服务器来通过Internet控制或监视您的设备:
import socket
from machine import Pin
led = Pin(2, Pin.OUT)
def web_page():
if led.value():
gpio_state="ON"
else:
gpio_state="OFF"
html = """
<html>
<body>
<p>GPIO state: <strong>""" + gpio_state + """</strong></p>
</body>
</html>
"""
return html
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)
while True:
conn, addr = s.accept()
request = conn.recv(1024)
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()
此服务器使用一个简单的网页响应,显示LED的当前状态。
内置库
micropython包括一系列Python标准库,以及一些用于硬件访问的微拷贝特异性模块:
machine
模块:此模块包含与硬件和外围设备有关的功能,例如引脚,ADC,PWM,I2C,SPI等。
network
模块:如先前的示例所示,此模块允许您连接微部设备。
ujson
模块:类似于Python的JSON模块,它允许您使用JSON数据。
usocket
模块:提供用于网络的Python套接字模块的子集。
utime
模块:此模块提供时间访问和转换的功能。
uos
模块:提供文件和目录访问的功能,类似于Python的OS模块。
一些有用的Micropython工具
MU编辑器:与Micropython一起使用的简单Python编辑器。它可以直接连接到微控制器板并提供内置的替补。
Upycraft:专门为微py的专用IDE。它支持闪烁的固件到设备上,具有一个内置文件管理器,用于管理微控制器上的文件系统,并提供一个内置的替补。
rshell: Micropython的远程外壳允许在微控制器上传输和运行脚本。
mpfshell:一个简单的基于Shell的文件资源管理器。
示例项目:物联网温度计
让我们考虑一个简单的物联网项目,我们使用温度传感器(DS18B20)测量温度,然后通过MQTT发送此数据:
from machine import Pin
from time import sleep
import ds18x20
import onewire
import network
import umqtt.simple
# Connect to Wi-Fi
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect("<your ssid>", "<your password>")
while station.isconnected() == False:
pass
# Connect to the MQTT broker
client = umqtt.simple.MQTTClient("umqtt_client", "<broker_url>")
client.connect()
# DS18B20 data line connected to pin P10
ow = onewire.OneWire(Pin(10))
ds = ds18x20.DS18X20(ow)
roms = ds.scan()
while True:
ds.convert_temp()
sleep_ms(750)
for rom in roms:
temp = ds.read_temp(rom)
client.publish("temperature", str(temp))
sleep(60)
在此脚本中,我们首先连接到Wi-Fi,然后连接到MQTT代理。然后,我们每分钟读取传感器的温度,并将其发布到MQTT经纪人的“温度”主题。
。深度睡眠和节能:
使用微控制器使用Micropython的一个主要优点是能够将设备深度入睡,这对于电池供电的项目至关重要。当设备处于深度睡眠状态时,它会消耗大得多的功率。它可以通过计时器或外部中断唤醒。
from machine import Pin, deepsleep
# Put the device into deep sleep for 10 seconds
deepsleep(10000)
该设备将从深度睡眠中醒来,就好像已经重置了一样,它将从一开始就执行脚本。
显示数据:
Micropython支持几种类型的显示器。一种常见的类型是OLED显示,可用于显示传感器的文本,图形或数据。这是一个例子:
from machine import Pin, I2C
import ssd1306
i2c = I2C(scl=Pin(5), sda=Pin(4))
display = ssd1306.SSD1306_I2C(128, 64, i2c)
display.text('Hello, MicroPython!', 0, 0)
display.show()
此脚本初始化了OLED显示屏,并显示文本“ Hello,micropython!”在上面。
与Web API互动:
Micropython可以提出HTTP请求并与Web API进行交互。例如,它可以将数据发送到API,也可以从API检索和处理数据。
这是如何向API提出请求:
import urequests
response = urequests.get('https://api.example.com/data')
data = response.json()
print(data)
此脚本将get请求发送到“ https://api.example.com/data”,检索响应,并将其解析为JSON。
使用外部库:
除了内置的库外,Micropython还有一个外部库的生态系统,可以添加到您的项目中。其中包括用于特定传感器,显示器和其他硬件的库,以及用于云服务,协议和其他实用程序的库。
通常可以使用Ampy,rshell或通过REPL。
中断:
中断是Micropython中的一个强大功能,它允许程序立即响应某些事件。例如,在按下按钮时,您可以使用中断来触发函数调用:
from machine import Pin
def button_pressed(pin):
print("Button pressed!")
button = Pin(14, Pin.IN)
button.irq(trigger=Pin.IRQ_RISING, handler=button_pressed)
在此示例中,每当按下按钮时,button_pressed
函数将立即调用。
线程:
micropython用_thread模块支持基本的多线程,使您可以同时运行多个功能。请注意,线程可以使程序更加复杂,更难调试:
import _thread
import time
def task(name, delay):
while True:
print("Task", name)
time.sleep(delay)
_thread.start_new_thread(task, ("A", 1))
_thread.start_new_thread(task, ("B", 2))
此程序并行运行两个任务,该任务每1或2秒打印一次名称。
带有物联网平台的Micropython:
Micropython可以与AWS IoT,Google Cloud IoT等物联网平台集成。这些平台可以收集,处理,分析和可视化IoT数据,并且还提供了其他功能,例如设备管理,安全性等。<<<<<<<<。 /p>
这是向AWS IoT发布数据的示例:
from umqtt.simple import MQTTClient
import network
import machine
# Connect to WiFi
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect("<your ssid>", "<your password>")
while station.isconnected() == False:
pass
# Create MQTT client and connect to AWS IoT
client = MQTTClient(machine.unique_id(), "<aws-endpoint>", port=8883, keepalive=4000)
client.connect()
# Publish data
while True:
temperature = read_temperature() # Your function to read temperature
client.publish("sensors/temperature", str(temperature))
time.sleep(10)
在此示例中,设备连续读取温度并发布。
错误处理:
像Python一样,Micropython支持异常和错误处理。使用try/除了块,您可以预期并响应代码中的错误。这是一个例子:
try:
# Code that may raise an exception
x = 1 / 0
except ZeroDivisionError:
print("Cannot divide by zero!")
Micropython的Uasyncio库:
Micropython使用uasyncio
库支持异步I/O,这是Python的Asyncio库的最小实现。异步I/O对于管理可以阻止程序执行的任务,例如从传感器读取或等待网络数据。
这是如何使用uasyncio
眨眼LED而不使用time.sleep()
的示例:
import uasyncio as asyncio
from machine import Pin
led = Pin(2, Pin.OUT)
async def blink(led):
while True:
led.on()
await asyncio.sleep(1)
led.off()
await asyncio.sleep(1)
# Run the blink coroutine
loop = asyncio.get_event_loop()
loop.run_until_complete(blink(led))
微食的最佳实践:
评论您的代码:在使用硬件可以以非明显方式与物理元素交互的硬件时,这一点尤其重要。
处理异常:微控制器在现实世界中工作,事情可能会出错。异常处理有助于诊断和从错误中恢复。
保持简单: Micropython的环境的资源有限,因此为您的代码提供简单性和效率而努力。
重复使用并共享代码:在可能的情况下重复使用您自己的代码并利用社区库。如果您写了一个有用的库,请考虑与社区共享。
对低功率进行优化:许多微型应用程序都是电池供电的。使用节省动力的技术,例如深度睡眠,关闭不必要的外围设备等
资源:
官方的Micropython文档:官方文档是一种综合资源,可提供有关微部,其功能和模块的详细信息。对于任何想学习Micropython的人来说,这都是一个很好的起点。
Charles Bell的《物联网》的Micropython:这是一本综合书籍,对于那些喜欢结构化学习的人来说。它可以通过设置和编程硬件来使用Micropython。
Adafruit的Micropython教程: Adafruit是DIY电子产品的流行平台,具有一系列关于微py的教程,易于遵循。他们还出售与Micropython兼容的硬件。
链接:Adafruit MicroPython Tutorials
在线课程平台: Udemy,Coursera和LinkedIn等网站经常在Micropython上开设课程。
YouTube频道:有几个YouTube频道,这些YouTube频道在Micropython教程和项目指南上,例如Tim,Andreas Spiess等技术指南等。
论坛和社区群体:在线社区,例如官方的Micropython论坛,Stack Overflow和Reddit通常都有专门用于Micropython的线程。他们可能是提出问题并从他人那里学习的好地方。
github: github上的各种项目和库使用Micropython,提供了如何使用它的现实示例。
记住,最好的学习方法是做。一旦对Micropython有了基本的了解,就可以开始一个项目并学习。 Micropython为Python程序员提供了一个进入硬件和IoT设备领域的可能性。享受与Micropython的探索和建造!