wehnerc Posted September 10, 2013 at 07:24 PM Share Posted September 10, 2013 at 07:24 PM 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? Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted September 10, 2013 at 07:44 PM Share Posted September 10, 2013 at 07:44 PM 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. Quote Link to comment Share on other sites More sharing options...
m0d Posted September 10, 2013 at 08:30 PM Share Posted September 10, 2013 at 08:30 PM Mittels Distance IR Bricklet kann einfach ermittelt werden, ob jm. vor dem Display steht und dann die Beleuchtung eingeschaltet werden, funktioniert super... Quote Link to comment Share on other sites More sharing options...
remotecontrol Posted September 11, 2013 at 05:16 AM Share Posted September 11, 2013 at 05:16 AM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted February 5, 2014 at 01:33 PM Share Posted February 5, 2014 at 01:33 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted September 20, 2014 at 09:36 PM Share Posted September 20, 2014 at 09:36 PM 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 Quote Link to comment Share on other sites More sharing options...
remotecontrol Posted September 21, 2014 at 06:40 PM Share Posted September 21, 2014 at 06:40 PM 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 Quote Link to comment Share on other sites More sharing options...
foley Posted December 19, 2014 at 09:07 PM Share Posted December 19, 2014 at 09:07 PM Hi, also ich melde dann mal Bedarf an. Vielen Dank im Voraus. Quote Link to comment Share on other sites More sharing options...
remotecontrol Posted December 20, 2014 at 03:14 PM Share Posted December 20, 2014 at 03:14 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted December 29, 2014 at 08:06 PM Share Posted December 29, 2014 at 08:06 PM 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 Quote Link to comment Share on other sites More sharing options...
remotecontrol Posted December 30, 2014 at 01:57 PM Share Posted December 30, 2014 at 01:57 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted December 30, 2014 at 08:16 PM Share Posted December 30, 2014 at 08:16 PM 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() Quote Link to comment Share on other sites More sharing options...
foley Posted December 30, 2014 at 11:37 PM Share Posted December 30, 2014 at 11:37 PM 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 Quote Link to comment Share on other sites More sharing options...
foley Posted January 2, 2015 at 06:03 PM Share Posted January 2, 2015 at 06:03 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted January 4, 2015 at 07:37 PM Share Posted January 4, 2015 at 07:37 PM Keiner einer Vermutung? :-[ Quote Link to comment Share on other sites More sharing options...
Robin Posted January 4, 2015 at 07:44 PM Share Posted January 4, 2015 at 07:44 PM 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 Quote Link to comment Share on other sites More sharing options...
foley Posted January 4, 2015 at 07:50 PM Share Posted January 4, 2015 at 07:50 PM 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? Quote Link to comment Share on other sites More sharing options...
remotecontrol Posted January 4, 2015 at 08:42 PM Share Posted January 4, 2015 at 08:42 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted January 4, 2015 at 08:56 PM Share Posted January 4, 2015 at 08:56 PM 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. Quote Link to comment Share on other sites More sharing options...
foley Posted January 4, 2015 at 09:31 PM Share Posted January 4, 2015 at 09:31 PM 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. Quote Link to comment Share on other sites More sharing options...
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.