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.

Das Substantiv Vergebung

Vergebung ist nur dann möglich, wenn vorab die Verantwortung der Person, der zu vergeben wäre, von dieser Person selbst anerkannt wurde. Das bedeutet, die nicht wahrgenommene Verantwortung für ein Tun oder eine Unterlassung muss zuerst einmal eingestanden sein.

Wird dieser Schritt übersprungen, so ist die Vergebung vorgreifend wirkungslos und auch sinnlos, weil der Schritt der Verantwortung, wie beschrieben, übersprungen wurde und also jederzeit wieder zurückschlagen kann, weil oder wenn die Verantwortung nicht klar ausgesprochen, also eingestanden wurde. (Klärung.)

Es ist daher im Sinne der Tragfähigkeit, nicht sinnvoll, jemandem etwas zu vergeben, wenn dieser Person gar nicht klar ist, welche Verantwortung sie übersprungen hat.

In eigener Sache kann die Vergebung trotzdem sinnvoll sein.

Schuldzuweisungen sind an diesem Punkt oft eher Schuldverschiebungen, um Fehler nicht eingestehen zu müssen. Das kann bewusst oder unbewusst sein. Der Prozess der Bewusstwerdung kann nicht umgangen werden. Beschönigungen sind bezüglich der Lösung des Konflikts nicht zielführend.

Man kann in diesem Zusammenhang von Schuld sprechen, aber das ist erst sinnvoll möglich, wenn die Schuld im Sinne der Verantwortung geklärt ist. Ab diesem Punkt ist Vergebung oder Sühne angezeigt.

Sühne vor allem dann, wenn die Verfehlung als bewusste Missachtung von Grenzen, also als Übertretung geschah, die eine Böswilligkeit billigt. Böswilligkeit im Sinne eines Vorteils oder zur Vermeidung eines Nachteils auf Kosten einer Person, die diesbezüglich und ausdrücklich keine Schuld trifft.

Die an und in diesem inneren und äusseren Konflikt schuldlose Person, wie beschrieben, wird entlastet, so dies dem wahren Verhältnis der Sachlage entspricht. Man spricht Wahrheit. Der Person, die Schuld trägt, wird die Gelegenheit der Vergebung oder der Sühne gegeben. Die der Vergebung wird gesprochen. Die der Sühne wird gebüsst.

„Fair enough.“

Passkey Routine

Ausschnitt für Bash-Scripts zur Abfrage eines Passkeys.

Dieser Ausschnitt (Subroutine) fragt einen FIDO2-fähigen Security Schlüssel zur Identifikation ab, wenn beispielsweise ein Skript ausgeführt wird, das Dateien zwischen zwei Rechnern über rsync/ssh kopieren/abgleichen soll, ohne UDEV zu bemühen. Es ist ein infiniter Loop, der so lange läuft, bis ein gültiger Schlüssel eingesteckt wird. Die Wartezeit beträgt 10 Sekunden und die Aufforderung den Schlüssel einzustecken wird also in diesem Intervall wiederholt.

echo " Checking for Passkey"
CHECKPASS=0

while [ "$CHECKPASS" = "0" ]
do
"PASSKEY=`lsusb | grep FIDO2 | awk '{ print $8 }'` "
if [ -z "$PASSKEY" ]; then
echo "Please insert Passkey" ; sleep 10
else
CHECKPASS=1
echo "Passkey found"
fi
done

Die Anführungszeichen (fett) bei der Zeile: PASSKEY=`lsusb....`müssen für die Verwendung im Skript am Anfang und am Schluss der Zeile entfernt werden. Leider werden die (linksgerichteten!) Hochkommas nicht dargestellt, wenn keine Anführungszeichen gesetzt werden. (Darstellungsproblem Blog.)

Um festzustellen, ob der Key FIDO2 kann, einfach in einer Shell das Kommando: lsusb | grep FIDO2 eingeben und sehen was zurückgegeben wird.

! Der Code setzt voraus, dass zuvor ein gültiger SSH-Key mit Typ ecdsa-sk für den Zielrechner erstellt und auf den Zielrechner kopiert wurde. Bsp.

cd $HOME/.ssh
ssh-keygen -t ecdsa-sk -C "($(hostname)-$(date +'%d-%m-%Y')-mypasskey-1"
ssh-copy-id -i id_ecdsa-mypasskey-1.pub [User]@[Zielrechner]

Zum Datenabgleich zwischen zwei Rechnern sollte auch das Programm „Unison“ in Betracht gezogen werden. Bei der Ausführung von unison, ist diese Routine nicht notwendig. Linux (Ubuntu), Kommando: sudo apt info unison

Bekenntnis zum kleinen Bruder

Der kleine Bruder, oder auch, die kleine Schwester ist die Person, auf die man ein Auge hat, damit ihr nichts schlechtes passiert oder damit sie keinen groben Unfug veranstaltet.

Der Unterschied zum grossen Bruder aka „Big Brother“ ist folgender.

Ich übernehme eine gewisse Verantwortung, ohne mich in seine Intimsphäre einzumischen. Weder kontrolliere ich ihn, denn ich möchte ja, dass er selbst einmal die Verantwortung für sich selbst übernimmt, noch werfe ich fortwährend Werbesendungen in sein Zimmer, noch versuche ich ihn für mein eigenes Weiterkommen zu benutzen. Ebenfalls werde ich die besagte Verantwortung nicht als Freifahrtschein benutzen, um ihn nach Belieben da hinzuführen, wo ich ihn haben will. Damit ist ein Machtverhältnis angesprochen.

Dieses Verhältnis, so vorhanden, ist auszugleichen. Dafür wird über kurz oder lang der kleine Bruder selbst sorgen müssen. Das ist die erste Verantwortung, die er in seinem ureigensten Interesse übernehmen muss. Er bekundet damit seinen Willen zum erwachsen werden. Der erste wichtige Schritt zu Emanzipation und Integrität.

Wie muss die «digitale Revolution» aussehen? Mehr KI? Noch mehr Bequemlichkeiten, die auf Dauer unbequem werden können? Noch mehr des angeblichen Nutzens und Effizienz, um einen 24-Stunden-Tag auf virtuelle 30 Stunden zu komprimieren? Gibt es Alternativen?

Gewendet. Wie wird der kleine Bruder auf gar keinen Fall erwachsen? Wer hat ein Interesse daran und warum?

Ich denke, die Verantwortung für die weitere Entwicklung wird zu einem grossen Teil bei denen sein, die diesbezüglich erwachsen werden wollen. Die eine Kultur besagt, noch mehr, noch schneller und effizienter. Die andere wird sich, in ihrem eigenen Interesse, besinnen müssen, um der schleichenden Selbstentfremdung zu entgehen.

«Quo vadis»

(Picture by AI)

Betreutes Wohnen

Linux kenne ich seit etwa Kernel Version 0.96. Damals war das noch eine sehr spezielle Sache. Kernel kompilieren war Standard.

Windows wurde bei mir über die Zeit komplett ersetzt. Auf einem Rechner ist noch die Version 10 installiert. Der Minicomputer steht allerdings im Schrank. Schon eine ganze Weile. Mit der Version 11 hatte ich noch kurz Kontakt, bevor sie auf eine eigene Umlaufbahn geschickt wurde.

Vermisse ich etwas? Ausser einem nostalgischen Gefühl, nichts. Aber das war auch bei DOS so. Die Dosbox ist unter Ubuntu im Handumdrehen installiert. Das reicht für die Nostalgie.

Nicht das ich etwas gegen Windows als Betriebssystem hätte. So ist das nicht. Nur missfällt mir die zunehmende Gefrässigkeit. Zuoberst auf meiner Liste steht „Privat“. Dann alles Weitere. Darf so bleiben. Deswegen, Linux. Das liesse sich noch weiter straffen, aber es reicht erst mal.

Meine Prognose. Wer als erster verstanden hat, dass Menschen eine Privatsphäre wollen, die geschützt sein muss, der gewinnt letztlich den Marathon, weil sich Menschen nicht veräussert, sondern aufgehoben wissen wollen. So einfach ist das.

a view of a building through a window

Nicht immer zeigt der Blick in ein Fenster, was sich drinnen befindet.

(Picture: MLenk)