Ich knuspere schon wieder an meinem LCD-Display herum. Ich baue gerade für einen Freund bei einer Veranstaltung einen RPi, der bei GPIO-Input den Pacman-Sound abspielt und die Zeit misst. Das klappt auch alles ganz gut, nur wenn ich die vergangene Zeit in eine Variable packe und an das LCD senden will, meckert er folgendes:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/pi/Desktop/Marvins Pacman-Boulder/mastercode.py", line 66, in <module>
Stopwatch()
File "/home/pi/Desktop/Marvins Pacman-Boulder/mastercode.py", line 59, in Stopwatch
lcd.lcd_display_string(elapsing_time, 4)
File "/usr/lib/python2.7/lcddriver.py", line 108, in lcd_display_string
for char in string:
TypeError: 'float' object is not iterable
Code: Alles auswählen
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import alsaaudio #sudo apt-get install python-alsaaudio
import pygame
import lcddriver
#Initialisieren des LCD-Treibers
lcd = lcddriver.lcd()
lcd.lcd_clear()
#Vorarbeit pygame für Soundwiedergabe
lcd.lcd_display_string("Laden der Musik...", 1)
pygame.init()
pygame.mixer.music.load('/home/pi/Desktop/Marvins Pacman-Boulder/Pac-Man-Theme-Song.mp3')
#Setzen der PCM-Lautstärke auf 100
m = alsaaudio.Mixer('PCM')
m.setvolume(100)
current_volume = m.getvolume()
lcd.lcd_display_string("Volume set to 100\45", 2)
#Initalisieren der benötigten GPIO-Pins
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(18, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
lcd.lcd_display_string("GPIO 17 and 18 ready", 3)
#Setzen der Variablen
startcounter = 0
stopcounter = 1
runningwatch = 0
lcd.lcd_display_string("Variablen definiert", 4)
time.sleep(2)
lcd.lcd_clear()
lcd.lcd_display_string("Nearly ready...", 1)
time.sleep(3)
#Definitionen
def StandbyScreen():
lcd.lcd_backlight("on")
lcd.lcd_clear()
lcd.lcd_display_string(" Marvin`s", 1)
lcd.lcd_display_string(" PacMan-Boulder", 2)
time.sleep(8)
lcd.lcd_backlight("off")
def Stopwatch():
lcd.lcd_clear()
lcd.lcd_backlight("on")
lcd.lcd_display_string(" PacMan-Boulder", 1)
lcd.lcd_display_string(" Viel Spa\342!", 2)
start_time = time.time()
while runningwatch == 1:
elapsingtime = time.time()-start_time
elapsing_time = round(elapsingtime, 1)
str(elapsing_time)
lcd.lcd_display_string(elapsing_time, 4)
#print(round(elapsingtime, 1))
time.sleep(0.1)
#if runningwatch == 2:
StandbyScreen()
runningwatch += 1
Stopwatch()
#Main Code
while 1:
if GPIO.input(18) == GPIO.HIGH and startcounter == 0:
pygame.mixer.music.play()
print("State HIGH, be like START!!!")
startcounter += 1
time.sleep(5)
stopcounter = 0
elif GPIO.input(17) == GPIO.HIGH and stopcounter == 0:
pygame.mixer.music.fadeout(1)
print("STOP")
stopcounter += 1
time.sleep(5)
startcounter = 0
Code: Alles auswählen
import sys
sys.path.append("./lib")
import i2c_lib
from time import *
# LCD Address
ADDRESS = 0x27
# commands
LCD_CLEARDISPLAY = 0x01
LCD_RETURNHOME = 0x02
LCD_ENTRYMODESET = 0x04
LCD_DISPLAYCONTROL = 0x08
LCD_CURSORSHIFT = 0x10
LCD_FUNCTIONSET = 0x20
LCD_SETCGRAMADDR = 0x40
LCD_SETDDRAMADDR = 0x80
# flags for display entry mode
LCD_ENTRYRIGHT = 0x00
LCD_ENTRYLEFT = 0x02
LCD_ENTRYSHIFTINCREMENT = 0x01
LCD_ENTRYSHIFTDECREMENT = 0x00
# flags for display on/off control
LCD_DISPLAYON = 0x04
LCD_DISPLAYOFF = 0x00
LCD_CURSORON = 0x02
LCD_CURSOROFF = 0x00
LCD_BLINKON = 0x01
LCD_BLINKOFF = 0x00
# flags for display/cursor shift
LCD_DISPLAYMOVE = 0x08
LCD_CURSORMOVE = 0x00
LCD_MOVERIGHT = 0x04
LCD_MOVELEFT = 0x00
# flags for function set
LCD_8BITMODE = 0x10
LCD_4BITMODE = 0x00
LCD_2LINE = 0x08
LCD_1LINE = 0x00
LCD_5x10DOTS = 0x04
LCD_5x8DOTS = 0x00
# flags for backlight control
LCD_BACKLIGHT = 0x08
LCD_NOBACKLIGHT = 0x00
En = 0b00000100 # Enable bit
Rw = 0b00000010 # Read/Write bit
Rs = 0b00000001 # Register select bit
class lcd:
#initializes objects and lcd
def __init__(self):
self.lcd_device = i2c_lib.i2c_device(ADDRESS)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x03)
self.lcd_write(0x02)
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
sleep(0.2)
# clocks EN to latch command
def lcd_strobe(self, data):
self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT)
sleep(.0005)
self.lcd_device.write_cmd(((data & ~En) | LCD_BACKLIGHT))
sleep(.0001)
def lcd_write_four_bits(self, data):
self.lcd_device.write_cmd(data | LCD_BACKLIGHT)
self.lcd_strobe(data)
# write a command to lcd
def lcd_write(self, cmd, mode=0):
self.lcd_write_four_bits(mode | (cmd & 0xF0))
self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
#turn on/off the lcd backlight
def lcd_backlight(self, state):
if state in ("on","On","ON"):
self.lcd_device.write_cmd(LCD_BACKLIGHT)
elif state in ("off","Off","OFF"):
self.lcd_device.write_cmd(LCD_NOBACKLIGHT)
else:
print "Unknown State!"
# put string function
def lcd_display_string(self, string, line):
if line == 1:
self.lcd_write(0x80)
if line == 2:
self.lcd_write(0xC0)
if line == 3:
self.lcd_write(0x94)
if line == 4:
self.lcd_write(0xD4)
for char in string:
self.lcd_write(ord(char), Rs)
# clear lcd and set to home
def lcd_clear(self):
self.lcd_write(LCD_CLEARDISPLAY)
self.lcd_write(LCD_RETURNHOME)
Fussel132