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.