Hallo in die Runde
Ich arbeite schon eine Weile mit dem Raspberry Pi, habe herum gespielt, einen Heimserver aufgesetzt, und ihn inzwischen durch einen odroid als NAS ersetzt.
dadurch ist der Pi wieder frei geworden und ich versuche mich an einem neuen Projekt, für das mir aber leider die Kenntnisse in Python fehlen.
Aber eins nach dem anderen:
Letztes Jahr habe ich ein Modellautorennen für Kinder veranstaltet, bei dem die Autos einzeln mittels Zeitmessung gegeneinander antreten. Video
Ich habe die Zeiten immer mit der Stoppuhr in meinem Smartphone gestoppt, für einen Wettkampf ist das aber heutzutage zu intransparent, deshalb will ich die Anzeige der Stoppuhr öffentlich machen.
Ich habe also folgendes konstruiert:
- Eine Ampel, für den Start, bei grün soll die Stoppuhr beginnen zu zählen
- Eine 4-teilige 7-Segment-Anzeige zur öffentlichen Zeitanzeige
- Eine Zieldurchfahrt mit Laser-Lichtschranke zum stoppen des Zählvorgangs
Dabei habe ich mich an folgenden Tutorials bedient:
Ampelschaltung:
Ampelschaltung tutorials-raspberrypi.de by Felix
Stoppuhr:
Stoppuhr, forum-raspberrypi.de by LJSchumi
7-Segment-Anzeige mit tm1637 Treiber:
tm1637 github by tim walzenegger
Lichtschranke:
Laser Lichtschranke, tutorials-raspberrypi.de by Felix
Alle Einzelteile habe ich gut zum laufen bekommen, aber jetzt geht es eben darum den Pythoncode für meine Zwecke zu verschmelzen, und das bekomme ich nicht hin.
besonders die Stoppuhr auf die Anzeige zu legen.
Ich arbeite mich zwar gerade durch einen Python-Kurs, aber ich habe erst einen Bruchteil geschafft, und werde wohl bis zum Frühsommer sonst nicht fertig.
vielleicht kann mir ja Jemand helfen, die Einzelteile zusammen zu setzen, das wäre super-nett
vielen Dank für euer Interesse!
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import os, time
import tm1637
try:
import thread
except ImportError:
import _thread as thread
GPIO.setmode(GPIO.BCM)
# Initialize the clock (GND, VCC=3.3V)
Display = tm1637.TM1637(CLK=11, DIO=8, brightness=1.0)
ROT = 02
GELB = 14
GRUEN = 15
TASTER = 07
RECEIVER_PIN = 10
GPIO.setup(ROT, GPIO.OUT) # Led rot
GPIO.setup(GELB, GPIO.OUT) # Led gelb
GPIO.setup(GRUEN, GPIO.OUT) # Led gruen
GPIO.setup(TASTER, GPIO.IN) # Taster
GPIO.setup(RECEIVER_PIN, GPIO.IN) # Lichtschranke
# Ampelschaltung definieren
def umschalten():
#Phase 2
GPIO.output(ROT, True)
GPIO.output(GELB, True)
GPIO.output(GRUEN, False)
time.sleep(2)
#Phase 3 hier müsste gleichzeitig die Funktion start aufgerufen werden
GPIO.output(GRUEN, True)
GPIO.output(ROT, False)
GPIO.output(GELB, False)
#Endlosschleife
while True:
#Phase 1
GPIO.output(ROT, True)
GPIO.output(GELB, False)
GPIO.output(GRUEN, False)
#Status des Tasters einlesen
tasterStatus = GPIO.input(TASTER)
if (tasterStatus):
umschalten()
# Die Funktionen für die Stoppuhr: Die Anzeige (00:00) hat 4 7segment Module => timer [0] = Sekunden, timer [1] = /100 Sekunden, und dazwischen einen Doppelpunkt
def update_timeText():
if (state):
global timer
timer[1] += 1
if (timer[1] >= 100):
timer[1] = 0
timer[0] += 1
timeString = pattern.format(timer[0], timer[1])
timeText.configure(text=timeString)
root.after(10, update_timeText)
def start():
global state
state = True
def stop():
global state
state = False
def reset():
global timer
timer = [0, 0]
timeText.configure(text='00:00')
state = False
#Funktionen für die Lichtschranke:
def callback_func(channel):
if GPIO.input(channel):
print("Lichtschranke wurde unterbrochen")
# alternativ kann ein Script / Shell Befehl gestartet werden
# os.system("ls")
if __name__ == '__main__':
GPIO.add_event_detect(RECEIVER_PIN, GPIO.RISING, callback=callback_func, bouncetime=200)
try:
while True:
time.sleep(0.5)
except:
# Event wieder entfernen mittels:
GPIO.remove_event_detect(RECEIVER_PIN)
# Hier müsste die Einbindung des 7seg Displays unter Verwendung des Scripts für den tm1637 folgen, momentan ist das für die 15 Sekunden Anzeige der aktuellen Uhrzeit geschrieben:
try:
print "Starting clock in the background (press CTRL + C to stop):"
Display.StartClock(military_time=False)
sleep(15)
Display.StopClock()
thread.interrupt_main()
except KeyboardInterrupt:
print "Properly closing the clock and open GPIO pins"
# Beim Durchfahren der Lichtschranke Aufruf der Funktion stop (stoppen des Zählvorgangs und Anzeige der gemessenen Zeit)
# Beim Drücken des Tasters Funktion reset für die Uhr und die 7seg. Anzeige aufrufen und Ampellicht auf Rot
Display.cleanup()
#zurueck zu Phase 1
GPIO.output(ROT, True)
GPIO.output(GELB, False)
GPIO.output(GRUEN, False)
Alles anzeigen
Der Treiber für meine tm1637-Anzeige von Tim Weizenegger via github:
import math
import RPi.GPIO as IO
import threading
from time import sleep, localtime
# from tqdm import tqdm
# IO.setwarnings(False)
IO.setmode(IO.BCM)
HexDigits = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71]
ADDR_AUTO = 0x40
ADDR_FIXED = 0x44
STARTADDR = 0xC0
# DEBUG = False
class TM1637:
__doublePoint = False
__Clkpin = 0
__Datapin = 0
__brightness = 1.0 # default to max brightness
__currentData = [0, 0, 0, 0]
def __init__(self, CLK, DIO, brightness):
self.__Clkpin = CLK
self.__Datapin = DIO
self.__brightness = brightness
IO.setup(self.__Clkpin, IO.OUT)
IO.setup(self.__Datapin, IO.OUT)
def cleanup(self):
"""Stop updating clock, turn off display, and cleanup GPIO"""
self.StopClock()
self.Clear()
IO.cleanup()
def Clear(self):
b = self.__brightness
point = self.__doublePoint
self.__brightness = 0
self.__doublePoint = False
data = [0x7F, 0x7F, 0x7F, 0x7F]
self.Show(data)
# Restore previous settings:
self.__brightness = b
self.__doublePoint = point
def ShowInt(self, i):
s = str(i)
self.Clear()
for i in range(0, len(s)):
self.Show1(i, int(s[i]))
def Show(self, data):
for i in range(0, 4):
self.__currentData[i] = data[i]
self.start()
self.writeByte(ADDR_AUTO)
self.br()
self.writeByte(STARTADDR)
for i in range(0, 4):
self.writeByte(self.coding(data[i]))
self.br()
self.writeByte(0x88 + int(self.__brightness))
self.stop()
def Show1(self, DigitNumber, data):
"""show one Digit (number 0...3)"""
if(DigitNumber < 0 or DigitNumber > 3):
return # error
self.__currentData[DigitNumber] = data
self.start()
self.writeByte(ADDR_FIXED)
self.br()
self.writeByte(STARTADDR | DigitNumber)
self.writeByte(self.coding(data))
self.br()
self.writeByte(0x88 + int(self.__brightness))
self.stop()
def SetBrightness(self, percent):
"""Accepts percent brightness from 0 - 1"""
max_brightness = 7.0
brightness = math.ceil(max_brightness * percent)
if (brightness < 0):
brightness = 0
if(self.__brightness != brightness):
self.__brightness = brightness
self.Show(self.__currentData)
def ShowDoublepoint(self, on):
"""Show or hide double point divider"""
if(self.__doublePoint != on):
self.__doublePoint = on
self.Show(self.__currentData)
def writeByte(self, data):
for i in range(0, 8):
IO.output(self.__Clkpin, IO.LOW)
if(data & 0x01):
IO.output(self.__Datapin, IO.HIGH)
else:
IO.output(self.__Datapin, IO.LOW)
data = data >> 1
IO.output(self.__Clkpin, IO.HIGH)
# wait for ACK
IO.output(self.__Clkpin, IO.LOW)
IO.output(self.__Datapin, IO.HIGH)
IO.output(self.__Clkpin, IO.HIGH)
IO.setup(self.__Datapin, IO.IN)
while(IO.input(self.__Datapin)):
sleep(0.001)
if(IO.input(self.__Datapin)):
IO.setup(self.__Datapin, IO.OUT)
IO.output(self.__Datapin, IO.LOW)
IO.setup(self.__Datapin, IO.IN)
IO.setup(self.__Datapin, IO.OUT)
def start(self):
"""send start signal to TM1637"""
IO.output(self.__Clkpin, IO.HIGH)
IO.output(self.__Datapin, IO.HIGH)
IO.output(self.__Datapin, IO.LOW)
IO.output(self.__Clkpin, IO.LOW)
def stop(self):
IO.output(self.__Clkpin, IO.LOW)
IO.output(self.__Datapin, IO.LOW)
IO.output(self.__Clkpin, IO.HIGH)
IO.output(self.__Datapin, IO.HIGH)
def br(self):
"""terse break"""
self.stop()
self.start()
def coding(self, data):
if(self.__doublePoint):
pointData = 0x80
else:
pointData = 0
if(data == 0x7F):
data = 0
else:
data = HexDigits[data] + pointData
return data
def clock(self, military_time):
"""Clock script modified from:
https://github.com/johnlr/raspberrypi-tm1637"""
self.ShowDoublepoint(True)
while (not self.__stop_event.is_set()):
t = localtime()
hour = t.tm_hour
if not military_time:
hour = 12 if (t.tm_hour % 12) == 0 else t.tm_hour % 12
d0 = hour // 10 if hour // 10 else 0
d1 = hour % 10
d2 = t.tm_min // 10
d3 = t.tm_min % 10
digits = [d0, d1, d2, d3]
self.Show(digits)
# # Optional visual feedback of running alarm:
# print digits
# for i in tqdm(range(60 - t.tm_sec)):
for i in range(60 - t.tm_sec):
if (not self.__stop_event.is_set()):
sleep(1)
def StartClock(self, military_time=True):
# Stop event based on: http://stackoverflow.com/a/6524542/3219667
self.__stop_event = threading.Event()
self.__clock_thread = threading.Thread(
target=self.clock, args=(military_time,))
self.__clock_thread.start()
def StopClock(self):
try:
print 'Attempting to stop live clock'
self.__stop_event.set()
except:
print 'No clock to close'
if __name__ == "__main__":
"""Confirm the display operation"""
display = TM1637(CLK=11, DIO=8, brightness=1.0)
display.Clear()
Alles anzeigen