Aktuelles Projekt: Magnop
- Microbit V2
- Sensor: Compass (Magnet)
- Battery-Pack
(2xAAA)- WLAN Modul, Betrieb ab Microbit (3V/GND), 3x AA 1.2V/2100mAh
- Lötleiste mit Pins f. Microbit empfehlenswert
- Funktion: Türalarm
- Sprache: Micropython
- Aktuelle Code Version Magnop: V1
- WLAN-Modul (connected to Microbit)
- PushServer
Das Python Programm liest via Kompassmodul die Magnetfeldstärke des Türmagneten ein. Weicht der Wert zu sehr ab, wird ein Alarm gesendet. Es wird nur ein Alarm pro Türöffung gesendet. Wird die Tür wieder geschlossen, ist damit automatisch wieder scharf gestellt. Das Programm wird über Taste A gestartet und über Taste B manuell abgebrochen bzw. geht in den Standby. Der Touchsensor ruft die Kalibrationsroutine auf.
Nachtrag: 2x AAA reicht nicht aus. Die Spannung fällt zusammen, wenn der Wakeup (PIN1) auf dem WLAN Modul empfangen wird und das Modul den Strom über den Microbit abnimmt. Nach dem Austausch durch 3 x AA, 1.2V/2100mAh, mit Gehäuse als 3.6Volt geschaltet, funktioniert das. (ELV Elektronik)
Diagramm
Beschreibung
Power On / Wait
Button A – Run
Loop, Decision
Is <88’000
Loop Decision
Button B – Stop while looping
Is not <88’000
Counter
Button B – Stop while counting
(Entering Door, regular Stop)
Return to Wait
(No need to turn it on again)
Counter reached 5 (seconds from !(5) to 0)
Alarm
Pin1 Up
Module Wakeup
Connect WLAN
PushServer
Pushes Msg to Phone/App
& (AND)
Loop DoorOpen
> 90’000
Display Info
Return to DoorOpen
Is not >90’000
(Door closed)
Return to Decision
(still running)
Button B – Stop while looping
and so on.
Stand: Wenn die Türe geschlossen und beim Verlassen erneut geöffnet wird, wird ein weiterer Alarm gesendet. (still running)
Mögliche Erweiterung: Einen weiteren Alarm bei „Door closed“.
Sub:Kalibration
Beschreibung
Das Logo berühren (V2), löst die Routine „Calibration“ aus. Ein Punkt . läuft durch (Scroll). Bei erreichen des Schwellwertes wird ein X (Scroll) angezeigt. Bei Betätigung des Button B wird gestoppt und ein A angezeigt. (Button A für Start.)
Vorgehen:
Microbit und Laptop mit dem USB Kabel verbinden. Mu-Editor aufrufen. Programm laden, bei Bedarf Flash auf Microbit. Im Mu-Editor REPL anwählen. Microbit, Routine mit TouchLogo starten. Bei Problemen Reset Taste auf der Rückseite betätigen oder/und Programm einmal voll durchlaufen lassen und Stoppen. (B) Dann TouchLogo.
Die Werte auf der REPL-Konsole, Laptop, beobachten. Magnet justieren. Werte notieren. Wert kann danach in die Subroutine geschrieben werden, um das X bei der Türöffnung anzuzeigen. Wenn das gemacht wird, Microbit erneut flashen. (Aktualisierung)
# Calibration def calib(): while True: mov = (compass.get_field_strength()) print(mov) # Delay short utime.sleep_ms(100) display.scroll('.') if button_b.was_pressed(): display.show('A') break elif (mov) < 88000: <<< Hier neuen Schwellwert eingeben. display.scroll('X')
Wenn alles wie gewünscht funktioniert. Calib stoppen. (B). Angezeigt wird jetzt: A. Button A drücken um Programm zu starten.
Ganzer Code
# Magnop V1 fuer BBC micro:bit V2 # 08/2024, [email protected] # A-Button: Start/Restart # B-Button: Stop/Break # Touch-Logo: Calibration from microbit import * import utime import music # Waiting for Start (Button A) # display.set_pixel(2, 2, 4) def intro(): display.clear() display.set_pixel(4, 0, 6) utime.sleep_ms(200) display.set_pixel(3, 0, 6) utime.sleep_ms(200) display.set_pixel(2, 0, 6) utime.sleep_ms(200) display.set_pixel(1, 0, 6) utime.sleep_ms(200) display.set_pixel(0, 0, 6) utime.sleep_ms(200) display.set_pixel(0, 1, 6) utime.sleep_ms(200) display.set_pixel(0, 2, 6) utime.sleep_ms(200) display.set_pixel(0, 3, 6) utime.sleep_ms(200) display.set_pixel(0, 4, 6) utime.sleep_ms(200) display.set_pixel(1, 4, 7) utime.sleep_ms(200) display.set_pixel(2, 4, 7) utime.sleep_ms(200) display.set_pixel(3, 4, 7) utime.sleep_ms(200) display.set_pixel(4, 4, 8) utime.sleep_ms(200) display.set_pixel(4, 3, 8) utime.sleep_ms(200) display.set_pixel(4, 2, 8) utime.sleep_ms(200) display.set_pixel(4, 1, 8) utime.sleep_ms(200) display.set_pixel(4, 0, 8) utime.sleep_ms(1000) utime.sleep(3) display.clear() display.set_pixel(2, 2, 6) music.pitch(1500, 200) utime.sleep(1) display.clear() utime.sleep_ms(500) display.set_pixel(2, 2, 7) music.pitch(1500, 200) utime.sleep(1) display.clear() utime.sleep_ms(500) display.set_pixel(2, 2, 9) music.pitch(2000, 200) utime.sleep(1) display.clear() utime.sleep_ms(500) music.play(['c', 'a', 'b']) def alarmready(): display.clear() display.set_pixel(2, 2, 6) utime.sleep_ms(200) display.set_pixel(2, 2, 4) utime.sleep_ms(1000) def opendoor(): while True: mov = (compass.get_field_strength()) # Delay middle utime.sleep_ms(500) if (mov) < 88000: display.scroll('|') display.set_pixel(0, 0, 7) display.set_pixel(0, 1, 7) display.set_pixel(0, 2, 7) display.set_pixel(1, 2, 8) display.set_pixel(0, 3, 7) display.set_pixel(0, 4, 7) utime.sleep(2) display.clear() if (mov) > 90000: break def alarmset(): while True: mov = (compass.get_field_strength()) # Delay long utime.sleep_ms(1000) if (mov) < 88000: display.scroll('|') display.show('!') utime.sleep(1) display.show('4') utime.sleep(1) display.show('3') utime.sleep(1) display.show('2') utime.sleep(1) display.show('1') utime.sleep(1) display.show('0') if button_b.was_pressed(): display.clear() music.pitch(1500, 200) display.set_pixel(2, 2, 4) utime.sleep(2) display.clear() break pin1.write_digital(1) music.pitch(1500, 200) music.pitch(1500, 200) music.pitch(1500, 200) utime.sleep_ms(1400) pin1.write_digital(0) opendoor() elif (mov) > 90000: alarmready() if button_b.was_pressed(): music.play(['c', 'b', 'as']) display.clear() display.set_pixel(2, 2, 4) utime.sleep(2) display.clear() break # Calibration def calib(): while True: mov = (compass.get_field_strength()) print(mov) # Delay short utime.sleep_ms(100) display.scroll('.') if button_b.was_pressed(): display.show('A') break elif (mov) < 88000: display.scroll('X') # Run / Restart while True: if button_a.is_pressed(): intro() alarmset() elif pin_logo.is_touched(): calib() # End of Code
Nach der Kalibrierung muss überall der Wert der Variable ‚mov‘ entsprechend angepasst werden. def opendoor und def alarmset. An insgesamt 4 Stellen.
Der Schwellwert für das Öffnen, sowie das Schliessen der Tür wird am einfachsten mit der Kalibration ermittelt. (REPL)
Nach erfolgter Änderung, nicht vergessen den Code zu speichern und auf den Microbit hochzuladen. (FLASH im Mu-Editor).
- Austesten des Codes auf: https://python.microbit.org/v/3 (Tür ist immer offen.) (Copy&Paste. Ganzer Code bis Zeile # End of Code)
- A – Start, B – Stop (nur während Countdown), Touch – Kalibration (Tür muss für B- Stop geschlossen sein. Kann nicht simuliert werden.)
Sonstiges
Statt eines WLAN-Modules, könnte über ein Relais eine Alarmsirene angesteuert werden.
Inspiration/Referenz: Link
Anhang I
Stromsparende Massnahmen:
- Zeilen mit „music.play“ löschen
DeepSleep und PowerOff hat zumindest bei meiner Microbit V2 bisher nicht funktioniert.
Geplante Erweiterungen
- LED Alarm Modul (Rot-Blau, hell blinkend) mit Relais
- Sirene ca. 80 dB
- Radar
Ausführung
- Radar als Näherungsschalter der den LED Alarm solange ansteuert, bis sich die Person wieder entfernt. (ca. 2 Meter)
- Radar als Näherungsschalter der bei grosser Näherung kurz die Sirene ansteuert, Warnton. (unter 1 Meter)