文档章节

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

shaoziyang
 shaoziyang
发布于 2017/07/02 18:38
字数 1770
阅读 271
收藏 4
点赞 0
评论 0

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

如果你想节省自己和别人的时间,让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入门:能跑MicroPython开发板大盘点!

相信对于很多刚刚接触MicroPython的DIY创客来说,首先是被一些大神的作品吸引,然后有冲动自己动手,却发现入门很难,特别是面对各式各样的开发板不知如何选择。目前市面上关于MicroPython开...

bodasisiter
07/06
0
0
《micro:bit 入门指南》一书即将发行

由余波老师(全国著名的机器人专家和创客专家委员会委员)和我合作编写的《micro:bit 入门指南》一书即将由工信出版集团下的电子工业出版社发行。本书介绍了micro:bit的起源、功能、使用方法...

shaoziyang
2017/11/01
0
0
[Micropython]TPYBoard v10x拼插编程实验 点亮心形点阵

一、什么是TPYBoard开发板 TPYBoard是以遵照MIT许可的MicroPython为基础,由TurnipSmart公司制作的一款MicroPython开发板,它基于STM32F405单片机,通过USB接口进行数据传输。该开发板内置4...

bodasisiter
04/17
0
0
Micropython TPYBoard拼插编程之按键控制LED灯

一、什么是TPYBoard开发板 TPYBoard是以遵照MIT许可的MicroPython为基础,由TurnipSmart公司制作的一款MicroPython开发板,它基于STM32F405单片机,通过USB接口进行数据传输。该开发板内置4...

bodasisiter
04/18
0
0
Micropython之萝卜狗远程门禁控制系统

  * 本文作者:_橙子 ゝ,本文属FreeBuf原创奖励计划,未经许可禁止转载   当代社会,我们进公司需要门禁卡,出入小区需要门禁卡,门禁系统又称出入管理控制系统(ACCESS CONTROL SYSTEM)...

FreeBuf
05/24
0
0
TPYBoard—MicroPython开发板免费试用!你最想抱走哪款?

  TPYBoard开发板自上市开售以来,受到了广大硬件及MicroPython爱好者的一致好评,许多人提出想试用开发板的申请。为此,TPYBoard特推出多款开发板免费试用活动,感兴趣的朋友抓紧申请吧!...

bodasisiter
2017/10/24
0
0
第一款Micropython图形化编辑器—Python Editor

当你看到这篇文章的时候,显然你已经阅读了很多类似的文章,那么本篇文章会深入讲解一些新手的需求,提供详细的建议,当然我不会告诉你具体怎么做,一切答案都是肤浅的。 就拿我自己来说,初...

bodasisiter
04/23
0
0
精彩源于起点——2018年潍坊市首次青少年Python编程公开课

有一种语言叫计算机语言 I want to talk with Computer 春遇到冬,有了岁月 天遇到地,有了永恒 我们拥有的, 不止是长大, 还有那份长大的悲欢经历。 未来会有很多可能, 但一切源于万象开始...

bodasisiter
05/07
0
0
Micropython TturnipBit 体感遥控车

所需器材:  TurnipBit开发板 一块  下载数据线 一条  智能小车套件 一套(底盘、车轮、电机等)  超声波模块(HC-SR04)一个(用作小车的“眼睛”)  L298N电机驱动模块 一个  ...

bodasisiter
05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
9分钟前
0
0
upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
20分钟前
0
0
Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
27分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
29分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
33分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
40分钟前
1
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
55分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
今天
17
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
今天
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部