文档章节

在MicroPython中用面向对象方法控制microbit显示

shaoziyang
 shaoziyang
发布于 2017/07/02 18:38
字数 1770
阅读 280
收藏 4

据拉里·沃尔(一位非常著名的程序员)说,懒惰是一种美德。懒惰的程序员提出节省劳力的解决方案。

如果你想节省自己和别人的时间,让micropython代码易于重复使用、阅读。

本文假设您已经熟悉对象、类和组合的概念,并且知道如何用Python编写类定义。如果您不熟悉Python的对象定位(O O),您可能会发现代码很难遵循。我在本文后面对O作了简短的介绍。

有几种学习Python的方法。这里有一个“官方”教程,但是我不确定初学者是否会觉得很容易理解。有一本看起来不错的书。它需要大量的时间和金钱投入,但是我认为如果你需要提高你的Python技能是值得的。

我可能会着手写我自己的介绍,但这是一个重大项目,需要一段时间。现在,即使您不熟悉O,也应该能够跟踪大多数文章并运行示例代码。

Python(micropython)对物理计算非常有用
 

  • Python是当之无愧的物理计算应用中一个非常流行的语言。
  • Python很容易学习,它很有表现力,可以在Linux、Mac OS和微软Windows上免费使用。
  • Python让树莓派充满活力,大量代码树莓派的代码都是用Python实现的。
  • 最近,micropython带来了语言的几个流行的单片机平台,包括BBC microbit。


但…

大多数已发表micropython脚本使用Python程序风格。大多数程序员都是这么开始的,它是教程中使用最广泛的一种风格。

当以程序式编程时,您可以逐步地完成计算机所希望的工作,而程序则是指定这些步骤的过程。

值得探索其他编程风格,在本文中,您将看到如何开发一个简单的Python应用程序,它可以使用面向对象风格。在面向对象的程序中,通过创建对象来编程,即将数据和代码结合起来执行简单任务的小程序包。为了进行更复杂的任务,对象相互协作(相互交互)。通过编写类的定义,指定特定对象的类型(数据)和它能做什么(方法),指定程序所需的对象类型。

您可以看到运行的应用程序:




 

这个想法很简单。应用程序使用microbit的LED点阵显示计数器的值,并且可以通过使用按钮来更改它。稍后,您将看到如何将这个简单的想法应用于实际项目中。

您可以用简短的脚本实现演示,但脚本的组成部分在其他应用程序中不易使用。

以下是一些可能需要实现的变化,而不必从scratch开始:

  • 使用 LED 灯柱显示
  • 显示当前光线等级或温度
  • 一个时钟样式,当参数上升到9时跳到0
  • 使用不同类型LED的类似显示器
  • 一次只打开一个LED显示值的显示器
  • 用不同颜色的显示不同值的显示器


当然,您可以通过创建原始脚本的多个变体来实现这一点,但如果您在原始脚本中发现了bug,那么会发生什么?你必须在每一份拷贝上做同样的修改!

这就是为什么有经验的程序员试图避免代码重复拷贝的原因之一。甚至有一个缩写词可以帮助你记住它:DRY(Don’t repeat yourself),代表“不要重复你自己”。

还有一个很好的理由,可以用简单的组件来编写代码。每个组件都很容易自己测试。这可以帮助您避免bug,跟踪并删除任何在代码中爬虫。


让我们开始编码

您将需要查看按钮的代码,并告诉应用程序中的计数器在按下其中一个按钮时计数或向上或向下计数。

没有必要用一个类来实现它。

应用程序代码中创建和SimpleDisplayer实例连在一起的计数器,以达到预期的结果。

max_count = 10
disp = SimpleDisplayer()
counter = Counter(disp, max_count)
while True:
   if button_a.is_pressed():
       counter.up()
   if button_b.is_pressed():
         counter.down()
   sleep(200)

最后一部分应该是不言自明的。它创建了一个SimpleDisplayer和计数器的代码。让我们从计数器开始。

Counter类

在这个应用程序中,计数器是一个简单的对象,它知道它的当前计数,并且可以在它的初始值为零和某些最大值之间上下计数。在我们的例子中,最大值是10。

计数器知道另一个对象,每当计数器的值发生变化时就会被通知。最初,这将是一个SimpleDisplayer对象并在microbit上显示。

下面是计数器类的代码:

class Counter():
  # count ranges from 0 to max.
  # when the count changes disp (the displayer) is notified
  def __init__(self, disp, max):
      self._disp = disp
      self._max = max
      self._count = 0

  def update(self):
      self._disp.value(self._count)

  def up(self):
      if self._count < self._max:
          self._count += 1
          self.update()

  def down(self):
      if self._count > 0:
          self._count -= 1
          self.update()

计数器向显示器发送消息,这是一个SimpleDisplayer使用内置的LED显示数值的代码:

# SimpleDisplayer shows the latest value on the micro:bit's LEDs
class SimpleDisplayer():
      def value(self, num):
          display.show(str(num))

 

面向对象编程易于更改

这种方法使我们的应用程序很容易适应一个代码的变化。假设您希望使用类似于Proto-pic EDGE的LED阵列显示计数器的当前状态。

下面是运行的新版本:

下面是驱动修订应用程序的代码:
 

from microbit import *
import neopixel

...

max_count = 10
leds = neopixel.NeoPixel(pin0, max_count)
disp = BarGraph(leds, BarGraph.YELLOW)
counter = Counter(disp, max_count)
while True:
   if button_a.is_pressed():
       counter.up()
   if button_b.is_pressed():
       counter.down()
   sleep(200)

最后一部分不变。使用了两个新的类的代码:neopixel和BarGraph。

neopixel类是microbit的micropython版的一部分,所以我们只需要导入neopixel模块。BarGraph是我们应用程序新的部分,我们需要写它的定义并插入到上面。

这里是BarGraph类的代码:

# BarGraph uses an array of Neopixels or other similar LEDs
# to show the latest value
class BarGraph():
    # colo(u)r constants.
    # we use low values so the we don't strain the micro:bit's power supply
    WHITE  = (50,50,50)
    RED    = (50,0,0)
    BLUE   = (0,0,50)
    GREEN  = (0,50,0)
    YELLOW = (100,50,0)
    CLEAR  = (0,0,0)
    def __init__(self, leds, on_colour=WHITE):
        self._leds = leds
        self._count = len(leds)
        self._on_colour = on_colour

    def value(self, num):
        for i in range(self._count):
           if i < num:
               self._leds[i] = self._on_colour
           else:
               self._leds[i] = self.CLEAR
           self._leds.show()

应用程序代码(前面所示)创建实例并将和计数器和BarGraph连接起来,从而达到预期的结果。

模块化代码更容易更改。在这篇文章的下一部分,我们将看到改变光感应LDR的输入和添加更多的颜色到BarGraph显示。

我们还将看到这种方法的另一个主要好处:易于测试。

 

翻译自:http://blog.rareschool.com/2017/04/program-proto-pic-edge-using-o-o.html

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
shaoziyang
粉丝 11
博文 75
码字总数 25881
作品 0
武汉
程序员
人生苦短,用 RT-Thread MicroPython 享受编程的乐趣

在 i.MX RT1050 EVK 开发板上实现这样的一个读取板载的 6 轴传感器信息和系统 CPU 利用率等信息,实时显示到网页中效果,你猜需要多少代码? 事实上 RT-Thread 的同事利用 RT-Thread MicroP...

RTThread物联网操作系统
05/02
0
0
[MicroPython]TPYBoard开发板STM32F407超声波测距

1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法。 2. 进一步学习编制数据输出程序的设计方法。 3. 学习超声波模块的测距原理。 4. 学习LCD5110接线方法 5. 学习 F407 Micropython开发...

bodasisiter
08/18
0
0
零基础如何优雅入门“网红”Python?小白必看的MicroPython视频合集:从入门到精通!

零基础如何优雅入门“网红”Python?小白必看的MicroPython视频合集:从入门到精通! 若问时下最火的一门编程语言是什么?答案一定是Python。 就连高考都开始考Python啦! 这把火已经烧到了程...

bodasisiter
09/10
0
0
MicropPython的学习,如何从0到1?

是Java还是C++ ? 是Go还是Python? 你为你最爱或者最熟悉的编程语言打Call了吗? Python在国外是一门非常热门的编程语言,近些年在国内也被发掘与追捧, Python的开放、简洁、黏合正符合了现发...

bodasisiter
今天
0
0
[MicroPython]STM32F407开发板驱动OLED液晶屏

1.实验目的 1.学习在PC机系统中扩展简单I/O 接口的方法。 2.进一步学习编制数据输出程序的设计方法。 3.学习 F407 Micropython开发板控制OLED显示字符。 2.所需元器件 F407 Micropython开发板...

bodasisiter
08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Golang做了一个命令行贪吃蛇游戏

用Golang做了一个命令行贪吃蛇游戏 项目介绍 项目链接:https://gitee.com/lwow2025/snake-go 最近看了一本做几个小项目的书,突然就想用Golang做一个命令行贪吃蛇,也没啥特殊原因。 软件架...

Mediv
18分钟前
0
0
storm的利用并行度提高处理速度的经验

在storm的流计算框架中,在数据量非常大或者计算逻辑比较复杂的情况下,可能会造成处理速度变慢的情况,最后反而不满足了系统的处理要求,因此这里讨论一下。本文的内容是我在storm的使用过程...

飓风2000
27分钟前
0
0
课程推荐|深入浅出区块链博主:全栈区块链开发者的4堂必修课(线上优惠)

Tiny熊从2017年开始更新“深入浅出区块链”博客,在第一篇文章中,关于如何系统学习区块链技术,他这样描述:“从事区块链开发也有很多方向,如:区块链应用开发人员、区块链架构师、底层核心...

HiBlock
39分钟前
0
0
激活win10 亲测有效

1.首先,我们先查看一下Win10正式专业版系统的激活状态: 点击桌面左下角的“Windows”按钮,从打开的扩展面板中依次点击“设置”-“更新和安全”,并切换到“激活”选项卡,在此就可以查看到...

可达鸭眉头一皱
41分钟前
0
0
SpringWind180926

SpringWind SpringWind项目代码学习笔记 /SpringWind/src/main/webapp/WEB-INF/views/login.html 第15行action="#springUrl('/account/login.html')"【为什么是#springUrl】 第4行<a class=......

颖伙虫
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部