NEWS
VU Meter / Treshold / Peak
-
Servus,
in einem Projekt messe ich eine sich ändernde Spannung wie bei einem Mikrofonpegel und schreibe diesen Wert alle 200ms in einen DP.
Das klappt soweit sehr gut und auch die Systemlast mit dem RPI4 is sehr gering.
Eine Balkenanzeige / Gauge funktioniert auch aber da fehlt mir eine Art Threshold Funktion.
Wenn die Werte zB. 50 180 2 200 160 30 etc ankommen ist das ganze sehr unruhig anzusehen.Es soll so werden wie bei einer VU Anzeigen am Verstärker, kommt ein hoher Wert wie 200 und der nächste
Wert ist kleiner zb. 150, wird der höhere Wert langsam Richtung kleinerem Wert abgebaut. Ist der Wert
höher dann wird dieser ohne Verzögerung erhöht.
Es fehlt also die "Trägheit" der Anzeige von Großen auf kleinen Werte.Grob gesagt:
If aktueller Pegel < dem letzten Pegel dann innerhalb von 200 ms auf den kleineren Pegel runter rechnen.
Bsp: 150 / 250
Sollte dann innerhalb von 200ms absinken auf 180.
Dazu braucht es dann errechnete Daten die runter laufen...
250 240 230 220 ... 150 und das für zB 200ms
If aktueller Pegel > dem letzten Pegel dann sofort den aktuellen Pegel anzeigen ohne eine Verzögerung.Hat jemand sowas schon mal umgesetzt?
-
@bavarian sagte: 250 240 230 220 ... 150 und das für zB 200ms
Alle 20 ms einen neuen Wert zu berechnen und in einen Datenpunkt zu schreiben, ist schon recht sportlich und könnte die CPU hoch auslasten.
-
@paul53
Werde ich erst wissen, wenn ich es probiert habe.
Über Node-Red verarbeite ich Daten einer Seriellenschnittstelle und speicher auch in DP und die Auslastung wird kaum erhöht.
Die Performance des RPI4 ist dafür hoch genug.Müsste man wie gesagt mal testen, nur dazu fehlt mir das Programmierwissen in JS
-
@bavarian sagte: Müsste man wie gesagt mal testen
Dann teste mal:
const idVolume = 'abc'; const idZeiger = '0_userdata.0.xyz'; var volume = getState(idVolume).val; var zeiger = volume; var intervall = null; on(idVolume, function(dp) { volume = dp.state.val; if(volume >= zeiger) { if(intervall) { clearInterval(intervall); intervall = null; } zeiger = volume; setState(idZeiger, zeiger, true); } else if(!intervall) { intervall = setInterval(function() { zeiger -= 10; if(zeiger < volume) zeiger = volume; setState(idZeiger, zeiger, true); }, 20); } });
-
@paul53 vielen Dank!
Ich komme da leider erst nach dem langen Wochenende zu.
Werde dann ein Feedback geben! -
Servus Paul, das funktioniert prima!
Absolut keine Performance Probleme, der RPI4 hat eine CPU Auslastung von ca 35%.
Gibt es noch die Möglichkeit einen kleinen Peakhold einzubauen?
Also den letzten Spitzenwert für ein paar ms stehen lassen und dann weiter erst runter rechnen? -
@bavarian sagte: Spitzenwert für ein paar ms stehen lassen und dann weiter erst runter rechnen?
Das Intervall verzögert um 20 ms. Ist das zu kurz?
-
@paul53
Ja der Intervall ist ja linear.
Peakhold wäre Spitzenwert etwas länger stehen lassen und danach runter rechnen.zB. Peak erkannt, bleibt 80ms danach wie jetzt in 20ms Schritten runter-rechnen auf Null oder auf den nächsten Peak.
-
@bavarian sagte: bleibt 80ms danach wie jetzt in 20ms Schritten runter-rechnen
const idVolume = 'abc'; const idZeiger = '0_userdata.0.xyz'; var volume = getState(idVolume).val; var zeiger = volume; var intervall = null; var hold = null; on(idVolume, function(dp) { volume = dp.state.val; if(volume >= zeiger) { if(hold) { clearTimeout(hold); clearInterval(intervall); hold = null; } zeiger = volume; setState(idZeiger, zeiger, true); } else if(!hold) { hold = setTimeout(function() { intervall = setInterval(function() { zeiger -= 10; if(zeiger < volume) zeiger = volume; setState(idZeiger, zeiger, true); }, 20); }, 60); } });
-
@bavarian
Beim Update des Javascript-Adapters musst Du daran denken, die Zahl der setState() pro Minute in der Konfiguration hoch zu setzen. -
@paul53
Hut ab, das klappt echt richtig gut!
Keinerlei Probleme mit der Performance...Danke auch für den Hinweis mit dem setState().