Micropython 101 IoT基础知识
#教程 #python #micropython #iot

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的人来说,这都是一个很好的起点。

链接:MicroPython Documentation

Charles Bell的《物联网》的Micropython:这是一本综合书籍,对于那些喜欢结构化学习的人来说。它可以通过设置和编程硬件来使用Micropython。

链接:MicroPython for the Internet of Things: A Beginner’s Guide to Programming with Python on Microcontrollers

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的探索和建造!