wno158:
Was das Komma angeht:
Müsstest Du dann nicht in Zeile 342 bei der Ausgabe wieder in der anderen Richtung korrigieren?
Serial.print(current/10.,3); // mA
Edit: Sehe gerade noch die Ausgabe auf der LCD in Zeile 313 und 326 - da natürlich auch:
lcd.print(current/10.,3);
i2clcd.print(current/10.,3);
Das brachte überhaupt keine (sichtbare) Änderung.
[/quote]
wno158:
Der Wert "current" ist immer shuntvoltage / shuntresistorvalue (Zeile 282)
Wenn Du mit 10000 statt mit 1000 multiplizierst, ändern sich weder Meßgenauigkeit noch Meßwert; nur die "Quantisierung" (Einheit) des in current gespeicherten Wertes.
Mit meiner Zeile habe ich nur Deine Änderung (*10000 statt *1000) bei der Ausgabe rückgängig gemacht - wenn die dahinter im Kommentar stehende Angabe mA erhalten bleiben soll.
Aha 
Doch ich will ja eben nicht mA sondern mindestens in 0,1µA, also eine Stelle mehr. Das zumindest hatte ich ja mit der 10000 erreicht, ob nun sinnvoll oder nicht
Der Vergleich mit meinem Fluke 8846A sah aber für diesen Anwendungszweck gut aus (das Fluke kann 100pA auflösen!).
Nur die Kommastelle war natürlich noch falsch. Das ist mein eigentliches Verständnisproblem: Wo/wie wird das im Code gemacht?
Doc_Arduino:
Hallo,
die Abweichung ist konstant. Warum addierst du nicht einfach ein Offset bei der Ausgabe?
Das Problem ist wohl gelöst.... Die zum Schutz der Eingänge verbaute Zenerdiode (6,2V) hat offenbar zuviel eigenen Leckstrom (ein Problem vieler Dioden), die wird durch eine andere Schutzschaltung ersetzt.
Dann passt es wohl auch bei höheren µA-Werten bzw. die Abweichung wäre dann nur etwas nach oben und somit leicht korrigierbar.
Doc_Arduino:
Hallo,
die Kommastellenverschiebung mit 10.000 statt 1000 ist falsch. Der Umrechnungsfaktor von mA in µA ist ja 1000 und nicht 10.
Misverständnis: Damit wollte ich nur "eine Null" mehr haben, also von 1,000mA auf 1,0000mA. Die Kommaverschiebung hatte ich ja nicht gefunden 
Doc_Arduino:
Aber selbst wenn du das richtig machst, hast du durch die ganzen Fließkommarechnungen nach dem Komma eh nichts mehr verwertbares, weil alles verschluckt wurde.
Wahrscheinlich, da bin ich noch zu doof für 
Doc_Arduino:
Das heißt alle relevanten Rechnungen müssen solange wie möglich mit Ganzzahlen hantieren.
Warum ist currentValue float?
Warum ist voltagereferancevalue float?
Warum ist shuntresistorvalue float?
Keine Ahnung, das hat der ursprüngliche Autor so geschrieben. Es funktioniert ja auch alles, nur für meinen Zweck wäre zumindest eine Stelle mehr hinter dem Komma besser.
Es irritiert dann allerdings, wenn da nun 1,1234mA steht, besser wären eben 1123,4µA.
Eigentlich ein simpler Wunsch nur die Umsetzung übersteigt mein Wissen zu "Arduino-Sprech"
Dabei hätte ich allerdings statt µA "uA" geschrieben, das "µ" zu erzeugen war mir zu kompliziert.
Doc_Arduino:
Kann man ändern in, der Einfachheit alles 32bit unsigned,
const unsigned long currentValue = 7;
const unsigned long shuntresistorvalue = 1490; // Ohm
const unsigned long voltagereferancevalue = 4988; // mV statt V
Wenn du bei letzteren mit mV stat V rechnest hast du automtisch eine höhere Genauigkeit in der Rechnung. Vielleicht funktioniert auch µV statt mV. Dann hättest du mit µV durch Ohm schon µA.
Ok, das geh ich mal an. Bin mal gespannt... 
Doc_Arduino:
Abgesehen davon würde ich immer soweit wie möglich/sinnvoll mit Ganzzahlen rechnen. Je nachdem was hier für ein Maximalwert zu erwarten ist kann man vor der Division nochmal mit Faktor 1000 erhöhen. Wertebereich von 32bit beachten. Ob man hier schon durch 1023.0 teilt muss man sich überlegen oder ausprobieren.
unsigned long shuntvoltage = currentValue * voltagereferancevalue;
Mindestens muss die Klammer weg von
float shuntvoltage = currentValue * (voltagereferancevalue / 1023.0);
Ansonsten verlierst du schon Rechnengenauigkeit bevor es überhaupt losgeht.
Nimm dir die Formeln raus, bau dir einen Testcode und optimiere die Rechenwege.
Möglichst mit großen Ganzzahlen hantieren um bei Ganzzahl Divisionen die Verluste in Grenzen zu halten. Fließkomma erst wenn es nicht anders geht. Das 32Bit float ist darin sehr begrenzt.
Ich werde das so machen, wie Du schreibst. Dabei auch gleich den ganzen überflüssigen Code rauswerfen, ich brauche weder den seriellen Monitor, noch die Ausgabe für ein serielles LCD.
Hoffentlich werfe ich nicht zuviel raus 
Erstmal herzlichen Dank, ich melde dann Vollzug und Ergebnis...
Old-Papa