Jump to content

Wetterstaton Beleuchtung an/aus


wehnerc
 Share

Recommended Posts

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.

Link to comment
Share on other sites

  • 4 months later...

Hi,

 

habe auch das Kit seit Weihnachten. ;D

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.

Link to comment
Share on other sites

  • 7 months later...

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

Link to comment
Share on other sites

  • 2 months later...

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.

 

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Ich werd irre.

Mal angepasst funktioniert aber immer noch nicht.  :o

 

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()

Link to comment
Share on other sites

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  ;)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?    :P

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.  ;D

Link to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...