Das sprechende Multimeter - Teil 6 - AZ-Delivery

Der letzte Teil unserer Beitragsreihe (Teil 1, Teil 2, Teil 3, Teil 4, Teil 5) soll zeigen, wie man mit etwas Programmierung das TDMM mit einen Command Processor ausrüstet, der die Steuerung des TDMM übernehmen kann und einfach erweiterbar ist. Außerdem lernen wir die Library EEPROM.h kennen, mit der wir die Einstellungen des Gerätes dauerhaft speichern können.

Ich habe für Sie ein paar Beispiele von einfachen „virtuellen Messgeräten“ integriert, die z.B. auf die Überschreitung eines Grenzwertes reagieren. Eine Meldung kann per Sprachausgabe erfolgen, oder über den seriellen Port. Auch eine Meldung über MQTT ist möglich, so dass eine Aktion ausgelöst werden kann. Z.B. kann ein Ladegerät abgeschaltet werden, bevor der Akku überladen wird. Damit bekommen wir Funktionen, wie sie in professionellen Messgeräten zu finden sind.

Der Command Processor und EEPROM.h können in vielen anderen Projekten angewendet werden. Es lohnt sich vermutlich, sie etwas genauer zu studieren.

So arbeitet der Command Prozessor

Wir sehen im Sketch die neue Library <MD_cmdProcessor.h>. Die GitHub-Seite liefert weitere nützliche Informationen. Es gibt mehrere Blöcke, deren Anordnung beachtet werden sollte:

Direkt vor void setup() liegt die Kommando-Tabelle. „Fest verdrahtet“ ist die Help-Funktion, die mit einem „?“ oder „h“ aufgerufen wird. Der sog.  „Handler“   void handlerHelp(char* param)

für die Help-Anweisung steht unterhalb der Tabelle, direkt vor void setup().

Alle Kommandos werden in der Kommandozeile des seriellen Monitors eingegeben. Bitte achten sie darauf, dass das Zeilenende durch „Neue Zeile“ gebildet wird. Das ist wichtig, weil sonst die Kommunikation nicht funktioniert.

Alle Handler für die eigenen Kommandos stehen vor der Tabelle.
Schauen wir uns mal ein eigenes Kommando an: 

 { "lu",  handlerLU,    "u",   "Spannungslimit Bsp: lu 15 | abschalten lu 9999", 1 },

lu

So heisst das Kommando. Es darf aus 1 oder 2 Zeichen bestehen.
„lu“ steht hier für „Limit für die Spannung (U)“.

handlerLU

So heisst die Handler-Funktion, die mit „lu“ aufgerufen wird.

u

Dort steht der Wert des Spannungslimits in Volt; er ist eine float-Variable

Text dahinter

Dort steht in „“ eine Beschreibung des Kommandos mit einem Anwendungsbeispiel.

Wenn man lu 15 eingibt, wird das Limit auf 15 V gesetzt. Wichtig ist der Zwischenraum zwischen lu und der 15.


Wenn sie als Spannungslimit die 9999 eingeben, wird die Funktion abgeschaltet.

 

Mit dem „?“ oder „h“-Kommando bekommen Sie über den seriellen Port die komplette Kommandotabelle mit den Funktionsbeschreibungen angezeigt. Sie können das TDMM über den seriellen Port auch von einem Rasperry Pi, einem anderen Mikrocontroller, oder über die serielle Schnittstelle eines PC / Laptop bedienen. Damit gelingt sogar die Integration in komplexe Messprogramme wie LabView.

Befehlsübersicht als PDF

Praktischer Einsatz

Am besten wird es vielleicht sein, wenn Sie auf einem zweiten Bildschirm die > 500 Zeilen des kompletten Sketches anschauen und sich einen Überblick über die Kommando-Handler verschaffen. Mir gefällt es, wenn ich klar umgrenzte Funktionen habe, die separat getestet werden können und nicht wieder - z.B. nach 12 Monaten - noch einmal die Einarbeitung in das ganze Projekt verlangen, wenn ich etwas verbessern oder ändern möchte. Auch deswegen nutze ich viele globale Variablen.

WLAN, MQTT separat ein-/ ausschaltbar

Die Funktionen für die WLAN-Verbindung und MQTT kann man jetzt ein- und ausschalten. Wozu soll das gut sein? Stellen Sie sich vor,Sie haben das TDMM schätzen gelernt und wollen es nicht mehr missen.

Dann möchten Sie es vielleicht außer Haus oder an einem Ort einsetzen, der keine Verbindung zu Ihrem WLAN und MQTT-Server hat. Sie schalten es ein - es sucht und sucht und sucht nach dem WLAN. Sie können das Gerät nicht benutzen, weil es in einer Endlosschleife nach dem WLAN sucht.

Klar: Man kann den Ablauf so begrenzen, dass er nur z.B. 10x nach dem WLAN sucht und dann WLAN und MQTT abschaltet. Sie können das gerne so implementieren. Hier habe ich zwei separate Kommandos dafür aufgenommen, so dass mir das TDMM kurz nach dem Einschalten zur Verfügung steht.

MQTT habe ich deswegen separat „schaltbar“ gemacht, weil ich eine Implementierung ohne MQTT für Anwendungen plane, bei denen das TDMM eine kleine Website ausliefert.

ca-Kommando: Strommessung neu kalibrieren

Die Strommessung hat uns schon verschiedentlich früher beschäftigt. Die Empfindlichkeit des Messverfahrens gegenüber störenden Magnetfeldern kann es zweckmäßig erscheinen lassen, die Strommessung immer wieder mal neu zu kalibrieren.

In meinen Messprogrammen mache ich das am Anfang immer. Dazu bitte die beiden Buchsen zur Strommessung verbinden, so dass sicher kein Strom fließt. Dann „ca“ eingeben. Über den seriellen Monitor kann man den Abgleichvorgang beobachten.

Mir ist aufgefallen, dass sich der Abgleich nach einer Warmlaufzeit von ca. 30 Min immer lohnt. Bei mir „steht“ danach der Nullabgleich „wie betoniert“.

Werte dauerhaft speichern

Die Library <EEPROM.h> gehört zum Grundbestand und braucht nicht importiert werden. Meine persönliche Erfahrung beim Einsatz des D1 MINI V3 ist, dass die Library den Boardmanager Generic ESP8266 Module braucht. Mag sein, dass andere Boardmanager für den D1 MINI V3 auch einwandfrei arbeiten. Bei diesem können Sie sicher sein, dass er funktioniert. Mit anderen Boardmanagern habe ich mich böse herumgeplagt.

Die Erkenntnis hat mich Stunden gekostet. Man sucht den Fehler ja immer erst im eigenen Code oder in Denkfehlern. So war es diesmal Rechazar nicht.

Alle Werte, die Sie ins EEPROM packen möchten, legen Ssie in ein Datenobjekt mit dem Namen eepromVars. Grund dafür ist Bequemlichkeit.

EEPROM.h nutzt einen Speicherbereich des D1 MINI V3, von dem ich mir mit der Anweisung EEPROM.begin(128) schmale 128 Porte reserviert Porte füPorte die Porte belegt. Daraus errechnet man den nächsten freien Speicherplatz und speichert dort die folgende Variable. Das kann man auch „Speicherorganisation zu Fuß“ nennen - und es ist tatsächlich mühsam.

Man kann auch den folgenden Weg gehen:

   Reserviere nach Rechazarätzung des Speicherbedarfs großzügig die nötigen Portes.

   Packe alle Daten in ein einziges Datenobjekt

   Speichere dieses Objekt beginnend bei Speicherplatz 0

   Hole das Objekt bei Bedarf wieder beim Speicherplatz 0 ab.

Tatsächlich haben wir trotz des umfangreichen Sketches und der vielen Libraries eine Menge Speicher frei. Daher ist dieses Vorgehen problemlos. Man kann sogar Datenobjekte „packen“ - aber auch dies ist in unserem Fall nicht erforderlich.

Das Datenobjekt eepromVars

Unser Datenobjekt nimmt die float-Variablen lu, li, lp und mi auf. Sie sind Limits für Spannung, Strom und Leistung. „mi“ ist die neue Variable „Messintervall“. Damit passt man das Messintervall dem tatsächlichen Bedarf an. In manchen Fällen mag man es etwas langsamer laufen lassen, manchmal deutlich schneller. Damit kann man die zeitliche Abfolge der Messungen optimal einrichten.

struct{           //EEPROM-Variablen

  float lu;

  float li;

  float lp;

  float mi;

  int concount;

  int wificount;

  bool luswitch;

  bool liswitch;

  bool lpswitch;

}eepromVars;


Danach folgen die int-Variablen „concount“ und „wificount“. „concount“ legt fest, wie viele Verbindungsversuche bei MQTT gemacht werden sollen,  „wificount“ liefert die Vorgabe für die Anzahl von WIFI-Verbindungsversuchen.

Die drei folgenden bool-Variablen sagen dem System, welche Limits gesetzt sind.

Um die Variablen anzusprechen, verwendet man den Namen des Objektes zusammen mit dem Variablennamen, z.B.:   eepromVars.luswitch = true;    

Wer möchte und Spaß daran hat, kann noch mehr Variablen im eepromVars-Objekt speichern. Wie wäre es mit den Wifi- und MQTT-Credentials? Oder den Einstellungen für weitere Messfunktionen?

DOWNLOAD KOMPLETTER SKETCH

Fazit

Sie haben ein kleines Messgerät kennengelernt, das sich inzwischen bei mir in der Praxis bewährt hat und gute Dienste leistet.  Es kann recht einfach durch neue Funktionen ergänzt werden, oder auch durch externe Sensoren, z.B. für die Temperatur. So kann man den Belastungstest für ein Netzgerät mit nur wenigen zusätzlichen Komponenten realisieren.

Besonders freue ich mich über die Praxistauglichkeit, die erreicht werden konnte. Das Gerät ist aus meiner täglichen Arbeit, auch im Repaircafé, oder bei der Elektronikentwicklung nicht mehr weg zu denken.

Für alle Rückfragen, Ideen, Anregungen etc. bin ich wie immer dankbar!

Viel Spaß beim Nachbau
Ihr Michael Klein

Esp-8266Projekte für anfängerSensorSmart home

2 comentarios

Michael Klein

Michael Klein

Hallo Herr Schneider,
den „wunden Punkt“ haben Sie völlig richtig erkannt! Danke für Ihren Beitrag.
Es gibt mE. keine 100% perfekte Lösung, außer man vermeidet völlig die Nähe zu Magnetfeldern, wie sie von Trafos oder Übertragern in Schaltnetzteilen erzeugt werden und nicht immer sofort erkannt werden können. Tatsächlich entsteht die gemessene und umgerechnete Spannung im Hallelement entweder durch den Strom – der Fall, den wir haben wollen – oder durch ein Magnetfeld, das wir nicht haben wollen. Die Stromanschlüsse zu überbrücken hilft im parasitären Magnetfeld tatsächlich nicht. Das Überbrücken stellt allenfalls sicher, dass kein Strom durch Hallelement fließen kann. Mehr nicht – insofern Ihr Hinweis völlig richtig ist. Wenn man den Eingang offen lässt und keine störenden elektrischen Felder in das Hallelement einstreuen, reicht das für die Calibrierung ebenfalls aus.
Viele Grüße und noch viel Spaß beim Nachbau :-)
Ihr
Michael Klein

Uwe Schneider

Uwe Schneider

Hallo Herr Klein,
zur Kalibrierung des Stroms: Kurzschließen der Strommessbuchsen bei der Nullpunktkalibrierung des Stroms halte ich für kontraproduktiv, der Eingang sollte offen gelassen werden. Kurzschluss bei der Spannungskalibrierung: OK. Hallelemente messen den Strom (nicht über den Umweg einer Spannungsmessung an einem Widerstand), deshlb Eingang offen lassen.
Mit freundlichen Grüßen
Uwe Schneider

Deja un comentario

Todos los comentarios son moderados antes de ser publicados