Pico 2 W Projekte
getestet in CircuitPython 9.2.5
Relaisboard mit drei angeschlossenen Sensoren
Software
- CircuitPython 9.2.5
- Bibliotheken im 'lib'-Ordner
- Ordner: adafruit_bme280
Als nächstes folgt der Anschluss aller drei Sensoren aus den vorhergehenden Versuchen an ein Relaisboard. Über den Temperatursensor
soll ein Lüfter gesteuert werden. Der Helligkeitssensor schaltet eine Lampe ein bzw. aus (Dämmerungsschalter). Ebenso der
Bewegungssensor beim Registrieren einer Bewegung. Das verwendete Relaisboard ist von SB-Components und kostet ca. 20 Euro. Der Pico wird über
die vorhandenen Steckerleisten direkt auf das Board gesetzt, gehört aber nicht zum Lieferumfang. Bestellen können Sie das Board
z.B. von hier
. Die Relais sind für 220V Verbraucher bis 10A ausgelegt. Alles ist sehr gut beschriftet und die Funktionsweise ist zuverlässig.
Auf der unteren Abbildung zeige ich den Anschluss des Temperatur-, des Licht- und des Bewegungssensors an den Pico 2 W. Normalerweise bräuchte
es hierfür keinen Pico 2W, ein einfacher Pico (ohne WLAN) wäre ausreichend. Aber die Anwendung soll später noch mit einem kleinen
HTTP-Server ins WLAN eingebunden werden, so dass sich die Geräte auch mit dem Smartphone steuern lassen.

Bei den GPIO's verwende ich die gleichen, wie in den vorhergehenden Versuchen mit jeweils einem der Sensoren.
Im Quelltext werden nach dem Import der Bibliotheken in den Zeilen 9 bis 16 einige Werte definiert, welche als Schaltschwelle für das
Ein- und Ausschalten genutzt werden. Sie können die hier auch verändern um das Verhalten entsprechend anzupassen.
Die Zeilen 18 bis 21 definieren die Onboard-LED und schalten sie aus, da sie in diesem Versuch nicht genutzt wird.
Danach werden die Sensoren definiert:
- Zeile 23 - 28: Temperatursensor (i2c)
- Zeile 30 - 32: Helligkeitssensor (Analogeingang)
- Zeile 34 - 37: Bewegungssensor
In den Zeilen 39 bis 51 werden die Relais 1 bis 4 definiert. Es folgen drei Funktionen, welche die Temperatur, die Helligkeit und Bewegung
auswerten.
1 import time
2 import board
3 import busio
4 from analogio import AnalogIn
5 import digitalio
6 from digitalio import DigitalInOut, Direction
7 from adafruit_bme280 import basic as adafruit_bme280
8
9 # Temperatur on/off Werte
10 temp_on = 25
11 temp_off = 24.5
12 # Schaltschwelle Helligkeit einstellen
13 soll_wert = 11000
14 # Verzögerung - Licht bleibt noch an (sec)
15 light_on = 15 # Helligkeitssensor
16 pir_on = 5 # Bewegungssensor
17
18 # onboard LED setup
19 led = DigitalInOut(board.LED)
20 led.direction = Direction.OUTPUT
21 led.value = False
22
23 #I2C Pin SDA: GP 0 and SCL: GP1
24 SDA = board.GP0
25 SCL = board.GP1
26 # Create sensor object, using the board's default I2C bus.
27 i2c = busio.I2C(SCL, SDA)
28 bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x77)
29
30 #initialisieren des Analogen Pin 33 | GP28
31 # Helligkeit messen
32 ADC_2 = AnalogIn(board.GP28)
33
34 # Setup digital inputs for PIR sensor:
35 pir = digitalio.DigitalInOut(board.GP22)
36 pir.direction = digitalio.Direction.INPUT
37 pir.pull = digitalio.Pull.UP
38
39 # Relais setup
40 relais1 = DigitalInOut(board.GP18)
41 relais1.direction = Direction.OUTPUT
42 relais1.value = False
43 relais2 = DigitalInOut(board.GP19)
44 relais2.direction = Direction.OUTPUT
45 relais2.value = False
46 relais3 = DigitalInOut(board.GP20)
47 relais3.direction = Direction.OUTPUT
48 relais3.value = False
49 relais4 = DigitalInOut(board.GP21)
50 relais4.direction = Direction.OUTPUT
51 relais4.value = False
52
53 def temp():
54 # Temperatur lesen
55 temp = bme280.temperature
56 if temp > temp_on:
57 relais1.value = True
58 #print("Temp.: %0.1f C" % (bme280.temperature))
59 if temp < temp_off:
60 relais1.value = False
70 #print("Temp.: %0.1f C" % (bme280.temperature))
71
72 def light(wait_light):
73 #auslesen des ADC (Helligkeit)
74 value = ADC_2.value
75 if value > soll_wert:
76 relais2.value = True
77 wait_light = time.monotonic()
78 #print(value)
79 return wait_light
80
81 def motion(wait_pir):
82 # Bewegung registrieren
83 pir_value = pir.value
84 if pir_value:
85 relais4.value = True
86 wait_pir = time.monotonic()
87 return wait_pir
89
90 wait_light = time.monotonic()
91 wait_pir = time.monotonic()
92
93 while True:
94 temp()
95 wait_light = light(wait_light)
96 if time.monotonic() - wait_light > light_on:
97 wait_light = time.monotonic()
98 relais2.value = False
99 wait_pir = motion(wait_pir)
100 if time.monotonic() - wait_pir > pir_on:
101 wait_pir = time.monotonic()
102 relais4.value = False
In der 'while'-Schleife ab Zeile 93 werden die o.g. Funktionen aufgerufen.
- Zeile 94 Temperatur:
Ist die gemessene Temperatur > 25 C, schaltet Relais 1 auf 'True'. Fällt der Wert unter 24.5 C schaltet
Relais 1 auf 'False'. Der Abstand von 0.5 C zwischen ein- und ausschalten wurde gewählt, um ein 'Flattern' des Relais beim
Schwellwert zu vermeiden. So läuft der Lüfter eben noch etwas weiter, wenn die 25 C unterschritten werden. Denkbar wäre auch
ein (realistischer) kleinerer Wert als 24.5 C.
- Zeile 95 Helligkeit:
Damit die Lampe nicht sofort wieder ausgeschaltet wird, wenn der Sensor nur kurzzeitig abgedeckt wird, sorgt die Variable 'wait_light' für
die festgelegte Verzögerung von 15 Sekunden. Deshalb wird die Variable an die Funktion 'light' übergeben und von ihr zurückgeliefert.
Nur wenn mehr als die 15 Sekunden ('light_on') vergangen sind, wird das Relais 2 'False' geschaltet.
- Zeile 99 Bewegung:
In gleicher Weise wie bei der Helligkeit wird mit der Variable 'wait_pir' verfahren. Sie wird an die Funktion 'motion' übergeben und zurück
geliefert. Wenn die Zeit 'pir_on' überschritten ist, ohne dass eine Bewegung registriert wurde, schaltet das Relais 4 auf 'False'.
Viel Spass und Erfolg beim Ausprobieren.
Pico 2 W Projekte
getestet in CircuitPython 9.2.5Software
- CircuitPython 9.2.5
- Bibliotheken im 'lib'-Ordner
- Ordner: adafruit_bme280
Als nächstes folgt der Anschluss aller drei Sensoren aus den vorhergehenden Versuchen an ein Relaisboard. Über den Temperatursensor soll ein Lüfter gesteuert werden. Der Helligkeitssensor schaltet eine Lampe ein bzw. aus (Dämmerungsschalter). Ebenso der Bewegungssensor beim Registrieren einer Bewegung. Das verwendete Relaisboard ist von SB-Components und kostet ca. 20 Euro. Der Pico wird über die vorhandenen Steckerleisten direkt auf das Board gesetzt, gehört aber nicht zum Lieferumfang. Bestellen können Sie das Board z.B. von hier . Die Relais sind für 220V Verbraucher bis 10A ausgelegt. Alles ist sehr gut beschriftet und die Funktionsweise ist zuverlässig.
Auf der unteren Abbildung zeige ich den Anschluss des Temperatur-, des Licht- und des Bewegungssensors an den Pico 2 W. Normalerweise bräuchte es hierfür keinen Pico 2W, ein einfacher Pico (ohne WLAN) wäre ausreichend. Aber die Anwendung soll später noch mit einem kleinen HTTP-Server ins WLAN eingebunden werden, so dass sich die Geräte auch mit dem Smartphone steuern lassen.

Bei den GPIO's verwende ich die gleichen, wie in den vorhergehenden Versuchen mit jeweils einem der Sensoren.
Im Quelltext werden nach dem Import der Bibliotheken in den Zeilen 9 bis 16 einige Werte definiert, welche als Schaltschwelle für das Ein- und Ausschalten genutzt werden. Sie können die hier auch verändern um das Verhalten entsprechend anzupassen.
Die Zeilen 18 bis 21 definieren die Onboard-LED und schalten sie aus, da sie in diesem Versuch nicht genutzt wird.
Danach werden die Sensoren definiert:
- Zeile 23 - 28: Temperatursensor (i2c)
- Zeile 30 - 32: Helligkeitssensor (Analogeingang)
- Zeile 34 - 37: Bewegungssensor
In den Zeilen 39 bis 51 werden die Relais 1 bis 4 definiert. Es folgen drei Funktionen, welche die Temperatur, die Helligkeit und Bewegung auswerten.
1 import time 2 import board 3 import busio 4 from analogio import AnalogIn 5 import digitalio 6 from digitalio import DigitalInOut, Direction 7 from adafruit_bme280 import basic as adafruit_bme280 8 9 # Temperatur on/off Werte 10 temp_on = 25 11 temp_off = 24.5 12 # Schaltschwelle Helligkeit einstellen 13 soll_wert = 11000 14 # Verzögerung - Licht bleibt noch an (sec) 15 light_on = 15 # Helligkeitssensor 16 pir_on = 5 # Bewegungssensor 17 18 # onboard LED setup 19 led = DigitalInOut(board.LED) 20 led.direction = Direction.OUTPUT 21 led.value = False 22 23 #I2C Pin SDA: GP 0 and SCL: GP1 24 SDA = board.GP0 25 SCL = board.GP1 26 # Create sensor object, using the board's default I2C bus. 27 i2c = busio.I2C(SCL, SDA) 28 bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x77) 29 30 #initialisieren des Analogen Pin 33 | GP28 31 # Helligkeit messen 32 ADC_2 = AnalogIn(board.GP28) 33 34 # Setup digital inputs for PIR sensor: 35 pir = digitalio.DigitalInOut(board.GP22) 36 pir.direction = digitalio.Direction.INPUT 37 pir.pull = digitalio.Pull.UP 38 39 # Relais setup 40 relais1 = DigitalInOut(board.GP18) 41 relais1.direction = Direction.OUTPUT 42 relais1.value = False 43 relais2 = DigitalInOut(board.GP19) 44 relais2.direction = Direction.OUTPUT 45 relais2.value = False 46 relais3 = DigitalInOut(board.GP20) 47 relais3.direction = Direction.OUTPUT 48 relais3.value = False 49 relais4 = DigitalInOut(board.GP21) 50 relais4.direction = Direction.OUTPUT 51 relais4.value = False 52 53 def temp(): 54 # Temperatur lesen 55 temp = bme280.temperature 56 if temp > temp_on: 57 relais1.value = True 58 #print("Temp.: %0.1f C" % (bme280.temperature)) 59 if temp < temp_off: 60 relais1.value = False 70 #print("Temp.: %0.1f C" % (bme280.temperature)) 71 72 def light(wait_light): 73 #auslesen des ADC (Helligkeit) 74 value = ADC_2.value 75 if value > soll_wert: 76 relais2.value = True 77 wait_light = time.monotonic() 78 #print(value) 79 return wait_light 80 81 def motion(wait_pir): 82 # Bewegung registrieren 83 pir_value = pir.value 84 if pir_value: 85 relais4.value = True 86 wait_pir = time.monotonic() 87 return wait_pir 89 90 wait_light = time.monotonic() 91 wait_pir = time.monotonic() 92 93 while True: 94 temp() 95 wait_light = light(wait_light) 96 if time.monotonic() - wait_light > light_on: 97 wait_light = time.monotonic() 98 relais2.value = False 99 wait_pir = motion(wait_pir) 100 if time.monotonic() - wait_pir > pir_on: 101 wait_pir = time.monotonic() 102 relais4.value = False
- Zeile 94 Temperatur:
Ist die gemessene Temperatur > 25 C, schaltet Relais 1 auf 'True'. Fällt der Wert unter 24.5 C schaltet Relais 1 auf 'False'. Der Abstand von 0.5 C zwischen ein- und ausschalten wurde gewählt, um ein 'Flattern' des Relais beim Schwellwert zu vermeiden. So läuft der Lüfter eben noch etwas weiter, wenn die 25 C unterschritten werden. Denkbar wäre auch ein (realistischer) kleinerer Wert als 24.5 C.
- Zeile 95 Helligkeit:
Damit die Lampe nicht sofort wieder ausgeschaltet wird, wenn der Sensor nur kurzzeitig abgedeckt wird, sorgt die Variable 'wait_light' für die festgelegte Verzögerung von 15 Sekunden. Deshalb wird die Variable an die Funktion 'light' übergeben und von ihr zurückgeliefert. Nur wenn mehr als die 15 Sekunden ('light_on') vergangen sind, wird das Relais 2 'False' geschaltet.
- Zeile 99 Bewegung:
In gleicher Weise wie bei der Helligkeit wird mit der Variable 'wait_pir' verfahren. Sie wird an die Funktion 'motion' übergeben und zurück geliefert. Wenn die Zeit 'pir_on' überschritten ist, ohne dass eine Bewegung registriert wurde, schaltet das Relais 4 auf 'False'.