用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片

奇奇老师,武汉大学软件工程硕士,有着十几年的软件开发工程经验。

今天我们说一说用用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片。

1. Pygame库介绍

Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


Pygame是一套用来写游戏的Python模块。它是基于SDL库的,它使你可以用Python语言创建完全界面化的游戏和多媒体程序。Pygame可以运行在几乎所有的平台和操作系统上。

2.本文用pygame用来显示图片

pygame.image.load(filename)).convert()

screen.blit(img,imgpos)

pygame.display.update()


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


convert函数是将图像数据都转化为Surface对象,每次加载完图像以后就应该做这件事件(事实上因为 它太常用了,如果你不写pygame也会帮你做);convert_alpha相比convert,保留了Alpha 通道信息(可以简单理解为透明的部分)。

blit是个重要函数,第一个参数为一个Surface对象,第二个为左上角位置。画完以后一定记得用update更新一下,否则画面一片漆黑。

3、gpio来控制led灯的颜色

GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态(是高电平或是低电平)。GPIO是个比较重要的概念,可以通过GPIO口和硬件进行数据交互,控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如开关)等。

本文用的是输出。

GPIO.output(pins[i], GPIO.HIGH)

然后通过下面的命令来控制灯的亮灭:

p_R.ChangeDutyCycle(R_val)


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


4、本文要实现的是


用树莓派学python-用gpio控制led灯的颜色用pygame显示对应的图片


代码如下:

<code>import RPi.GPIO as GPIO
import pygame
import sys
import os
pins = {'pin_R':11, 'pin_G':12}
GPIO.setmode(GPIO.BOARD)
colors = [0xFF00, 0x00FF]
for i in pins:
GPIO.setup(pins[i], GPIO.OUT) # Set pins' mode is output
GPIO.output(pins[i], GPIO.HIGH) # Set pins to high(+3.3V) to off led
p_R = GPIO.PWM(pins['pin_R'], 2000) # set Frequece to 2KHz
p_G = GPIO.PWM(pins['pin_G'], 2000)
p_R.start(0) # Initial duty Cycle = 0(leds off)
p_G.start(0)
#初始化pygame
pygame.init()
#创建舞台,利用Pygame中的display模块,来创建窗口
screen = pygame.display.set_mode((800,600),pygame.DOUBLEBUF,0)
screen.fill([255,255,255])
font = pygame.font.SysFont("microsoftyaheiui",20)
# 生成文字
text = font.render(u"神奇钥匙,为你打开成长之门!",1,(255,0,0))
# 取得文本区域大小 我这里是将
textpos = text.get_rect()
textpos.y = screen.get_rect().bottom - textpos.bottom + textpos.top
#
textpos.x = screen.get_rect().right - textpos.right + textpos.left
#设置窗口标题
pygame.display.set_caption("红灯绿灯")
filename = "greenLed.png"
#然后更新舞台显示
pygame.display.flip()
def setColor(col): # For example : col = 0x112233
R_val = (col & 0x1100) >> 8
G_val = (col & 0x0011) >> 0
#p_R.ChangeDutyCycle(R_val) # Change duty cycle

p_R.ChangeDutyCycle(R_val) # Change duty cycle
p_G.ChangeDutyCycle(G_val)
def loop():
global filename
while True:
screen.blit(text,textpos)
for event in pygame.event.get():
if event.type == pygame.QUIT:
destroy()
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT or event.key == ord('d'):
if(filename == "redLed.png" ):
filename = "greenLed.png"
col = colors[1]
else:
filename = "redLed.png"
col = colors[0]
setColor(col)
screen.fill([255,255,255])
img = pygame.image.load(filename)
imgpos = img.get_rect()
imgpos.centery = screen.get_rect().centery
imgpos.centerx = screen.get_rect().centerx
screen.blit(img,imgpos)
pygame.display.update()
def destroy():
p_R.stop()
p_G.stop()
for i in pins:
GPIO.output(pins[i], GPIO.HIGH) # Turn off all leds
GPIO.cleanup()
if __name__ == "__main__":
try:
loop()
except KeyboardInterrupt:
destroy()
/<code>


分享到:


相關文章: