【雕爷学编程】MicroPython手册之内置模块 Counter

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述
MicroPython的内置模块Counter是一个用于计数的模块,它可以用来统计某个事件发生的次数,或者测量某个时间段内的频率。它的主要特点是:

1、它可以创建一个Counter对象,用于存储和操作计数值。
2、它可以使用start()、stop()、reset()等方法来控制计数器的运行状态。
3、它可以使用value()方法来获取当前的计数值,或者使用callback()方法来注册一个回调函数,在计数器达到某个阈值时执行。
4、它可以使用freq()方法来设置或获取计数器的频率,即每秒钟增加的计数值。
5、它可以使用period()方法来设置或获取计数器的周期,即计数器达到多少时重置为零。

Counter模块的应用场景有:

1、用于测量外部信号的频率,例如脉冲信号、音频信号等。
2、用于生成定时器或定频器,例如闹钟、节拍器等。
3、用于实现PWM(脉冲宽度调制)功能,例如控制LED灯的亮度、电机的速度等。

Counter模块的注意事项有:

1、Counter模块依赖于硬件定时器,不同的MicroPython板子可能有不同数量和类型的定时器,需要查看具体的文档12来确定可用的定时器编号和参数范围。
2、Counter模块使用的定时器可能与其他功能冲突,例如ADC(模拟数字转换)、DAC(数字模拟转换)、Servo(舵机控制)等,需要避免同时使用同一个定时器。
3、Counter模块使用的回调函数是硬件中断,需要尽量简短和快速,避免执行复杂或耗时的操作,以免影响系统性能和稳定性。

以下是MicroPython的内置模块Counter的几个实际运用程序案例:

案例一:测量脉冲信号的频率

# 导入Counter模块
from machine import Counter

# 创建一个Counter对象,连接到X1引脚,设置为上升沿触发
counter = Counter(1, pin='X1', edge=Counter.RISING)

# 启动计数器
counter.start()

# 等待一秒钟
time.sleep(1)

# 停止计数器
counter.stop()

# 获取计数值
value = counter.value()

# 计算频率,单位为赫兹
freq = value / 1

# 打印结果
print('The frequency is', freq, 'Hz')

案例二:生成闹钟功能

# 导入Counter和LED模块
from machine import Counter, LED

# 创建一个Counter对象,设置为1秒钟触发一次
counter = Counter(2, freq=1)

# 创建一个LED对象,连接到板载蓝色LED灯
led = LED(4)

# 定义一个回调函数,在计数器触发时执行
def alarm(t):
    # 获取当前时间
    hour, minute, second = time.localtime()[3:6]
    # 如果时间是8点整,则闪烁LED灯10次,并打印提示信息
    if hour == 8 and minute == 0:
        for i in range(10):
            led.toggle()
            time.sleep(0.5)
        print('Wake up!')
    # 否则,什么也不做
    else:
        pass

# 注册回调函数
counter.callback(alarm)

# 启动计数器
counter.start()

案例三:实现PWM功能

# 导入Counter和Pin模块
from machine import Counter, Pin

# 创建一个Counter对象,设置为1000赫兹的频率,50%的占空比
counter = Counter(3, freq=1000, duty=50)

# 创建一个Pin对象,连接到X2引脚,设置为输出模式
pin = Pin('X2', Pin.OUT)

# 将计数器的输出信号连接到引脚
counter.connect(pin)

# 启动计数器
counter.start()

# 等待5秒钟
time.sleep(5)

# 停止计数器
counter.stop()

这个程序可以实现PWM功能,即用一定频率和占空比的方波信号来控制引脚的电平。这样可以用来调节LED灯的亮度,或者电机的速度等。你可以尝试修改freq和duty参数来改变输出信号的特性。

案例四:计算列表中元素的频率:

from collections import Counter

# 统计列表中元素的频率
numbers = [1, 2, 3, 2, 1, 3, 4, 5, 1, 2, 3]
number_count = Counter(numbers)

# 输出每个元素的频率
for number, count in number_count.items():
    print(f"{number}: {count}")

在这个示例中,我们使用collections模块的Counter类统计了列表numbers中元素的频率。Counter类会返回一个字典,其中键是列表中的元素,值是该元素在列表中出现的次数。我们遍历字典,并打印出每个元素的频率。输出结果为:

1: 3
2: 3
3: 3
4: 1
5: 1

案例五:合并多个计数器:

from collections import Counter

# 合并多个计数器
counter1 = Counter({'a': 3, 'b': 2, 'c': 1})
counter2 = Counter({'a': 1, 'b': 2, 'd': 3})
merged_counter = counter1 + counter2

# 输出合并后的计数器
for item, count in merged_counter.items():
    print(f"{item}: {count}")

在这个示例中,我们使用collections模块的Counter类创建了两个计数器counter1和counter2,分别表示不同的计数信息。通过使用加号运算符,我们将两个计数器合并成一个新的计数器merged_counter。最后,我们遍历合并后的计数器,并打印出每个元素的频率。输出结果为:

a: 4
b: 4
c: 1
d: 3

案例六:查找列表中出现次数最多的元素:

from collections import Counter

# 查找列表中出现次数最多的元素
fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'grape', 'banana']
most_common_fruit = Counter(fruits).most_common(1)

# 输出出现次数最多的元素
if most_common_fruit:
    fruit, count = most_common_fruit[0]
    print(f"The most common fruit is '{fruit}' with count {count}.")
else:
    print("No elements found.")

在这个示例中,我们使用collections模块的Counter类统计了列表fruits中每个元素的频率,并使用most_common()方法找到出现次数最多的元素。该方法返回一个包含元素及其频率的列表,我们可以通过索引访问第一个元素。最后,我们打印出出现次数最多的元素及其频率。如果列表为空,我们会输出"No elements found."。输出结果为:

The most common fruit is 'banana' with count 3.

这些实际运用程序案例展示了使用MicroPython内置模块Counter的功能。通过使用Counter类,可以方便地计算元素的频率,合并多个计数器以及查找出现次数最多的元素。Counter类提供了一种简单而强大的方式来处理频率计数和统计分析的任务。

案例七:使用 Counter 统计列表中元素出现次数

from collections import Counter

# 列表数据
data = [1, 2, 3, 1, 2, 1, 3, 4, 5, 2, 1]

# 统计元素出现次数
counter = Counter(data)

# 获取元素出现次数最多的两个元素
most_common = counter.most_common(2)

# 打印结果
print("元素出现次数:", counter)
print("出现次数最多的两个元素:", most_common)

在这个例子中,我们使用 collections 模块中的 Counter 类创建了一个计数器 counter。我们有一个包含重复元素的列表 data,通过使用 Counter 统计列表中各个元素的出现次数。通过 most_common() 方法,我们获取了出现次数最多的两个元素及其对应的出现次数。最后,我们打印了元素出现次数和出现次数最多的两个元素。

案例八:使用 Counter 统计字符串中字符出现次数

from collections import Counter

# 字符串数据
text = "abracadabra"

# 统计字符出现次数
counter = Counter(text)

# 获取字符出现次数最多的两个字符
most_common = counter.most_common(2)

# 打印结果
print("字符出现次数:", counter)
print("出现次数最多的两个字符:", most_common)

在这个例子中,我们使用 collections 模块中的 Counter 类创建了一个计数器 counter。我们有一个字符串 text,通过使用 Counter 统计字符串中各个字符的出现次数。通过 most_common() 方法,我们获取了出现次数最多的两个字符及其对应的出现次数。最后,我们打印了字符出现次数和出现次数最多的两个字符。

案例九: 使用 Counter 合并多个计数器

from collections import Counter

# 计数器 1
counter1 = Counter([1, 2, 3, 1, 2, 1])

# 计数器 2
counter2 = Counter([2, 3, 4, 2, 1])

# 合并计数器
merged_counter = counter1 + counter2

# 打印结果
print("合并计数器:", merged_counter)

在这个例子中,我们使用 collections 模块中的 Counter 类创建了两个计数器 counter1 和 counter2。每个计数器都统计了一组元素的出现次数。通过使用加法运算符 +,我们将两个计数器进行合并,得到了一个包含合并结果的新计数器 merged_counter。最后,我们打印了合并计数器的结果。

这些示例展示了在 MicroPython 中使用 Counter 类的实际应用。Counter 可以用于统计元素出现次数、统计字符出现次数以及合并多个计数器等场景。通过利用 Counter,你可以更方便地进行元素计数和统计分析。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值