derAngler Geschrieben June 3, 2014 at 06:33 Geschrieben June 3, 2014 at 06:33 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() Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.