Quantcast
Channel: Kodinerds.net - Deutschsprachiges Forum zum Kodi Entertainment Center
Viewing all articles
Browse latest Browse all 87137

Treppenstufenbeleuchtung mit dem Raspberry

$
0
0
Ich bastel derzeit an einer kaskadierenden Treppenstufenbeleuchtung.
WS2801, Raspberry 3 und Bewegungsmelder.
Das ist natürlich völlig übertrieben, dafür einen Rasp zu nehmen. Aber sonst lerne ich nie was in Python.

An sich funktioniert es auch, aber irgendwas in dem Code läßt das Script grobe 30 Sekunden warten, nach dem ein Event ausgelöst wurde.
Vielleicht hat hier ja ein Pythonkenner eine Idee:


Python-Quellcode

  1. import RPi.GPIO as GPIO
  2. import time
  3. import Adafruit_WS2801
  4. import Adafruit_GPIO.SPI as SPI
  5. SENSOR_PIN = 23
  6. GPIO.setmode(GPIO.BCM)
  7. GPIO.setup(SENSOR_PIN, GPIO.IN)
  8. SENSOR_PIN2 = 24
  9. GPIO.setmode(GPIO.BCM)
  10. GPIO.setup(SENSOR_PIN2, GPIO.IN)
  11. PIXEL_COUNT = 32
  12. SPI_PORT = 0
  13. SPI_DEVICE = 0
  14. pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))
  15. def wheelw(pos):
  16. if pos > 85:
  17. return Adafruit_WS2801.RGB_to_color(255, 255, 255)
  18. elif pos > 170:
  19. pos += 85
  20. return Adafruit_WS2801.RGB_to_color(255, 255, 255)
  21. else:
  22. pos += 170
  23. return Adafruit_WS2801.RGB_to_color(255, 255, 255)
  24. def rainbow_cycle_successive(pixels, wait=0.1):
  25. for i in range(pixels.count()):
  26. pixels.set_pixel(i, wheelw(((-i * -20 // pixels.count())) ) )
  27. pixels.show()
  28. if wait > 0:
  29. time.sleep(0.05)
  30. def rainbow_cycle_successiver(pixels, wait=0.1):
  31. for i in reversed(range(pixels.count())):
  32. pixels.set_pixel(i, wheelw(((-i * -20 // pixels.count())) ) )
  33. pixels.show()
  34. if wait > 0:
  35. time.sleep(0.05)
  36. def appear_from_back(pixels, color=(0, 0, 0), wait=0.1):
  37. pos = 0
  38. for i in range(pixels.count()):
  39. for j in reversed(range(i, pixels.count())):
  40. for k in range(i):
  41. pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
  42. pixels.set_pixel(j, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
  43. pixels.show()
  44. time.sleep(0.05)
  45. def appear_from_backr(pixels, color=(0, 0, 0)):
  46. pos = 0
  47. for i in range(pixels.count()):
  48. for j in range(i, pixels.count()):
  49. for k in range(i):
  50. pixels.set_pixel(k, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
  51. pixels.set_pixel(j, Adafruit_WS2801.RGB_to_color( color[0], color[1], color[2] ))
  52. pixels.show()
  53. time.sleep(0.05)
  54. def mein_callback(channel):
  55. print('Es gab eine Bewegung! cb1')
  56. pixels.clear()
  57. rainbow_cycle_successiver(pixels)
  58. time.sleep(3)
  59. appear_from_back(pixels)
  60. def mein_callback2(channel):
  61. print('Es gab eine Bewegung! cb2')
  62. rainbow_cycle_successive(pixels)
  63. time.sleep(3)
  64. appear_from_backr(pixels)
  65. try:
  66. GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)
  67. GPIO.add_event_detect(SENSOR_PIN2 , GPIO.RISING, callback=mein_callback2)
  68. while True:
  69. time.sleep(10)
  70. except KeyboardInterrupt:
  71. print "Beende..."
  72. GPIO.cleanup()
Alles anzeigen
Die Funktion ist gegeben. Schalter 1 wird ausgelöst und das Licht geht von unten nach oben an und danach (3 Sekunden) von oben nach unten aus.
Aber der nächste Schaltvorgang kann dann erst nach etwa 30 Sekunden starten. Egal was ich ausgeben lassen will.
Der 2. Schaltvorgang funktioniert dann auch. Aber eben immer mit der Wartezeit dazwischen.
Vielleicht hat ja @BJ1 eine Idee :)

Bilder vom Testaufbau kommen noch. (Ich schreibe das hier alles direkt am Rasp.)

Viewing all articles
Browse latest Browse all 87137