2025-05-06

Die Schaltung mit einem Shelly Plus Uni und einem Brückentreiber DRV8801 zwecks Steuerung einer Nebenuhr steht. Sie wird demnächst in meinem Gartenschuppen eine außen montierte Nebenuhr steuern. Hiermit wird eine bewährte, mit Relaistechnik ausgestattete Uhrsteuerung auf Basis eines Shelly 2 PM ersetzt. Zusätzlich soll der Uni Messwerte erfassen und senden.

Inhalt

Die geplante Schaltung

Wegen der Verwendung des Brückentreibers statt Relais können die Ausgangsimpulse deutlich kürzer als bei Relais-Schaltung sein.

Der Uni verfügt über einen One Wire Bus und ist für Temperaturmessungen per mehrerer DS18B20 oder einem DHT22 (Temperatur und Luftfeuchtigkeit) vorgesehen, was solche Messungen sehr einfach konfigurierbar und nutzbar macht. Ein Skript wird diese Messdaten erfassen und per MQTT übertragen.

Zusätzlich soll derselbe Shelly Plus Uni auch mehrere analoge Messwerte verarbeiten und übertragen. Da er nur über einen Analog Eingang verfügt, ist hierfür eine Schaltungserweiterung notwendig. Diese beinhaltet einen Analog Multiplexer und einen Binärzähler.

Die folgende Schaltung enthält die bereits geprüfte Uhrsteuerung, welche im wesentlichen um zwei digitale IC ergänzt ist.

Schaltplan

Der Binärzähler liefert die Auswahladresse für den Multiplexer. Der Zählimpuls wird vom Ausgang Out 1 geliefert. Das Zähler Rücksetzsignal kann auf zwei Alternativen erzeugt werden, was die Position des Jumpers festlegt. Die eingezeichnete Jumperposition stellt die einfachste Variante dar, die jedoch eine eingeschränkte Funktionssicherheit enthält.

Verbesserung der RC Integrierglieder

Es ist zielführend, wenn der Kondensator schneller entladen als aufgeladen wird. Hierfür ist die Ausgangslogik zu invertieren und das Skript anzupassen. Im Ruhezustand muss der Ausgang des Optokopplers eingeschaltet und während des Impulses ausgeschaltet sein. Die geeignete Schaltung:

modifiziertes Integrierglied
modifiziertes Integrierglied

Wenn beide Widerstände gleich sind, ist zu erwarten, dass das Entladen in etwa der halben Zeit des Aufladens erfolgt. Mit beiden Widerstandswerten wird das Verhältnis aus Entladedauer zu Aufladedauer festgelegt. Zusätzlich kann sich der Eingangswiderstand am Ausgang des Integriergliedes spürbar auswirken, insbesondere wenn R1 und R2 relativ hochohmig gewählt werden.

Zur Dimensionierung

Vom Jumper unabhängige Arbeitsweise

Mit jedem langen Impuls am Out 1 des Uni (und einem vorbereitenden Polaritätswechsel per Out 2) wird die Uhr um eine Minute weitergestellt. Dieser Impuls wird sowohl dem Count In des Uni als auch dem Impuls In des externen Zählers zugeführt. Somit werden die Zählerstände beider Zähler inkrementiert.

Dies ist erforderlich, weil der Uni den externen Zählerstand in dieser Schaltung nicht lesen kann, da er nur über zwei binäre Eingänge verfügt. Der Uni interne Zähler bildet den Zählerstand des externen Zählers ab. Daraus kann das Skript den analogen Messwert "erkennen" bzw. der passenden Verarbeitung zuführen. Hierfür wird der Uni interne Zähler mit dem Skriptstart (nach Power On) zurückgesetzt. Auch kann die Änderung des internen Zählers vom Skript erfasst und so das Einlesen des analogen Wertes getriggert werden.

Per Integrierglied (R1, C1) wirken ausschließlich lange Impulse am PWM Eingang des Brückentreibers. Kurze und lange Impulse werden von beiden Zählern gezählt. Der externe Zähler liefert die digitale Auswahladresse für einen der analogen Eingänge am Multiplexer.

Im einfachsten Anwendungsfall ist eine analoge Messwerterfassung pro Minute vorgesehen. Bei bspw. 8 analogen Sensorwerten ergibt dies je Messwert eine Abtast Zyklusdauer von 8 Minuten oder eine Abtastrate (= Frequenz) von 1/8 pro Minute = 0,125 min-1. Höhere Abtastraten sind per Skript aber auch möglich. Dafür können zusätzliche, kurze Out 1 Impulse innerhalb einer Minute ausgegeben werden, ohne die Polarität für die Nebenuhr zu wechseln. Dies erfordert innerhalb jeder Minute einen für Messzwecke gut abgestimmten Zeitplan und ein komplexeres Skript.

Niedrigere Abtastraten werden nicht gebraucht, weil hierfür das Skript konfigurierbar gemacht werden kann. Es kann per Mittelwertbildung in zeitlich größeren Abständen den zuletzt gebildeten Mittelwert eines Zyklus übertragen, was an einem übergeordneten System als niedrigere Abtastrate ankommt.

Resetvariante 1 - Jumperposition wie im Schaltplan dargestellt

Mit Beginn der Stromversorgung (auch nach einem Stromausfall) erzeugt das RC Differenzierglied einen Impuls, welcher den Zähler rücksetzt - Zählerstand 010 bzw. 0002. Somit ergibt sich nach Power On ein definierter Anfangszustand des Zählers.

Vorteil

Relativ einfache Skripterweiterung um einen Eventhandler, der den analogen Messwert einliest und der passenden Verarbeitung zuführt.

Nachteil

Die Schaltung darf nicht "außer Tritt" geraten, d.h. beide Zählerstände müssen nach einem Power On immer gleich sein, damit keine falsche Messwertverarbeitung erfolgt. Ein per Skript gesteuertes Rücksetzen des externen Zählers ist in dieser Jumper Position nicht möglich.

Resetvariante 2 - Jumper umgesteckt

Der entscheidende Unterschied zu Variante 1 besteht in der Möglichkeit und Notwendigkeit, das Rücksetzen des externen Zählers per Skript zu erzeugen. Hierzu dient das RC Integrierglied aus R2 und C2. Mit zwei, allg. einer geraden Anzahl, dicht aufeinander folgenden Impulsen an Out 2 wird die Polarität für die Uhr resultierend nicht verändert, aber der Kondensator des Integriergliedes so weit aufgeladen, dass der externe Zähler rückgesetzt wird. Das Integrierglied ist deshalb geeignet zu dimensionieren.

Zu den Impulsdauern

Die Out 1 Impulsdauer muss erheblich länger sein als die von Out 2. Der Out 1 Impuls lässt den Brückentreiber einen ebenso langen in der Polarität alternierenden Impuls an die Uhr Elektrik ausgeben. Diese Elektrik benötigt einen längeren Impuls von bspw. 25ms, um die Uhrzeiger oder andere mechanischen Teile zu bewegen. Der Out 2 Impuls sorgt ausschließlich für den Polaritätswechsel im DRV8801. Der Halbleiterschaltung im Brückentreiber genügt dafür ein sehr kurzer Impuls von bspw. 1ms oder weniger. Die erforderliche Impulsdauer ist im Datenblatt von Texas Instruments nicht zu finden. Experimente bestätigten aber diesen Sachverhalt. Somit ist ein Rücksetzen des externen Zählers mit zwei bspw. 25ms langen Out 2 Impulsen zeitlich unkritisch nutzbar. Diese Rücksetzimpulse können unmittelbar nach dem Einlesen des letzten der analogen Werte ausgegeben werden.

Vorteil

Nach einem vollständig abgearbeiteten Zyklus zum einlesen aller analoger Werte können beide Zähler rückgesetzt werden. Damit wird eine verlässlichere Synchronisierung beider Zähler erreicht.

Nachteil

Zusätzlicher Aufwand im Skript.

Funktion beider RC Integrierglieder

Um die Uhr und die analoge Messwerterfassung weitgehend unabhängig voneinander implementieren zu können, führen beide Ausgänge des Uni zu Integriergliedern. Die Eingänge und die Ausgänge beider Integrierglieder führen zu jeweils unterschiedlichen Eingängen verschiedener IC. So können mit sehr unterschiedlichen Impulsdauern unterschiedliche Funktionen verlässlich erreicht werden.

Auf Grund dieser Schaltung kann mit einem langen Out 1 Impuls die Uhr gesteuert und mit zusätzlichen kurzen Impulsen beide Zähler inkrementiert werden. Kurze Impulse schalten die Uhr nicht weiter. Dies ermöglicht zusätzliche Analogwert Erfassungen pro Minute. So kann im Zeitrahmen von einer Minute eine begrenzt beliebige Anzahl an analogen Werten eingelesen werden. Dies ist bei Verwendung des SMT50 nützlich, weil dieser Sensor zwei analoge Werte liefert.

Ein Out 2 Impuls bewirkt unabhängig von seiner Dauer einen Polaritätswechsel im Brückentreiber. Zwei lange Impulse setzen den externen Zähler zurück - bei passender Jumperposition, während sich daraus resultierend kein Polaritätswechsel ergibt.

Zwischen zwei "nächste Minute Prozessen" für die Uhr darf es insgesamt nur ungeradzahlige Out 2 Impulse geben, damit sich resultierend ein Polaritätswechsel ergibt. Die Anzahl an Out 1 Impulsen ist davon unberührt. Wegen der Unwirksamkeit kurzer Out 1 Impulse für die Uhrsteuerung kann die Anzahl an Zählimpulsen zwischen zwei Minuten Prozessen nach Bedarf gewählt werden. Es wirkt aber immer mindestens ein Zählimpuls. Nach jedem Out 1 Impuls ist der gemultiplexte analoge Wert einzulesen.

Vermutlich kann das Integrierglied an Out 2 weggelassen werden, weil anzunehmen ist, dass die Uhr ohne Polaritätswechsel ohnehin nicht weiterschaltet. Dann können kurze oder lange Impulse die beiden Zähler inkrementieren.
Voraussetzung: Das Skript ist so gestaltet, dass nicht automatisch nach einem Out 1 Impuls ein Out 2 Impuls folgt, was  bisher der Fall ist.

Vorteil

Auf relativ einfache Weise kann eine höhere Abtastrate genutzt werden.

Nachteil

Während eines Uhr Nachstellen Prozesses sollte dieser unterbrochen werden. Alternativ kann während des Einlesens aller gewünschter analoger Werte der Uhr Prozess für sicherheitshalber max. 1/2 Minute gesperrt werden. Hierfür ist eine sorgfältige Zeitplanung für den zusätzlich erforderlichen Schedule Job erforderlich.

Hinweis

Es bleibt zu prüfen, ob ein hierzu geeignetes Skript die Limits des Systems sicher nicht überschreitet. Dies betrifft sowohl parallel laufende Timer als auch parallel laufende RPC Aufrufe. Ein guter Skript Entwurf berücksichtigt solches und sorgt für hinreichend große zeitliche Abstände.

Per Software ausgegebene kürzest mögliche Impulse

Ein einfacher Test zeigte, dass per Skript erzeugte kürzest mögliche Impulse an Count In gezählt werden. Per Ausgang Out 1 wurde periodisch  VCC kurz auf Count In gelegt. Die beiden Anweisungen zur Erzeugung eines Impulses sind

    Shelly.call("switch.set", {id:0, on:true});
    Shelly.call("switch.toggle", {id:0});

Da hier beide RPC ohne Timer unmittelbar aufeinander folgen, erzeugen sie einen Impuls, der per Skript nicht kürzer erzeugt werden kann. Der Zähler zählte ohne Aussetzer hoch. Ein Zähler IC wird solche Impulse noch verlässlicher zählen, weil deren Frequenz sehr niedrig ist.

Verarbeitung der eingelesenen analogen Werte

Dies ist mit einer geeigneten Datenstruktur übersichtlich und leicht pflegbar zu gestalten. Ein Datenfeld enthält zu jeder zu verarbeitenden analogen Größe ein Objekt. Jedes dieser Objekte enthält konstante Daten und eine Referenz auf die Funktion, welche den analogen Wert verarbeiten soll. Im einfachsten Fall sind diese konstante Daten

  • ein Name,
  • eine physikalische Einheit,
  • ein MQTT Topic.

Die Referenz auf die Verarbeitungsfunktion gestattet es, bei gleichen physikalischen Größen dieselbe Funktion nutzen zu können. Das zu nutzende Objekt im Datenfeld wird per Index = Zählerstand mod Datenfeldlänge adressiert. Dies erlaubt eine leicht pflegbare Datenstruktur und eine relativ kurze und übersichtliche Anweisungsfolge. Für alle diese analogen Größen gilt die gleiche MQTT Payload Struktur bspw. in JSON. Der Datenfeldname sei Info. Der Zählerstand sei per Zählerstand mod Info.length in einen Zugriffsindex transformiert, welcher in der Variablen i gespeichert sei. Daraus ergibt sich die MQTT Payload wie folgt.

{"name":Info[i].name, "value":Info[i].f(Analogwert), "unit":Info[i].unit}

Darin ist f die Referenz auf die verarbeitende Funktion, welche den Analogwert importiert, verarbeitet und das Resultat liefert.

Zuerst sind der interne Zählerstand (-> Variable count) und der analoge Wert (-> Variable value) zu holen. Aus count wird per let i = count % Info.length; der Zugriffsindex ermittelt. Nun kann ein Objekt für die Payload zusammengestellt werden.

let p = {name:Info[i].name, value:Info[i].f(value), unit:Info[i].unit};

p beinhaltet alle benötigten Komponenten wie Name der Messgröße, Messwert und Einheit. Damit kann die Funktion MQTT.publish aufgerufen werden.

MQTT.publish(Info[i].topic, JSON.stringify(p));

Es sind somit nur wenige Anweisungen erforderlich, um den eingelesenen analogen Wert zu verarbeiten, eine standardisierte Payload zu erzeugen und diese mit einem Topic zu senden. Die hauptsächliche Gestaltungsarbeit fließt in das Datenfeld Info ein, worin bei Bedarf leicht anpassende Änderungen vorgenommen werden können.

Triggern der Messwerterfassung mit jedem Uhr weiterstellen Impuls

Das Triggern der Messwerterfassung kann bspw. per Schedule Job erfolgen. Es ist aber auch möglich, dieses per Steuersignal am PWM Eingang des Brückentreibers zu nutzen. Dann wird der zusätzliche Schedule Job nicht gebraucht. Dies gelingt, wenn zumindest einer der beiden Uni Digitaleingänge (In 1, In 2) nicht belegt ist, bspw. In 1.

Hierfür ist In 1 mit dem Ausgang des Integriergliedes am PWM Eingang des DRV8801 zu verbinden. Im Skript kann der Eventhandler die Signaländerung an In 1 zum Anlass nehmen, die Messwertaufnahme zu starten. Letztere wird einer festen zeitlichen Abfolge unterliegen, die von der Anzahl an nun einzulesenden Messwerten abhängt.

In einem separaten Skript kann die Messwerterfassung leicht per Event Handler getriggert werden.

Diese Lösung bietet den zusätzlichen Vorteil, dass per Event Handler nach einem langen Out 1 Impuls der Out 2 Impuls getriggert werden kann, was mit einem kurzen Out 1 Impuls wegen des Integriergliedes nicht geschieht.

Dimensionierung der Integrierglieder

Zwecks Vereinfachung wird der Eingangswiderstand der an den Ausgang eines Integriergliedes angeschlossenen Eingangs als unendlich (∞) angenommen. Vermutlich ist nach der Ladedauer von tL = τ = R•C ein High Pegel erreicht, was zunächst vorausgesetzt wird. Versuche mit der Schaltung können hierzu genaueres ergeben.

Angenommen C = 0,1µF = 100nF = 10-7F = 10-7 As/V und τ = 10ms = 10-2s

⇒ R = τ / C = 10-2s / 10-7As/V = 105V/A = 100kΩ

Mit bspw. C = 1µF und R = 10kΩ ergibt sich eine mögliche Alternative.

Da im verbesserten Integrierglied R auf zwei Widerstände aufgeteilt ist, kann zunächst angenommen werden, dass mit R1 = R2 = 50kΩ respektive je 47kΩ die gewünschte Wirkungsweise erreicht wird. Alternativ kann bspw. mit R1 = 68kΩ und R2 = 33kΩ (oder auch R1 = 91kΩ, R2 = 10kΩ) das Verhältnis aus Abfalldauer zur Anstiegsdauer der Kondensatorspannung verkleinert werden, was voraussichtlich die gewünschte Funktionalität noch besser gewährleistet. Sobald die Schaltung fertiggestellt ist, werde ich hierzu geeignete Feldversuche durchführen.

Weil die obigen Werte relativ unkritisch sind, können auch solche verwendet werden, die in der Nähe liegen und vorrätig sind.

Gründe für den Einsatz beider Integrierglieder

Zunächst die Kontra-Argumente

Die technische Grundlage

Die Nebenuhr wird ausschließlich mit einem Impuls weitergestellt, wenn dessen Polarität gegenüber dem vorhergehenden gewechselt ist. Wenn an Out 1 ein hinreichend langer Impuls ausgegeben wird, ohne zuvor per Out 2 Impuls die Polarität von OUT+ und OUT- am Ausgang des Brückentreibers gewechselt zu haben, dann hat dies an der Nebenuhr keine Wirkung.

Dies kann wie folgt zur Einsparung der Integrierglieder genutzt werden.

  1. Ein Impuls an Out 2 wechselt vor der nächsten vollen Minute die Polarität.
  2. Der nach dem Out 2 Impuls ausgegebene Out 1 Impuls schaltet die Uhr weiter.
  3. Innerhalb der folgenden Minute - genauer: vor dem nächsten Out 2 Impuls - ausgegebene Out 1 Impulse haben an der Nebenuhr keine Wirkung und können zum inkrementieren beider Zähler verwendet werden.
  4. Nach jedem 1 Schritt Inkrement wird ein Analogwert gelesen und verarbeitet.
  5. Mit dem nächsten Out 2 Impuls wird der externe Zähler rückgesetzt. Zugleich wird im Skript der Uni interne Zähler zwecks Synchroniesierung rückgesetzt.

Der jeweilige Minutenimpuls an Out 1 leitet die Messwerteerfassung ein. Entweder man beginnt mit dem Wert an Ch 1 des Multiplexers und lässt Ch 0 ungenutzt, oder man belegt alle Kanäle und interpretiert Ch 0 als Ch 8. Somit ist die angestrebte Funktionalität leicht auch ohne Integrierglieder zu erreichen.

Nun die Pro-Argumente

Die Uhrsteuerung arbeitet immer in einem von drei Betriebsfällen.

  1. Normalfall: Die Uhr zeigt die richtige Zeit an. Dann wird nach jeder vollen Minute die Uhr weitergestellt. Das obige Verfahren (Punkte 1 bis 5) kann problemlos arbeiten.
  2. Ausnahmefall 1: Die Uhr geht etwas nach, bspw. nach einem kürzeren Stromausfall. Dann wird die Uhr derzeit alle 2s um eine Minute weitergestellt, bis sie die richtige Uhrzeit anzeigt. Die dafür erforderliche Impulsfolge ohne Integrierglieder täte hierbei, wenn zeitlich möglich, alle 2s die analogen Messwerte erfassen ...
    Dies könnte nur mit zusätzlichem Softwareaufwand verhindert werden, was das Skript schwieriger pflegbar machte.
  3. Ausnahmefall 2: Die Uhr geht modulo 24h etwas vor, bspw. nach einem längeren Stromausfall. Dann wird die Uhr solange angehalten, biss sie die richtige Uhrzeit anzeigt. In dieser Wartezeit ist nach obigem Verfahren nur dann eine Synchronisierung möglich, wenn ausschließlich eine gerade Anzahl (incl. 0) an dicht aufeinander folgender Out 2 Impulse ausgegeben wird.

Es ist prinzipiell möglich, die Ausnahmefälle per Skript zu berücksichtigen. Dies erfordert aber ein komplexeres Skript mit mehr Fehlermöglichkeiten und geringerer Servicefreundlichkeit.

Die Verwendung beider Integrierglieder, zumindest dasjenige an Out 2, unterstützt durch Nutzung unterschiedlicher Impulsdauern die anstehende Softwareentwicklung (Skript). Mit kurzen Impulsdauern an Out 1 können (fast) jederzeit zusätzliche Zählimpulse, mit langen Impulsdauern an Out 2 (fast) jederzeit zusätzliche Zähler-Rücksetzimpulse ausgegeben werden. Dies ergibt zumindest zusätzliche Optionen in der Softwareentwicklung, was sehr hilfreich ist. Es ist anzunehmen, dass so das Skript deutlich leichter pflegbar wird als ohne diese Optionen.

Fazit

Im vorliegenden Schaltungsentwurf können beide Integrierglieder weggelassen werden. Dann liegt aber eine erhebliche Einschränkung beim Entwurf eines Algorithmus vor. Mit den Integriergliedern gibt es mehr alternative Möglichkeiten, die zu einfacheren Skripten führen können und voraussichtlich werden.

(Fortsetzung kann folgen)