Mein Traum seit vielen Jahren ist es ein drahtloses Multimeter aufzubauen. Mit den M5Stack Geräten ist dieser Traum der Wirklichkeit sehr viel näher gerückt und mit dem Erscheinen der isolierten Units VMeter und AMeter steht der Realisierung nun nichts mehr im Wege.

Erster Testaufbau – ein chaotisches Gewusel

Auf dem Bild seht Ihr den ersten Testaufbau. Dank der Steckmöglichkeiten war es schnell zusammengesteckt und getestet und funktionierte. Die Spannungswerte sind zwar nicht real aber die Grundsätzliche Funktion ist gegeben. Die Spannungseingänge sind offen und fangen sich offenbar alle möglichen Störsignale ein. Die Stormaufnahme von 500mA enthält den Ladestrom für den Akku des M5Stick Cplus. Mit geladenem Akku sind es immerhin noch 460mA.

Ganz einfach war es nicht diese Kombination zu realisieren, weil die UIFlow-IDE es nicht ermöglichte ohne weiteres die Units am PaHUB zu betreiben. Erst der in diesem Beitrag beschriebene Trick brachte den Durchbruch:

Der Workaround ist nun nicht mehr erforderlich.

Die Units können inzwischen auch direkt in der UIFlow-IDE hinter einem PaHUB benutzt werden.

Das erste Testprogramm

Das erste Testprogramm – Die GUI wurde mit dem UI-Simulator von UIFlow erstellt.
Das an die neuen Möglichkeiten der UIFlow-IDE angepasste Programm (MVA033-010.m5f).

Messgenauigkeit

VMeter Unit

Um überhaupt etwas messen zu können habe ich eine LiIon-Zelle an alle drei VMeter angeschlossen. Eine davon invers gepolt. Das geht Dank galvanischer Trennung der Messteile problemlos. Die Anzeige schwankt zwischen 3,463 und 3,475 Volt. Als eine Unsicherheit von 12 mV. Die Spannungsänderungen springen in 4 mV Schritten. Mein Rigol DM3068 zeigt 3,4629 Volt an. Das entspricht -0% … +0,35% Abweichung. Für allgemeine DIY-Messungen völlig in Ordnung.

AMeter Unit

Zum testen der AMeter habe ich alle drei und das Rigol in Reihe geschaltet und an ein Hameg HM8040 Netzgerät angeschlossen. Mit dem Stromegrenzungspoti habe ich den Stron eingestellt. Da ich die Stromanzeige auf ganze mA eingestellt habe gibt es bei den kleineren Strömen ungenauigkeiten. dazu werden ich anschließend eine Weitere Messreihe durchführen.

DM3068AMeter
10,0776 mA10 mA
20,461 mA20/21 mA
50,76251/50 mA
99,315100/99 mA
201,025201/202 mA
301,47301/302/304 mA
404,92405/406/407 mA
mehr geht nicht beim HM8040

Auch diese Werte können sich sehen lassen. Alle Abweichungen <1%.

Maximal können Ströme bis ±4 A gemessen werden. Die höheren Ströme werde ich später testen. Genauso wie Ströme <1 mA.

Drahtlose Kommunikation

Ein großer Vorteil des ESP32 ist es, dass die Messwerte drahtlos übertragen werden können. Dafür stehen die WLAN-Einheit oder die Bluetooth-Einheit des ESP32 zur Verfügung.

Ein eigenes Übertragungsprotokoll

Im Prinzip ermöglichen die unten aufgeführten drahtlosen Übertragungsprotokolle schon Alles. Warum also noch ein eigenes Protokoll darauf setzen?

Der wesentliche Grund ist, dass es mir beim ESP Now – das ich bevorzugt einsetzen möchte – noch nicht gelungen ist mit der UIFlow-IDE im laufenden Betrieb neue Peers in ein Netzwerk aufzunehmen. Die MAC-Adresse muss zur Programmierzeit bekannt und fest im Programm vorgegeben sein. Damit lässt sich aber kein flexibles zur Laufzeit zusammenstellbares Mess-Netzwerk aufbauen.

https://www.peters-bastelkiste.de/wp-admin/post.php?post=694&action=edit

ESP Now

ESP Now ist ein Protokoll von Espressif, dass die UIFlow-IDE unterstützt. Damit ist recht einfach ein kleines Netzwerk aufgebaut, dass keinen Accesspoint benötigt. Die einzelnen ESP32 Geräte kommuniziernen direkt miteinander. Der Nachteil ist, das bei der Programmierung mit der UIFlow-IDE die MAC-Adressen aller Mitglieder eines solchen Netzwerkes bekann sein müssen. Ob das bei ESP Now grundsätzlich so ist glaube ich nicht. Es ist mir bisher aber nicht gelungen einen Workaround für Micropython und damit für Blockly zu finden. Man kann mit ESP Now aber auch Broadcast Packete aussenden, so dass jedes andere Gerät die Informationen empfangen kann. Das ist zwar nichts für reale Anwendungen, aber zum Ausprobieren ist es zu gebrauchen.

Ein einfaches Programm, dass alle 6 Messwerte ermittelt und anzeigt. U1 wird als Broadcast mit ESP Now gesendet.
Hier das dazugehörige Empfangsprogramm

Die beiden oben abgebildeten Programme zeigen die Möglichkeit der Übertragung mit ESP Now.

Eine Schwierigkeit bei ESP Now ist, dass die Daten als String übertragen werden. Wenn Die Daten in eine Liste gepackt werden und diese Liste übertragen wird sieht der String nach dem Empfang so aus: „[ Wert1, Wert2, Wert3, Wert4, Wert5 Wert6] „. Die Werte daraus zu entpacken ist etwas umständlich. Zuerst müssen die eckigen Klammern entfernt werden:

Aus dem von den eckigen Klammern befreiten String kann nun wieder eine Liste erstellt werden:

Nun ist tmp_date eine Liste die die Messwerte enthält.

In einer Schleife lassen sich nun die Messwerte auslesen. Hier ein kleines Programm, dass die Messwerte untereinander im Display darstellt, zurechtgestutzt auf ganze mV und mA.

Ein universelles Empfangprogramm. Es wird eine Liste mit Daten erwartet und dargestellt.

Hier kann das Programm heruntergeladen werden:

Das dazugehörige Sendeprogramm sieht so aus:

Ein einfaches Sendeprogramm, dass die Daten der 6 Messstellen in eine Liste verpackt überträgt.

Damit kann man schon erste Versuche anstellen.

MQTT

MQTT ist ein Protokoll, dass für den Zweck der Messwerverteilung sicher gut geeignet ist. Es benötigt im WLAN aber einen Brocker, der die Daten entgegen nimmt und weiterverteilt an die Geräte die diese abonniert habe.

WLAN

Das Gerät mit einem Webserver auszurüsten und die Daten dort abzuholen oder vom Server zuschicken zu lassen ist wohl die Königsklasse der drahtlosen Übertragung. Dazu fehlt mir aber noch einiges an Wissen, so dass dieser vorläufig nicht von mir beschritten werden wird.

Grenzwertüberwachung

Die integration einer Grenzwertüberwachung erweitert den Einsatzbereich des Gerätes. Dazu ist eine Tastatur zur Eingabe der Grenzwerte und eine Ausgabe durch Logiksignale, ggf. eine Darstellung auf dem Display.

Für die Grenzwertüberwachung ist wie schon erwähnt eine Tastatur erforderlich, die 5, 7 oder 8 Leitungen benötigt, je nach Anzahl der Tasten. Ausserdem sollte eine Grenzwertüberschreitung auch nach
Außen gemeldet werden. Dazu sind weitere 6 oder 12 Leitungen erforderlich. Je nach dem ob Über- und Unterschreitung oder nur eine einfache Meldung erfolgen soll.

Nun wird es eng auf dem I2C-Bus. Es werden weitere 2 bis 3 I/O-Expander benötigt. Das funktioniert nicht weil deren Adresse nicht umgestellt werden kann (in der UIFlow IDE). Ein weiterer PaHUB kan auch nicht eingesetzt werden, aus dem selben Grund. Der Versuch einen I/O-Expander und einen PbHUB zu kombinieren schlug auch fehl, weil ein I2C-Error gemeldet wurde. Der PbHUB belastet den I2C-Bus offenbar zu stark. Eine M5Stack inherente Lösung gibt es offenbar nicht. Deshalb habe ich I2C-Bus -Expander-IC’s bestllt. Ich hoffe damit lässt sich das Problem lösen.

Ich habe das Proglem mit den fixen Adressen in der UIFlow-IDE und damit auch in Micropython zwar an M5Stack weitergegeben, aber aufgrund meiner bisherigen Erfahrungen rechne ich mit großer Resonanz.

Alternativ könnte das Problem mit den Adressen mit der Arduino-IDE gelöst werden. Soweit ich weiß, kann man dort die I2C-Adresse eines Bausteins angeben. Aber ich wollte doch bei Blockly und Micropython bleiben.

Eingabe Tastatur

Als Eingabetastatur käme eine 4×4-Matrix-Tastatur in Frage. Diese ist aber relativ groß. Alternativ könnten auch Touchkeys zum Einsatz kommen. Deren Eignung muss aber noch untersucht werden.

Software

Die Software muss zum Einen die Eingabe des Grenzwertes für jeden Messkanal ermöglichen. Während des Messens müssen die Werte überprüft und ggf. Aktionen ausgeführt werden.

Darstellung im Display

Im Display kann ein Wert normal grün, in der Nähe des Grenzwerte gelb und bei überschreiten des Grenzwertes rot angezeigt werden.

Ausgabe

Die Ausgabe könnte durch Darlingten-Treiber-IC z.B. ULN2008 realisiert werden. Das ist universal einsetzbar und kann ggf. auch Relais treiben.

Ein bytearray ist eine Python Datenstruktur, die eine Reihe von Byte-Werten (8-Bit, 0 – 255) enthält. Die Daten können verändert werden.

Diese Datenstruktur gibt es auch in Micropython. Hier wurde sie aber nicht vollständig implementiert. Das soll nun untersucht werden.

Hier habe ich die Beschreibung für Python gefunden: https://python-reference.readthedocs.io/en/latest/docs/functions/bytearray.html und diese mit Deepl.com übersetzt:

bytearray

Beschreibung

Gibt ein neues Array aus Bytes zurück.

Syntax

bytearray ([source[, encoding[,errors]]])

source Optional. Wenn die Quelle:

  • eine Zeichenkette ist, dann ist eine Kodierung erforderlich.
  • eine Ganzzahl ist, das Array hat diese Größe und wird mit Null-Bytes initialisiert.
  • ein Objekt ist, das der Pufferschnittstelle entspricht, ein schreibgeschützter Puffer des Objekts wird zur Initialisierung des Byte-Arrays verwendet.
  • ein Iterable ist, es muss ein Iterable von Ganzzahlen im Bereich 0-256 sein, die zur Initialisierung des Arrays verwendet werden
  • ohne ein Argument wird ein Array der Größe 0 erzeugt.

encoding Optional.

Erforderlich, wenn die Quelle eine Zeichenkette ist. Typische Werte: ‚ascii‘, ‚utf-8‘, ‚windows-1250‘, ‚windows-1252‘. Siehe Codecs-Modul für weitere Informationen.

errors Optional.

Mögliche Werte für errors sind:

  • strict‘: löst bei einem Kodierungsfehler eine Exception aus
  • replace“: ersetzt fehlerhafte Daten durch eine geeignete Ersatzmarkierung, z. B. ‚?‘ oder ‚ufffd‘.
  • ignore“: Fehlgeformte Daten ignorieren und ohne weitere Benachrichtigung fortfahren
  • xmlcharrefreplace‘: Ersetzen durch die entsprechende XML-Zeichenreferenz (nur bei Kodierung)
  • backslashreplace‘: Ersetzen durch Backslashed-Escape-Sequenzen (nur für Encoding)

Rückgabewert

bytearray

Ersetzen durch Backslashed-Escape-Sequenzen

Die führende Escape-Sequenz \x bedeutet, dass die nächsten beiden Zeichen als Hex-Ziffern für den Zeichencode interpretiert werden, also entspricht \xaa chr(0xaa).

Bemerkungen

Der Typ Bytearray ist eine veränderbare Folge von Ganzzahlen im Bereich 0 <= x < 256. Er kann verwendet werden, um mit Low-Level-Binärdaten zu arbeiten, wie z. B. innerhalb von Bildern oder direkt aus dem Netzwerk kommend.

Was geht in Micropython?

Die ersten Quelle (String) probieren. Zuerst in Thonny, dann die Ausgabe auf dem Display:

Funktioniert.

Die zweite Möglichkeit: eine Ganzzahl:

Funktioniert.

Die dritte Möglichkeit lasse ich aus, weil ich nicht weiss was das ist.

Die vierte Möglichkeit ist z.B. eine Liste. Das interessiert mich besonders.

So geht’s nicht. Aber auch im im „echten“ Python geht es nicht.

Nun nochmal mit Zahlen:

So geht’s. Auf ein Bild des Displays verzichte ich hier. Es sieht so aus wie man es erwartet.

Die Ausgabe zeigt die Darstellung in Hex-Schreibweise (\x). Wenn Hexzahlen eingegeben werden sollen ist zu beachten, dass hunter dem b nur einfache Anführungszeichen verwendet werden dürfen (b’…‘).

Nun der Vollständigkeit wegen noch die fünfte und letzte Möglichkeit:

Auch hier verhält sich die Displayausgabe genauso wie die im Terminalfenster.

Demzufolge verhält sich bytearray in Micropython genauso wie im „echten“ Python!

11. Januar 2021 · Kommentare deaktiviert für Herzlich Willkommen auf meiner Website! · Kategorien: Allgemein

Diese Website ist ein rein privates Projekt. Es verfolgt keinerlei kommerzielle Ziele. Deshalb werden von mir auch keine persönlichen Daten gespeichert. Deshalb kann sich auch niemand auf dieser Website anmelden und Kommentare hinterlassen. Der Provider (1blu.de) speichert die Verbindungsdaten für einen begrenzten Zeitraum.

Dieser Blog dient mir dazu meine Projekte zu dokumentieren und meine Erfahrungen damit festzuhalten. Er ist im Internet frei zugänglich, damit auch Andere von meinen Erfahrungen profitieren können. Schließlich muss nicht jeder das Rad selbst erfinden.

Mein Beiträge sind keine Bauanleitungen! Es besteht kein Anspruch darauf, dass die vorgestellten Projekte bei einem Nachbau funktionieren! Sollten dabei Schäden entstehen, so ist dafür der Nachbauer verantwortlich. Schließlich sollte jeder wissen was er tut. Ich schließe jede Haftung aus.

Die Beiträge können nur als Anregung angesehen werden.

Wenn Du mir etwas mitteilen möchtest, so schicke mir unter peter@peters-bastelkiste.de eine Email.

Viel Spaß beim Stöbern.

Peter

Ich würde gerne in einem ESPNow-Netzwerk auch mit dem PC mitmachen. Vor allem, um einem Programm auf dem PC den Zugriff auf Geräte im ESPNow-Netzwerk zu ermöglichen. Deshalb habe ich mit einem M5ATOM lite ein entsprechendes Programm entworfen.

Hier ist der erste funktionsfähige Entwurf:

Der erste funktionsfähige Entwurf von E2S (ESPNowAdapter_001.m5f)

An diesem Entwurf gibt es noch viel zu tun. Die grundlegende Brückenfunktion zwischen ESPNow und PC funktionieren aber schon. Bisher können auf der ESPNow Seite aber nur Broadcast-Nachrichten benutzt werden. Später wird es erforderlich sein auch mit einzelnen Geräten direkt zu kommunizieren.

Die Variable serialmode wurde eingebaut, um ggf. den Echobetrieb, wie er standardmässig von Putty verwendet wird zu unterstützen. Sonst sieht man nicht was man schreibt. Das ist aber nur für Terminalbetrieb sinnvoll. Man kann natürlich auch im Terminalprogramm den Echomodus abschalten. Wenn ein Programm auf das ESPNow-Netzwerk zugreift, weiß es was es tut und benötigt die Rückmeldung nicht, es wird dadurch eher verwirrt.

Die serielle Schnittstelle (UART) ist mit den Pins 1 und 3 verbunden. Das ist der Anschluß des Seriell zu USB-Wandlers. Deshalb kann der PC einfach mit einem USB-Kabel angeschlossen werden. Über die entsprechende COM-Schnittstelle kann dann das ESPNow-Netzwerk erreicht werden.

Fortsetzung folgt …

2. Anlauf

Beim ersten Versuch habe ich als Hardware einen M5ATOM lite genommen. Nun wollte ich aber mehr Kontrolle über das Geschehen haben und auf einen M5Sick C+ zurückgegriffen, der gerade auf dem Arbeitsplatz herum lag. Die empfangenen Daten werden jetzt auf dem Display angezeigt.

So sieht das ganze Programm aus:

Das Zweite Programm für den M5Stick C+ (ESPNowAdapter_004.m5f)

Da die Einzelheiten darauf nur schlecht zu erkennen sind folgen jetzt die 3 Blöcke einzeln:

Das Hauptprogramm

Hauptprogramm

Display darstellen.

Diese Funktion stellt die Informationen auf dem Display dar. Allerdings nur halbherzig. Es gibt nur die seriell empfangenen Daten aus. Da es mir in diesem Programm nicht auf ein perfektes Design, sondern auf den Funktionalität ankommt, habe ich keine weitere Zeit inverstiert. Wird vielleicht später nachgeholt.

Funktion: refresh_screen

Die ESP Now Empfangsroutine

ESP Now arbeitet interruptgesteuert. Wenn eine Nachricht eintrifft, wird ein Inerrupt ausgelöst, das Hauptprogramm unterbrochen und die Interrupt Service Routine abgearbeitet. Also das was im nächsten Bild zu sehen ist. Anschließend wird das Hauptprogramm dort fortgesetzt wo es unterbrochen wurde.

Die Interrupt Service Routine für den ESP Now Empfang

Auf der seriellen Seite sieht es in einem Terminal u.B. so aus:

Terminalfesnster

Die letzte, die drittletzte und die fünftletzte Zeile wurden vom Terminal zum ESP Now Netz geschickt.

Es gibt keinen speziellen HOME-Button – stattdessen auf den Schriftzug „Peter’s Bastelkiste“ klicken!