Seltsames Verhalten bei Säulendiagramm

Hallo,
Ich mache gerade eine kleine Zustands-Inventur einer größeren Menge von Calliopes und habe mir dafür mit Makecode ein ein kleines Programm zusammengeklickt, um die wichtigsten Funktionen der Calliopes zu testen.

Dabei ist aber bei mehreren Geräten ein seltsamer Fehler aufgetreten, den ich mir nicht erklären kann.

Hier zunächst ein Bild meines Testprogramms:

Wenn ich nun am Anfang Button B drücke, um in die Testschleife fürs Mikrofon zu springen, funktioniert alles wie geplant. Wenn ich pfeife, geht das Säulendiagramm hoch. Wenn ich aber vorher in der Testschleife für den Helligkeitssensor war (Button B), und dann zum Mikro-Test übergehe, dann zeigt die LED-Matrix das Säulendiagramm nicht mehr richtig an. Stattdessen blitzen nur einige wenige LEDs hier und da auf.

Ich habe zur Veranschaulichung ein kleines Video gedreht und bei Youtube hochgeladen: https://youtu.be/8UDNvsdZh9o

Kann mir jemand dieses Phänomen erklären?
Hab ich irgendwas falsch gemacht oder nicht verstanden?

An dem Mikrofon-Problem, dass einige V 1.0 Calliopes haben, liegt es nicht, da der Effekt bei 1.3er Calliopes auch auftritt.

Ich freue mich auf Eure Rückmeldungen
Felix

[EDIT] Die Zeile mit Variable LS habe ich entfernt. Die war überflüssig. Das Problem besteht aber weiterhin

Hey ich hab es eben auch mal ausprobiert. Hast du vielleicht „A“ zweimal kurz hintereinander gedrückt und dann erst „B“?
Da er so erstmal das erste „Wenn A“ gedrückt solange macht bis du „B“ drückst und dann gleich nochmal ein „wenn A“ gedrückt während er aber mit den „wenn B“ schon beginnt.
Also so war es bei mir nach kurzer Zeit hatten dann aber wieder alle LED’s geleuchtet wie bei einem normalen „wenn A“ gedrückt.

Also so würde es für mich auch Sinn ergeben, wenn du z.B. die Klicks mit Taste A zählst und die anzeigen lässt merkst du auch, dass wenn du schneller drückst wie die Zahl angezeigt wird nach z.B. 5mal schnell klicken die Zahlen nacheinander dann noch angezeigt werden.

Oh, einen Fehler hab ich gerade selbst gefunden.
Die Zeile in der die Lautstärke ausgelesen und in der Variable LS gespeichert wird, ist natürlich überflüssig. Die ist noch durch andere Tests übrig geblieben.
Aber auch ohne die Zeile tritt der beschriebene Effekt auf.

Also meiner Meinung nach kann das Programm nicht in mehreren Wenn-B-Gedrückt-wurde-Schleifen gleichzeitig sein, sondern die werden in eine Warteschlange gepackt und nacheinander abgearbeitet.
Ich habe das Programm jetzt mal angepasst, sodass ich nicht auf Drücken der jeweils anderen Taste warte, sondern, sondern aufs Loslassen der jeweiligen Taste.

Siehe folgendes Bild:

Wenn ich nun B einmal drücke (mit loslassen) und dann wieder drücke und festhalte, bleibt er in B. Wenn ich dann loslasse, löscht er die LED-Matrix, verlässt er die Funktion und tut nix (was ok ist)
Wenn ich jetzt 5 mal B drücke und dann festhalte, funktioniert die Funktion auch, aber nach dem loslassen, zeigt er mir noch 4 mal B, weil er die B-Schleife noch 4 mal startet (Warteschlange abarbeiten).
Jede der B-Schleifen funktioniert einwandfrei, bis ich einmal in der A-Schleife war. Dann blitzt das Display wieder seltsam rum, sobald ich in der B-Schleife bin.
Die-A-Schleife (Helligkeit) funktioniert IMMER tadellos

Es scheint in MakeCode gerade ein Problem mit der Anzeige von Symbolen enthalten zu sein, die sich zufällig und nicht einfach reproduzierbar zeigt. Wir sind da gerade dran, sind aber noch auf der Sucher. Wenn du einen Funktionstest machen möchtest, ihm besten entweder ohne Symbole testen oder kurz die alte Version des Editors nehmen (MakeCode.calliope.cc/v1).

Solche Schleifen sind immer etwas fummelig, ich versuche deshalb meist nur die Dauerhaft schleife zu verwenden und die Steuerung über Variablen und Funktionen zu regeln.

Das Problem ist aber in diesem Fall glaube ich gar nicht die schleife, sondern, dass das Mikrofon nachdem die Helligkeit gemessen wurde nicht mehr bei jedem Aufruf den wert zurückgibt, sondern oft nur 0.

Schau dir dazu gerne mal das folgende Projekt an:

Den Bug umgehe ich hier mit einer schleife, die auf einen Wert > 0 wartet. Echte 0 Werte würden jetzt gar nicht geplottet werden und auch das verlassen der Funktion ist erst möglich, wenn die Lautstärke großer 0 ist - also nicht ganz optimal, aber in der Praxis funktioniert es wenigstens (zumindest bei mir).
image

Die eigentliche Ausgabe mache ich in der Dauerhaft-Schleife.
getVal() gibt einfach je nach dem welchen Wert die Modus Variable hat einen anderen Wert zurück.

Die LED Anzeige aktivieren Blocke sind vermutlich nicht nötig, aber ich hatte sie jetzt beim testen einfach drin, da das Messen der Helligkeit ja über die LED passiert.

Hey Juri, vielen Dank für deinen Input.
Gut zu wissen, dass andere auch das Problem haben.
Dann weiß ich wenigstens, dass es nicht an mir liegt.
Deine Lösung des Problems finde ich gut.
Beste Grüße und nochmal vielen Dank.
Felix

Okey bei mir hatte er dann halt einfach alle A Warteschlangen abgearbeitet und während dessen auch das unter B also Lautstärke zeichnen angefangen. Sah eben aus wie bei dir im Video nur das es sonst ging.