wehnerc Geschrieben September 10, 2013 at 19:24 Geschrieben September 10, 2013 at 19:24 Nochmal Wetterstation. Was gibt es für Ideen um die Beleuchtung des Displays tagsüber auszuschalten und bei Dunkelheit wenn Personen im Raum sind wieder anzuschalten? Zitieren
FlyingDoc Geschrieben September 10, 2013 at 19:44 Geschrieben September 10, 2013 at 19:44 Feststellen ob es Tag ist-> Ambient Light Bricklet Und festzustellen ob jemand im Raum ist einen Bewegungsmelder der einen Kontakt schaltet den du mit einem IO Bricklet abfragst. Zitieren
m0d Geschrieben September 10, 2013 at 20:30 Geschrieben September 10, 2013 at 20:30 Mittels Distance IR Bricklet kann einfach ermittelt werden, ob jm. vor dem Display steht und dann die Beleuchtung eingeschaltet werden, funktioniert super... Zitieren
remotecontrol Geschrieben September 11, 2013 at 05:16 Geschrieben September 11, 2013 at 05:16 Ich habe das Display über einen Ambilight-Sensor gesteuert. Bei weniger als 8 Lux, geht das Display aus. Das reicht, um auch bei Energiesparlampen zu reagieren. Das Ganze habe ich dann noch mit einer gewissen Trägheit (erst nach 2 Sek. einschalten und 10 Sekunden nach "Dunkelheit" wieder ausschalten) versehen. Das bedeutet aber auch: tagsüber ist das Display im wesentlichen an, weil Tageslicht weit über 8 Lux sind. Den Ambilightsensor habe ich oben im Wetterstation-Gehäuse und das Gehäuse steht auf dem Schreibtisch. Für meine Aufbau klappt das sehr zuverlässig. Zitieren
foley Geschrieben February 5, 2014 at 13:33 Geschrieben February 5, 2014 at 13:33 Hi, habe auch das Kit seit Weihnachten. Läuft zuverlässig an einem Raspi, leider schaffe ich es nicht die Beleuchtung wie oben beschrieben einzubauen. Muss zu meiner Schande aber auch gestehen, das ich mich nicht ausgiebig mit Phyton auseinander setzte. Zumindest im Moment nicht. Wäre es möglich den Part mit der Auswertung zu posten. Vielen Dank im Voraus. Zitieren
foley Geschrieben September 20, 2014 at 21:36 Geschrieben September 20, 2014 at 21:36 Hi, @remotecontrol nochmals die Bitte ob du den Part mit der Helligkeitsauswertung für die Beleuchtung mal zugänglich machen könntest. Vielen Dank im Voraus Zitieren
remotecontrol Geschrieben September 21, 2014 at 18:40 Geschrieben September 21, 2014 at 18:40 Hi foley, sorry vielleicht habe ich das damals übersehen. Ein Stand des Projekts ist hier : http://www.tinkerunity.org/wiki/index.php/DE/Projekte/Wetterstation_mit_Zeitschaltuhr_und_Android_App. Allerdings ist das C++. Vom Prinzip habe ich hier eine Schleife, die alle 2 Sekunden prüft, ob was zu tun ist. Und 'etwas tun' kann eben auch Displaybeleuchtung ein oder aus sein. Ich bin die Woche unterwegs, könnte bei Bedarf nächste Woche noch eine etwas genauere Beschreibung posten. Viele Grüße Zitieren
foley Geschrieben December 19, 2014 at 21:07 Geschrieben December 19, 2014 at 21:07 Hi, also ich melde dann mal Bedarf an. Vielen Dank im Voraus. Zitieren
remotecontrol Geschrieben December 20, 2014 at 15:14 Geschrieben December 20, 2014 at 15:14 Hallo foley, ich habe ja keinen Python Mustercode, darum ein Versuch mit einer Art Pseudocode. Variante 1: Display ist an, wenn das Licht entsprechend hell ist (Ambilight-Sensor ist angeschlossen). D.h. tagsüber ist es eigentlich an und abends, wenn eine Zimmerlampe an ist. Das ist aber nicht bewegungsabhängig: int lightOffTimer = 0; bool lightOn = false; bool beenden = false; // kann z.B. per Signal-handler gesetzt werden / Ctrl-C // Hauptverarbeitung lcd_20x4_backlight_off(); while (!beenden) { int lux = ambient_light_get_illuminance() / 10; if (lux >= 2) { // Licht ein ab 2 Lux, wenn's noch nicht ein ist if (!lightOn) { lightOn = true; lightOffTimer = 10; // mindestens 10 Sekunden lang ein lcd_20x4_backlight_on(); } } else if (lightOffTimer > 0) { --lightOffTimer; if (lightOffTimer == 0) { lightOn = false; lcd_20x4_backlight_off(); } } sleep(1); // 1 Sekunde warten } Die Helligkeit könnte man auch noch per Callback aktualisieren lassen. Das ist aber eher eine Optimierung. Variante 2: Display ist an, wenn ein TF MotionDetector-Bricklet eine Bewegung meldet und danach für ca. 20 Sekunden. Wenn sich die Person in den 20 Sekunden erneut bewegt sollte das Licht nicht ausgehen. Das hängt etwas von der Callback-Dauer des Motion-Detectors ab (da gibt es ein Potentiometer ... siehe Doku). int lightOffTimer = 0; bool lightOn = false; bool beenden = false; // kann z.B. per Signal-handler gesetzt werden / Ctrl-C function motionDetected() { lightOffTimer = 20; if (!lightOn) { lightOn = true; lcd_20x4_backlight_on(); } } // Hauptverarbeitung lcd_20x4_backlight_off(); motion_detector_register_callback(MOTION_DETECTOR_CALLBACK_MOTION_DETECTED, motionDetected); while (!beenden) { if (lightOffTimer > 0) { --lightOffTimer; if (lightOffTimer == 0) { lightOn = false; lcd_20x4_backlight_off(); } } sleep(1); // 1 Sekunde warten } Im 2. Beispiel müsste man den Callback noch thread-safe machen, aber das ist zu Beginn erstmal nicht so wichtig. Viel Spaß beim Experimentieren. Zitieren
foley Geschrieben December 29, 2014 at 20:06 Geschrieben December 29, 2014 at 20:06 Hallo, erstmal danke für den Code Vorschlag. Leider komm ich aus einer anderen Ecke der Automatisierung und den Code verstehe ich fast garnicht. Ich habe mir mal aus Beispielen und Codeschnipsel selber was zusammen gebaut. Läuft natürlich nicht. Aber vielleicht kann mir jemand sagen welche brachialen Knaller da drin hängen. Vielen Dank schonmal im Voraus #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID1 = "gth" # Change to your UID UID2 = "gEV" from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_ambient_light import AmbientLight from tinkerforge.bricklet_lcd_20x4 import LCD20x4 def cb_reached(illuminance): lcd.backlight_on() if __name__ == "__main__": ipcon1 = IPConnection() # Create IP connection al = AmbientLight(UID1, ipcon1) # Create device object ipcon1.connect(HOST, PORT) # Connect to brickd ipcon2 = IPConnection() # Create IP connection lcd = LCD20x4(UID2, ipcon2) # Create device object ipcon2.connect(HOST, PORT) # Connect to brickd # Get threshold callbacks with a debounce time of 10 seconds (10000ms) al.set_debounce_period(1000) # Register threshold reached callback to function cb_reached al.register_callback(al.CALLBACK_ILLUMINANCE_REACHED, cb_reached) # Configure threshold for "greater than 200 Lux" (unit is Lux/10) al.set_illuminance_callback_threshold('>', 200*10, 0) ipcon1.disconnect() ipcon2.disconnect() raw_input('Press key to exit\n') # Use input() in Python 3 Zitieren
remotecontrol Geschrieben December 30, 2014 at 13:57 Geschrieben December 30, 2014 at 13:57 Hallo foley, ich versuche immernoch, mich von Python fern zu halten ... Was mir aber dennoch auffällt: Du machst 2 IPConnections auf, dass ich nicht notwendig und evtl. sogar kontra-produktiv (hab's selber noch nie so ausprobiert). Du solltest beide Bricklets bei der einen IPConnection registrieren. 2 IPConnections machen nur Sinn, wenn Du gegen 2 unterschiedliche Hosts arbeitest. Den Aufruf von 'raw_input' musst Du vor dem Disconnect machen, sonst hast Du die Verbindung ja schon getrennt und nichts geht mehr. Generell: eine Illuminance > 200 Lux ist schon recht hell. Teste erstmal mit dem brickv, welche Helligkeitswerte Du so erreichst, sonst wird der Callback ggf. nie ausgelöst. Zitieren
foley Geschrieben December 30, 2014 at 20:16 Geschrieben December 30, 2014 at 20:16 Ich werd irre. Mal angepasst funktioniert aber immer noch nicht. HOST = "localhost" PORT = 4223 UID1 = "gth" UID2 = "gEV" from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_ambient_light import AmbientLight from tinkerforge.bricklet_lcd_20x4 import LCD20x4 def cb_reached(illuminance): lcd.backlight_on() if __name__ == "__main__": ipcon = IPConnection() # Create IP connection al = AmbientLight(UID1, ipcon) # Create device object lcd = LCD20x4(UID2, ipcon) # Create device object ipcon.connect(HOST, PORT) # Connect to brickd lcd.backlight_off() # Get threshold callbacks with a debounce time of 10 seconds (10000ms) al.set_debounce_period(1000) # Register threshold reached callback to function cb_reached al.register_callback(al.CALLBACK_ILLUMINANCE_REACHED, cb_reached) # Configure threshold for "greater than 200 Lux" (unit is Lux/10) al.set_illuminance_callback_threshold('>', 200*10, 0) ipcon.disconnect() Zitieren
foley Geschrieben December 30, 2014 at 23:37 Geschrieben December 30, 2014 at 23:37 Ok. Jetzt bin ich an dem Punkt, wo der Callback auch ab 200 Lux angesprungen wird. Das war aber jetzt mal ein Krampf. Morgen versuche ich im Callback noch eine Variable zu setzten die das Licht dann an / bzw. aus schaltet. #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID1 = "gth" UID2 = "gEV" from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_ambient_light import AmbientLight from tinkerforge.bricklet_lcd_20x4 import LCD20x4 # Callback function for illuminance callback (parameter has unit Lux/10) def cb_illuminance_reached(illuminance): lcd.backlight_on() if __name__ == "__main__": ipcon = IPConnection() al = AmbientLight(UID1, ipcon) lcd = LCD20x4(UID2, ipcon) ipcon.connect(HOST, PORT) al.set_debounce_period(100) al.register_callback(al.CALLBACK_ILLUMINANCE_REACHED, cb_illuminance_reached) al.set_illuminance_callback_threshold('>', 200*10, 0) raw_input('Press key to exit\n') # Use input() in Python 3 ipcon.disconnect() Gutes Nächtle Zitieren
foley Geschrieben January 2, 2015 at 18:03 Geschrieben January 2, 2015 at 18:03 Hallo zusammen, stand der Dinge. #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID1 = "gth" UID2 = "gEV" from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_ambient_light import AmbientLight from tinkerforge.bricklet_lcd_20x4 import LCD20x4 # Callback function for illuminance callback (parameter has unit Lux/10) def cb_illuminance_reached(illuminance): lcd.backlight_on() if __name__ == "__main__": ipcon = IPConnection() al = AmbientLight(UID1, ipcon) lcd = LCD20x4(UID2, ipcon) ipcon.connect(HOST, PORT) lcd.backlight_off() al.set_debounce_period(10) al.register_callback(al.CALLBACK_ILLUMINANCE_REACHED, cb_illuminance_reached) al.set_illuminance_callback_threshold('<', 200, 0) raw_input('Press key to exit\n') # Use input() in Python 3 ipcon.disconnect() Mein Problem ist jetzt aktuell das er bei unter 200 das Backlight einschaltet, aber nicht mehr aus. Irgendwie verstehe ich Phyton nicht. Normalerweise müsste das doch jedesmal wenn er durch das Programm läuft das Backlight ausschalten. :-[ Bin mal kurz ratlos, hätte vielleicht jemand einen Tipp für mich. Vielen Dank im Voraus. Zitieren
foley Geschrieben January 4, 2015 at 19:37 Geschrieben January 4, 2015 at 19:37 Keiner einer Vermutung? :-[ Zitieren
Robin Geschrieben January 4, 2015 at 19:44 Geschrieben January 4, 2015 at 19:44 Mein Problem ist jetzt aktuell das er bei unter 200 das Backlight einschaltet, aber nicht mehr aus. Weil du im Callback angegeben hast, dass er bei Werten < 200 den Callback aufrufen soll, in dem das Licht eingeschaltet wird Zitieren
foley Geschrieben January 4, 2015 at 19:50 Geschrieben January 4, 2015 at 19:50 Ok. Bin aber davon ausgegangen, das wenn er den Callback aufruft und nicht mehr danach in diesen rein kommt, das backlight_off das Licht wieder ausschaltet. Also muss ich jetzt noch einen Callback machen um das Licht wieder auszuschalten bei >200. Richtig? Zitieren
remotecontrol Geschrieben January 4, 2015 at 20:42 Geschrieben January 4, 2015 at 20:42 Du kannst nur einen Callback dieser Art setzen. Alternativ kannst Du aber einen value change Callback verwenden (CALLBACK_ILLUMINANCE). Der wird bei jeder Änderung der Lichtverhältnisse aufgerufen. In dem Callback könntest Du dann abhängig vom aktuellen Wert das Licht ein oder ausschalten. Ansonsten musst Du Dich anderweitig darum kümmern das Licht auszuschalten. Im Akt. Code wird genau 1x zu Beginn dass Licht ausgeschaltet. Zitieren
foley Geschrieben January 4, 2015 at 20:56 Geschrieben January 4, 2015 at 20:56 Hi. Ich denke jetzt sehe ich etwas klarer. Ich bin davon ausgegangen das das Programm ständig durchlaufen wird. Das scheint ja dann nicht der Fall zu sein. Ich werde das mal mit dem vorgeschlagen Callback versuchen. Danke erstmal. Zitieren
foley Geschrieben January 4, 2015 at 21:31 Geschrieben January 4, 2015 at 21:31 Hi, also das war es. Jetzt funktioniert es so wie es soll. Danke für die Tips und Hinweise. #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID1 = "gth" UID2 = "gEV" from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_ambient_light import AmbientLight from tinkerforge.bricklet_lcd_20x4 import LCD20x4 # Callback function for illuminance callback (parameter has unit Lux/10) def cb_illuminance(illuminance): if illuminance <200: lcd.backlight_on() lcd.clear_display() lcd.write_line(0, 0, 'Licht ist an') else: lcd.backlight_off() lcd.clear_display() lcd.write_line(2, 0, 'Licht ist aus') if __name__ == "__main__": ipcon = IPConnection() # Create IP connection al = AmbientLight(UID1, ipcon) lcd = LCD20x4(UID2, ipcon) ipcon.connect(HOST, PORT) # Connect to brickd al.set_illuminance_callback_period(1000) al.register_callback(al.CALLBACK_ILLUMINANCE, cb_illuminance) raw_input('Press key to exit\n') # Use input() in Python 3 ipcon.disconnect() Dankeschön. 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.