1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

时间:2018-08-31 04:57:00

相关推荐

树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

树莓派4B-Python-基于rpi_ws281x库控制LED亮灭

树莓派4B-Python-基于rpi_ws281x库控制LED亮灭1、需求介绍2、参数介绍与工作原理3、小灯与树莓派4B接线:4、首先需要安装相关库:5、功能代码:6、视图界面:mainwindow_ledtest.py7、知识补充:8、总结:

1、需求介绍

1.2、 视图界面:运用PyQt编写小灯控制界面

1.3、 功能实现:使用树莓派4B控制LED灯实现多种颜色的变换亮灭,随意其亮度。

2、参数介绍与工作原理

小灯是一个集控制电路与发光电路于一体的智能外控LED光源,每个元件即为一个像素点。

LED_COUNT = 8,LED_PIN = 18, # GPIO接口 (PWM编码).LED_BRIGHTNESS = 255, # 设置LED亮度 (0-255)# 以下LED配置无需修改LED_FREQ_HZ = 800000, # LED信号频率(以赫兹为单位)(通常为800khz)LED_DMA = 10, # 用于生成信号的DMA通道(尝试5)LED_INVERT = False, # 反转信号(使用NPN晶体管电平移位时)LED_CHANNEL = 0

3、小灯与树莓派4B接线:

红色------5V

蓝色------GND

黄色------GPIO18

4、首先需要安装相关库:

4.1、在线安装:sudo pip install rpi-ws281x

4.2、直接安装:cd /home/pi/Desktop/rpi_ws281x-

sudo python3 setup.py install

4.3若没有安装pip的还得先安装pip:(装了则跳过此步骤)

sudo apt-get install python-pip在这里插入代码片

5、功能代码:

from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBoxfrom PyQt5.QtGui import QGuiApplication, QScreen, QColor, QPixmap, QMouseEvent, QFont, QFontInfo, QFontDatabasefrom PyQt5.QtCore import QEvent, Qt, QSize, QRect, QCoreApplication, QFile, QIODevice, QThread, pyqtSignalimport sysfrom mainwindow_ledtest import Ui_MainWindowimport timefrom rpi_ws281x import *import argparseclass MainWindow(QMainWindow, Ui_MainWindow):def __init__(self,LED_COUNT = 8,LED_PIN = 18, # GPIO接口 (PWM编码).LED_BRIGHTNESS = 255, # 设置LED亮度 (0-255)# 以下LED配置无需修改LED_FREQ_HZ = 800000, # LED信号频率(以赫兹为单位)(通常为800khz)LED_DMA = 10, # 用于生成信号的DMA通道(尝试5)LED_INVERT = False, # 反转信号(使用NPN晶体管电平移位时)LED_CHANNEL = 0):super(MainWindow, self).__init__()self.setupUi(self)self.LED_COUNT = LED_COUNTself.LED_PIN = LED_PINself.LED_BRIGHTNESS = LED_BRIGHTNESSself.LED_FREQ_HZ = LED_FREQ_HZself.LED_DMA = LED_DMAself.LED_INVERT = LED_INVERTself.LED_CHANNEL = LED_CHANNEL#self.color_R.setValue(255)self.light_up.setValue(255)conuts = 0self.location_text.setText(str(conuts))# 设置整体亮度 关闭LED为0 最亮为255 范围0-255# 该函数与下面的设置颜色都不会直接对LED进行修改,可以理解为将修改数据保存到缓存区。#strip.setBrightness(200)# Create NeoPixel object with appropriate configuration.# 当下拉索引发生改变时发射信号触发绑定的事件boBox.currentIndexChanged.connect (self.selectionchange)self.pushButton.clicked.connect(self.location_manage)

QComboBox类中的常用方法:

方法 描述

• :

意义

.addItem(string) #添加字符串项到Item

.addItems(list) #添加列表或元组元素到Item

.clear() #清除所有Item

.clearEditText() #清除编辑框内容

.count() #返回Item数目

.currentIndex() #返回当前选择索引,从0开始

.currentText() #返回当前选择内容

.insertItem(index,string) #插入字符串项到Item项index后

.insertItems(index,list) #插入列表或元组元素到Item项index后

.insertSeparator(index) #插入分隔符到Item项index后

.itemText(index) #返回Item项index的内容

.removeItem(index) #删除Item项index

.setCurrentIndex(index) #设置Item项index为当前选择

.setEditable(True) #设置选框可编辑

.setEditText(string) #设置编辑框内容

.setItemText(index,string) #设置Item项index内容为字符串值

QComboBox类中的常用信号

Activated 当用户选中一个下拉选项时发射该信号

currentIndexChanged 当下拉选项的索引发生改变时发射该信号

highlighted 当选中一个已经选中的下拉选项时,发射该信号

————————————————

def selectionchange(self):"""color 选择列表"""#返回Item项index的内容#.itemText(index)index = boBox.currentIndex()print(index)text = boBox.itemText(index)#print(text)if index == 0:self.color_R.setValue (255)self.color_G.setValue (0)self.color_B.setValue (0)elif index == 1:self.color_R.setValue (255)self.color_G.setValue (255)self.color_B.setValue (0)elif index == 2:self.color_R.setValue (0)self.color_G.setValue (0)self.color_B.setValue (255)elif index == 3:self.color_R.setValue (0)self.color_G.setValue (255)self.color_B.setValue (0)elif index == 4:self.color_R.setValue (255)self.color_G.setValue(255)self.color_B.setValue (255)readOnly = True #以上 控件元素为只读if index == 5:readOnly = False #其他为 可编辑 spin Boxself.color_R.setReadOnly (readOnly)self.color_G.setReadOnly (readOnly)self.color_B.setReadOnly (readOnly)# 设置整体亮度 关闭LED为0 最亮为255 范围0-255# 该函数与下面的设置颜色都不会直接对LED进行修改,可以理解为将修改数据保存到缓存区。# strip.setBrightness(200)def location_manage(self):'''位置处理'''location_info = self.location_text.text() #获取用户输入#aa =location_info.split("-")#print(aa)#for i in range(0,8,2):#print(i)#创建对象strip = Adafruit_NeoPixel(self.LED_COUNT, self.LED_PIN, self.LED_FREQ_HZ, self.LED_DMA, self.LED_INVERT, self.LED_BRIGHTNESS, self.LED_CHANNEL)# Intialize the library (must be called once before other functions).strip.begin() #初始化对象light = self.light_up.value()strip.setBrightness(int(light)) #设置LED亮度#for j in range(int(location_info)):#for i in range(0,strip.numPixels()):position =location_info.split(",") #采用‘,’分割控件输入内容,并返回一个列表print(position)for i in position: #遍历列表,获取列表中的每一个元素pos = i.split("-")#二次解析分割,minNum =0maxNum =0if len(pos) == 1: #判断列表中的元素为一项还是多项'''R = self.color_R.value()G = self.color_G.value()B = self.color_B.value()strip.setPixelColor(int(pos[0]),Color(int(R), int(G), int(B)))strip.show()'''minNum = int(pos[0])maxNum = int(pos[0])+1else:#position_a =location_info.split(",")minNum = int(pos[0])maxNum = int(pos[1])+1#for j in range(minNum,maxNum,1):print(j)R = self.color_R.value()G = self.color_G.value()B = self.color_B.value()strip.setPixelColor(int(j),Color(int(R), int(G), int(B)))#print( 'yellow LED light up')#strip.setPixelColor(int(location_info),Color(0,0,255)strip.show()if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

6、视图界面:mainwindow_ledtest.py

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'mainwindow_ledtest.ui'## Created by: PyQt5 UI code generator 5.15.4## WARNING: Any manual changes made to this file will be lost when pyuic5 is# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(467, 196)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 80, 451, 61))self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)self.horizontalLayout_3.setContentsMargins(6, 0, 11, 0)self.horizontalLayout_3.setSpacing(7)self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.locations = QtWidgets.QLabel(self.horizontalLayoutWidget)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(18)self.locations.setFont(font)self.locations.setObjectName("locations")self.horizontalLayout_3.addWidget(self.locations)self.location_text = QtWidgets.QLineEdit(self.horizontalLayoutWidget)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(14)self.location_text.setFont(font)self.location_text.setInputMask("")self.location_text.setText("")self.location_text.setObjectName("location_text")self.horizontalLayout_3.addWidget(self.location_text)self.horizontalLayout_6 = QtWidgets.QHBoxLayout()self.horizontalLayout_6.setObjectName("horizontalLayout_6")self.luminance = QtWidgets.QLabel(self.horizontalLayoutWidget)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(18)self.luminance.setFont(font)self.luminance.setObjectName("luminance")self.horizontalLayout_6.addWidget(self.luminance)self.light_up = QtWidgets.QSpinBox(self.horizontalLayoutWidget)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(16)self.light_up.setFont(font)self.light_up.setMaximum(255)self.light_up.setObjectName("light_up")self.horizontalLayout_6.addWidget(self.light_up)self.horizontalLayout_3.addLayout(self.horizontalLayout_6)self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(10, 10, 441, 71))self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0)self.horizontalLayout_5.setObjectName("horizontalLayout_5")self.colors = QtWidgets.QLabel(self.horizontalLayoutWidget_2)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(18)self.colors.setFont(font)self.colors.setAlignment(QtCore.Qt.AlignCenter)self.colors.setObjectName("colors")self.horizontalLayout_5.addWidget(self.colors)self.color_R = QtWidgets.QSpinBox(self.horizontalLayoutWidget_2)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(16)self.color_R.setFont(font)self.color_R.setFrame(True)self.color_R.setReadOnly(True)self.color_R.setAccelerated(True)self.color_R.setMaximum(255)self.color_R.setObjectName("color_R")self.horizontalLayout_5.addWidget(self.color_R)self.color_G = QtWidgets.QSpinBox(self.horizontalLayoutWidget_2)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(16)self.color_G.setFont(font)self.color_G.setReadOnly(True)self.color_G.setMaximum(255)self.color_G.setObjectName("color_G")self.horizontalLayout_5.addWidget(self.color_G)self.color_B = QtWidgets.QSpinBox(self.horizontalLayoutWidget_2)font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(16)self.color_B.setFont(font)self.color_B.setReadOnly(True)self.color_B.setMaximum(255)self.color_B.setObjectName("color_B")self.horizontalLayout_5.addWidget(self.color_B)boBox = QtWidgets.QComboBox(self.horizontalLayoutWidget_2)font = QtGui.QFont()font.setFamily("High Tower Text")font.setPointSize(14)font.setItalic(True)boBox.setFont(font)boBox.setObjectName("comboBox")boBox.addItem("")boBox.addItem("")boBox.addItem("")boBox.addItem("")boBox.addItem("")boBox.addItem("")self.horizontalLayout_5.addWidget(boBox)self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(190, 140, 93, 29))font = QtGui.QFont()font.setFamily("隶书")font.setPointSize(18)self.pushButton.setFont(font)self.pushButton.setObjectName("pushButton")self.horizontalLayoutWidget.raise_()self.horizontalLayoutWidget_2.raise_()self.pushButton.raise_()self.locations.raise_()MainWindow.setCentralWidget(self.centralwidget)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.locations.setText(_translate("MainWindow", "位置:"))self.luminance.setText(_translate("MainWindow", "亮度:"))self.colors.setText(_translate("MainWindow", "颜色:"))boBox.setItemText(0, _translate("MainWindow", "red"))boBox.setItemText(1, _translate("MainWindow", "yellow"))boBox.setItemText(2, _translate("MainWindow", "blue"))boBox.setItemText(3, _translate("MainWindow", "green"))boBox.setItemText(4, _translate("MainWindow", "white"))boBox.setItemText(5, _translate("MainWindow", "其他"))self.pushButton.setText(_translate("MainWindow", "开灯"))

7、知识补充:

QSpinBox

QSpinBox 和 QDoubleSpinBox 都是 QAbstractSpinBox 的子类,具有大多数相同的属性,只是参数类型不同。在 UI 设计器里进行界面设计时,就可以设置这些属性。 QSpinBox 和 QDoubleSpinBox 的主要属性见表 2。

QSpinBox 和 QDoubleSpinBox 的主要属性

属性名称 描述

prefix 数字显示的前缀,例如“$”

suffix 数字显示的后缀,例如“kg”

minimum 数值范围的最小值,如 0

maximum 数值范围的最大值,如 255

singlestep 单击右侧上下调整按钮时的单步改变值,如设置为 1,或 0.1

value 当前显示的值

displaylntegerBase QSpinBox 特有属性,显示整数使用的进制,

decimals QDoubleSpinBox 特有属性,显示数值的小数位数,例如 2 就显示两位小数

提示一个属性在类的接口中一般有一个读取函数和一个设置函数,如 QDoubleSpinBox 的 decimals 属性,读取属性值的函数为 int decimals(),设置属性值的函数为 void setDecimals(int prec)。

————————————————

# 创建NeoPixel对象

strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)

# 初始化库

strip.begin()

#设置整体亮度 关闭LED为0 最亮为255 范围0-255

#该函数与下面的设置颜色都不会直接对LED进行修改,可以理解为将修改数据保存到缓存区。

#strip.setBrightness(200)

#numPixels()函数介绍:取NeoPixel对象创建时设置的LED数量

for i in range(0,strip.numPixels()): #设置个循环(循环次数为LED数量)

# setPixelColor()函数介绍:设置LED色值(RGB).

#参数1:LED 的ID (从0开始, 比如第5个LED)

#参数2:RGB色值 Color()RGB转Color值,参数依次为R,G,B

#例子:设置第5个LED颜色为红色

# strip.setPixelColor(4, Color(255,0,0))

#该函数不会直接对LED进行修改,可以理解为将修改数据保存到缓存区。

strip.setPixelColor(i, Color(0,0,255))

#提交缓存区的修改数据到WS2812B,以显示效果

strip.show()

time.sleep(0.1) #延迟0.1秒

执行脚本sudo python ledtest.py

sudo thonny #需要管理员权限

————————————————

8、总结:

总结:

1、设计一个能使用户使用体验感十足的用户视图界面:GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。

顾名思义,绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。如果你需要让组件自动更新——这是很常见的需求,比如在最大化时,Word 总会把稿纸区放大,把工具栏拉长——就要自己编写相应的函数来响应这些变化。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。

针对这种变化的需求,Qt 提供了另外的一种机制——布局——来解决这个问题。你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。

2、在完成用户界面的同时,就需要来编写更加重要的功能逻辑代码,在这次编写程序的过程中,犯了很大的错误,就是在不了解需求的内在逻辑的情况下,就一味地去追求代码怎样具体的实现,一味地去追求一步到位,孰不知一开始便主次倒叙,导致的结果便是思维越加的混乱。吃一堑,长一智,在经后漫长的编码生涯中,在接到任务之前需要做到以下几点准备工作,以实现效率的提升代码更加的完美:

(1).编写设计文档

对,就是写下你的实现思路,而且最好能远离电脑,拿起笔来写。就像远离你的电脑,代码会写的更好说的那样,只有远离了电脑,你才会静下心来思考(不管采用什么方式,重点是让自己能够精心思考)。这样做的好处显而易见。

A:反复思考得出最优结果

每一次思考,每一次讨论,你的思维模式就会上升一个档次,你会发现,你考虑的比别人周到得多,最后得出的方案也比别人的要来的优秀。

B:加快今后的编码速度

当思考的方案在你的大脑中运行多次时,你已经会对它们相当熟悉,就像写过一遍一样,敲起键盘来当然更是胸有成竹了,虽然在文档上花了不少时间,但是这部分时间完全可以在今后的编码阶段节省回来,不信你可以去试试。

(2).绘制原理图

一图抵万言。特别是对于用于沟通的设计文档,文字越少越好。图形能表达最多的内容。工作原理图是一个方案的陈述方式。可以有一张,或者多张。这个是整个设计的中心。工作原理图,通常包括系统和外部直接的交互关系图,以及系统内部的组成结构图。这2种图,由方框和连线组成,方框表示模块,连线表示接口。需要标注各个接口和模块的名称,以及接口调用的主要顺序。画原理图,不仅仅画画,而是真正的设计。里面蕴含大量思辨,需要我们拟清各种概念。模块和接口命名,是思辨的体现。名不正则言不顺。围绕这个原理图,需要对个模块和接口进行说明,这个组成了所谓的设计正文。(需要修改的表格,需要更改的缓存,提高模块或代码的公用性)

(3).指定开发计划

做好了上面2点的准备,我们可以开始着手编码的问题了。但是在写代码之前,建议大家能够制定一个开发计划。这样做主要是在时间上能有一个节奏,而且你的代码也不是写一次就能成功的,是需要你反复地进行修改和测试。所以你有必要为今后的开发拟定一个计划纲要,以便你在不同的时间段完成相应的工作任务。

(4).指定测试计划

测试是一件非常重要的事情,尽管这事有专门的测试人员来做,但是我们作为程序员有必要保证自己的模块能在逻辑范围内正常运行,所以我们在开发前要准备好测试计划,包括可以写一些测试用例来对你的基础模块进行自动测试。

写出来的代码要进行自测,争取能够在测试过程中遍历到所有的代码行。该过程可以首先自己进行简单的语法和功能测试, 然后让专门的测试小组针对不同的预置状态对代码进行功能测试,保证代码中不出现逻辑上的错误。甚至部门可以抽出来一部分人来专门写功能脚本,进行自动化测试。这样能够针对不同的模块进行反复的测试,提高了工作效率。

3、在我们完成基本功能的同时,还需要考虑到那些地方还可替进行重构,哪些地方还可以行进一步的优化处理,方便在以后功能维护的时候进行修改,当然这个的前提便是不影响基本功能实现。重复代码就是不同地点,有着相同的程序结构。一般是因为需求迭代比较快,开发时担心影响已有功能,就复制粘贴造成的。重复代码很难维护的,如果你要修改其中一段的代码逻辑,就需要修改多次,很可能出现遗漏的情况,这也就需要我们想办法去优化这一部分代码。

————————————————

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。