BBC micro:bit

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

Sonstiges

Statt eines WLAN-Modules, könnte über ein Relais eine Alarmsirene angesteuert werden.

Inspiration/Referenz: Link

Anhang I

Stromsparende Massnahmen:

  • Power LED auslöten. (Kann nicht abgeschaltet werden.)
  • Zeilen mit „music.play“ löschen

DeepSleep und PowerOff hat zumindest bei meiner Microbit V2 nicht funktioniert.

Comment