MicroPython目录
MicroPython是Python 3的一个精简实现,可运行于单片机中。对于很多嵌入式开发者来说,MicroPython可以看作是一个能够用Python编写嵌入式程序的替代品,使用Python语法可以直接控制硬件。
MicroPython社区为了能够让更多开发者轻松使用MicroPython,同时也为了更好地推广和宣传MicroPython,开发了(和正在开发)一些面向入门和初学者的教程。
链接: MicroPython中文文档
-【MicroPython】环境和花样点灯
文章目录
一、环境搭建
1.1 下载相应固件与thonny
1.2 下载thonny
thonny官网下载,或pip下载
pip install thonny
1.3 thonny使用
见博客保姆级超详细 ESP8266 MicroPython 部署攻略、
以及超详细 ESP32 MicroPython 部署攻略
同样移远模组的QuecPython也可用thonny作为编辑器
二、machine.py库简单介绍
在MicroPython中,machine.py是一个重要的模块,它提供了操作底层硬件的函数和类,使得在MicroPython中可以直接操作硬件设备。
下面是一些常用的函数和类:
Pin类
Pin类用来控制和读取GPIO引脚的状态。可以使用它来设置GPIO引脚的输入和输出状态,以及使用它来读取当前引脚的状态。
ADC类
ADC类用于读取模拟输入的电压值。可以使用它来读取模拟传感器的数据,例如光敏电阻、温度传感器等。
PWM类
PWM类用来产生PWM波形。可以用它来控制马达的运转速度、LED灯的亮度等。
Timer类
Timer类用来设置计时器,可以用它来生成定时器中断,用于实现周期性的任务。
I2C类
I2C类用于控制I2C总线,可以使用它来与I2C设备通信。
总之,machine.py为MicroPython提供了丰富的硬件操作函数和类,使得开发者可以简单地实现底层硬件的控制。
三、花式点灯大师
3.1简单点灯
from machine import Pin
led = Pin(11, Pin.OUT)
#只针对IO口接入阳极的发光二极管
led.on() #高电平
led.off() #低电平
#直接改变IO口高低电平
led.value(1)#高电平
led.value(0)#低电平
led.value()#获取电压
3.2实现取反点灯
通过3.1的基本操作可实现根据电平状态取反,操作led
from machine import Pin
led = Pin(11, Pin.OUT)
led.value(not led.value.value())
3.3实现PWM闪烁
在micropython中pwm操作和IO口一样简单
from machine import Pin
from machine import PWM
led = PWM(Pin(11))
led.duty(50) #占空比
led.freq(1) #频率,周期等于频率分之一
3.4实现PWM呼吸
通过改变pwm占空比的增加和减少,加入循环。可增加循环次数改变呼吸的时常
from machine import Pin
from machine import PWM
import time
led = PWM(Pin(11))
while True:
for i in range(511):
# 逐渐增加PWM的占空比,实现LED的呼吸灯效果
led.duty(i)
time.sleep(0.002)
for i in range(511, 0, -1):
# 逐渐减小PWM的占空比,实现LED的呼吸灯效果
led.duty(i)
time.sleep(0.002)
3.5实现点灯类
1.将所有方法封装为类,方便调用;2.LED不一定高电平点亮;将io输出作为一个基类方便扩展外设,如继电器等。
from machine import Pin
from machine import PWM
import time
class PinOutBSP:
def __init__(self, gpio, anode=True):
"""
初始化BSP对象,指定引脚控制是否高电平控制还是低电平控制
Args:
gpio: 引脚
anode: 控制电平
"""
self.gpio = gpio
self.anode = anode
self.pin = None
# 根据电平控制的不同,初始化状态
if self.anode:
self.onvalue = 1
self.offvalue = 0
else:
self.onvalue = 0
self.offvalue = 1
# 初始化
self.init()
def init(self):
self.pin = Pin(self.gpio, Pin.OUT)
self.off()
def deinit(self):
self.pin.deinit()
def on(self):
self.pin.value(self.onvalue)
def off(self):
self.pin.value(self.offvalue)
def flip(self):
# 取反状态
self.pin.value(not self.pin.value())
def getstat(self):
# 根据电平控制不同,得到状态
pinstats = self.pin.value()
if (pinstats and self.anode) or (not pinstats and not self.anode):
print(f'{type(self).__name__} on') #类名 + on
return True
else:
print(f'{type(self).__name__} off')#类名 + off
return False
class Led(PinOutBSP):
#硬件资源
left = 10 #USB左侧蓝灯
right = 11 #USB右侧蓝灯
def __init__(self, gpio, anode=True):
super().__init__(gpio, anode)
# 举例
class Relays(PinOutBSP):
#硬件资源
Relay1 = 12
Relay2 = 13
def __init__(self, gpio, anode=False):
super().__init__(gpio, anode)
def timed_on(self, time_on, time_off):
if super().getstat():
time.sleep(time_off)
super().off()
else:
time.sleep(time_on)
super().on()
实例化使用
led1 = Led(Led.right)
time.sleep(5)
led1.on()
led1.getstat()#获得LED状态
time.sleep(5)
led1.off()
led1.getstat()
打印
Led on
Led off
总结
本文仅仅简单介绍了micropython中Led相关库使用,并且用python语法中类的特性对led进行封装。
优点:
- Micropython中Led库简单易用,适合初学者快速掌握;
- 对Led进行封装,使得代码更加规范、清晰,易于维护和重用;
- Python语法中的类特性使得代码结构更加清晰,易于理解和扩展。
缺点:
-
本文示例较为简单,对于一些高级应用场景,Led库的功能可能会受到限制;
-
这种基于Python语法的开发方式,可能会使一些底层硬件相关的操作受到影响,导致性能方面的问题;
当开发规模较大、功能较复杂的项目时,可能需要更高级的开发工具和技术,例如C/C++等。