Jump to content

Frage zur Programmierung des LED-Bricklets unter python


Recommended Posts

Hallo,

 

ich habe zuhause einen sanften Übergang zwischen dunkel und hell mit dem LED-Strip-Bricklet programmiert und habe mich dabei an folgendes Beispiel gehalten:

#!/usr/bin/env python
# -*- coding: utf-8 -*-  

HOST = "localhost"
PORT = 4223
UID = "abc" # Change to your UID

NUM_LEDS = 16

r = [0]*NUM_LEDS
g = [0]*NUM_LEDS
b = [0]*NUM_LEDS
r_index = 0

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_led_strip import LEDStrip

# Frame rendered callback, is called when a new frame was rendered
# We increase the index of one blue LED with every frame
def cb_frame_rendered(led_strip, length):
    global r_index
    b[r_index] = 0
    if r_index == NUM_LEDS-1:
        r_index = 0
    else:
        r_index += 1

    b[r_index] = 255

    # Set new data for next render cycle
    led_strip.set_rgb_values(0, NUM_LEDS, r, g, b)

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    led_strip = LEDStrip(UID, ipcon) # Create device object

    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Set frame duration to 50ms (20 frames per second)
    led_strip.set_frame_duration(50)

    # Register frame rendered callback to function cb_frame_rendered
    led_strip.register_callback(led_strip.CALLBACK_FRAME_RENDERED, 
                                lambda x: cb_frame_rendered(led_strip, x))

    # Set initial rgb values to get started
    led_strip.set_rgb_values(0, NUM_LEDS, r, g, b)

    raw_input('Press key to exit\n') # Use input() in Python 3
    ipcon.disconnect()

 

Ansich funktioniert auch alles wie erwartet.

Mir ist aber aufgefallen, das die Funktion "cb_frame_rendered" auch noch aufgerufen wird wenn keine Änderungen an den LED's mehr eintreten, bzw. das Programm von Anfang an (bevor ich das erste mal die LED's setze) die Funktion "cb_frame_rendered" aufruft.

 

Ich dachte so, das ich im Callback eine Funktion angeben die immer dann aufgerufen wird wenn er einmal alle LED's gezeichnet hat.

Dieser Aufruf, so dachte ich, würde immer nur dann kommen wenn vorher ein "setColor" der LED's kam.

Sprich wenn ich mal einen "Endwert" erreicht habe (Bsp. RGB 0,200,0) wird die Funktion nicht mehr aufgerufen.

 

Da habe ich mich aber wohl getäuscht.

Nach ca. 3 Sekunden habe ich die gewünschte Helligkeit erreicht, die Funktion wird aber immernoch alle x ms aufgerufen.

 

Das kostet doch zum einen Resourcen und zum anderen macht es das Programm unnötig langsam.

Immerhin wird ständig eine Funktion aufgerufen obwohl es nicht mehr notwendig ist.

 

Hier nochmal mein Source-Code

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
from time import sleep
from tinkerforge.bricklet_led_strip import LEDStrip
from tinkerforge.bricklet_motion_detector import MotionDetector
from tinkerforge.ip_connection import IPConnection

def cb_frame_rendered(arg):
    global led_zaehler
    if Motion_detected and led_zaehler < 101:
        farbwert_tmp = 1 * (rgb_faktor ** led_zaehler)
        farbwert = round(farbwert_tmp)
        logger.debug('Schritt %s von 100 -> RGB-Faktor: %s  Farbwert: %s', led_zaehler, rgb_faktor, farbwert)
        set_color(farbwert)
        led_zaehler += 1

def motion_on():
    global Motion_detected
    logger.debug('Jemand BETRITT das Bad')
    sleep(0.5)
    Motion_detected = True
    set_color(1)


def motion_off():
    global led_zaehler
    global Motion_detected
    logger.debug('Jemand VERLÄSST das Bad')
    Motion_detected = False
    led_zaehler = 1
    set_color(0)


def set_color(wert):
    var_led_RED = [0] * 16
    var_led_GREEN = [0] * 16
    var_led_BLUE = [wert] * 16
    # LED's setzen
    LED_bricklet.set_rgb_values(0, 15, var_led_RED, var_led_BLUE, var_led_GREEN)
    LED_bricklet.set_rgb_values(15, 15, var_led_RED, var_led_BLUE, var_led_GREEN)
    LED_bricklet.set_rgb_values(30, 15, var_led_RED, var_led_BLUE, var_led_GREEN)
    LED_bricklet.set_rgb_values(45, 15, var_led_RED, var_led_BLUE, var_led_GREEN)


if __name__ == "__main__":
    # Grundeinstellungen
    LED_status = 0
    Motion_detected = False
    led_zaehler = 1
    rgb_faktor = 60.0 ** (1.0 / 100.0)
    #distance_liste = [0, 0, 0, 0]

    # Logging initialisieren
    logger = logging.getLogger('raspi_server')
    logger.setLevel(logging.DEBUG)
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s : %(message)s', '%Y-%m-%d %H:%M:%S')
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    logger.info('System startet ...')

    # Tinkerforge Verbindung erzuegen
    ipcon = IPConnection()

    # Bricklets initialisieren
    Motion_bricklet = MotionDetector("jX1", ipcon)
    LED_bricklet = LEDStrip("jGU", ipcon)

    # mit Tinkerforge verbinden
    ipcon.connect("192.168.127.81", 4223)

    # Callbacks einstellen
    LED_bricklet.set_frame_duration(25)
    LED_bricklet.register_callback(LED_bricklet.CALLBACK_FRAME_RENDERED,cb_frame_rendered)
    Motion_bricklet.register_callback(Motion_bricklet.CALLBACK_MOTION_DETECTED, motion_on)
    Motion_bricklet.register_callback(Motion_bricklet.CALLBACK_DETECTION_CYCLE_ENDED, motion_off)

    # eine Art von Endlosschleife
    raw_input('Press key to exit\n')

    ipcon.disconnect()

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...