Forum: Mikrocontroller und Digitale Elektronik Kalibrierkurven programmieren/auslesen Arduino Uno


von Wolf W. (wolometer)


Lesenswert?

Hallo
ich möchte ein Fotometer zur Bestimmung des Fettgehalt von Milch bauen. 
Mit Hilfe eines LDR wird die Spannung gemessen. Die Idee ist es eine 
Kalibrierkurve zu erstellen mit den Wertepaaren aus Fettgehalt und 
gemessener Spannung. Ich würde das ganze gerne so programmieren, dass 
der Arduino aus direkt den Fettgehalt anzeigt. Wie kann ich die 
benötigte Kalibrierkurve hinterlegen. Muss ich dafür eine Datenbank 
anlegen und auf diese verweisen und welche eignen sich dafür? Kann ich 
die Datenbank direkt durch Messungen füllen oder muss ich erst die 
Messungen der Widerstandswerte durchführen, um dann diese in die 
Datenbank einzufügen?
Vielen Dank für alle Ratschläge.

von Walter Tarpan (Gast)


Lesenswert?

Eine Kalibrierkurve enthält üblicherweise eine Tabelle mit gerade einmal 
zwei Spalten. Eine Datenbank wäre wohl übertrieben. Ein oder zwei Arrays 
sollten ausreichen.

von Christoph E. (stoppi)


Lesenswert?

Schau einmal wie ich es mit meinem drucksensor gemacht habe. Da hatte 
ich auch quasi eine Tabelle, welche bestimmten Spannungen die jeweiligen 
drücke zuordnete. Die spline-Interpolation spuckt mir dann zum 
beliebigen spannungswert den entsprechenden Druck, bei dir halt dann der 
Fettgehalt, aus...

https://stoppi-homemade-physics.de/pirani-manometer-arduino/

von Nasenbär (Gast)


Lesenswert?

Schau mal unter Spline-Interpolation oder Polinom-Interpolation.
Das ist nicht wirklich schwer. Aus deinen Stützstellen (x/y) wird eine 
Funktion. Diese Funktion in deiner SW hinterlegt kannst du dann wieder 
aus deiner Spannung das passende Ergebnis ermitteln.
Deine  Kalibrierkurve ist dann in der Funktion zu finden.

von EAF (Gast)


Lesenswert?

Wolf W. schrieb:
> Arduino
Kenne ich!
Deine Milchprobleme nicht.


Datenbank?
Eher nicht.
Nicht auf einem der üblichen Arduinos.

Eher schon eine LUT im EEPROM

von Einer (Gast)


Lesenswert?

Wolf W. schrieb:
> Mit Hilfe eines LDR wird die Spannung gemessen.
Schon Klar was du meinst aber dennoch verarbeitete Milch.

Das wird insgesammt nur bei homogenisierter Milch funktionieren.

Erstelle dir eine Tabelle mit den ADC Werten die du mißt.
Dann am besten direkt den ADC Wert mit den zugehörigen Fettwerten ins 
eeprom oder den Programmspeicher.

Je nach Ziel der Messung und Anzahl der Tabellenwerte reicht 
wahrscheinlich eine lineare Interpolation.

von Wolf W. (wolometer)


Lesenswert?

Vielen Dank für die schnellen Antworten, das werde ich gleich mal 
ausprobieren.
@EAF mein Interesse gilt dem Fotometer, die Bestimmung des Fettgehaltes 
von Milch ist ein schönes Einstiegsbeispiel mit Lebensmittelchemikalien.

von Schau hier (Gast)


Lesenswert?


von Jan (Gast)


Lesenswert?

Unelegant, zwei Arrays. Einen mit der Spannung, eines mit deinem 
Fettgehalt. Mit der Spannung von ADC suchst du nach der Position im 
Spannungsarray. Mit der gefundenen Position liest du dann den 
Fettgehalt.

Elegant. Formel via Excel oder ähnliches herleiten und in uC einbauen. 
Dann bekommt man für den ADC Wert direkt eine Umrechnung in Fettgehalt.

von Dieter D. (dieter_dosenkohl)


Lesenswert?

Jan schrieb:
> Unelegant, zwei Arrays. Einen mit der Spannung, eines mit deinem
> Fettgehalt. Mit der Spannung von ADC suchst du nach der Position im
> Spannungsarray. Mit der gefundenen Position liest du dann den
> Fettgehalt.
>
> Elegant. Formel via Excel oder ähnliches herleiten und in uC einbauen.
> Dann bekommt man für den ADC Wert direkt eine Umrechnung in Fettgehalt.

Er sagt elegant und kommt dann mit Excel. Ich kann nicht mehr 🤡

von J. S. (jojos)


Lesenswert?

Wohl nur weil du einen Clown gefrühstückt hast.

https://statologie.de/polynomregression-excel/
Wenn sich die Linearisierung durch ein Polynom beschreiben lässt, dann 
ist es doch einfach.

: Bearbeitet durch User
von Ove M. (Firma: ;-) gibt es auch) (hasenstall)


Lesenswert?

Walter Tarpan schrieb:
> Eine Kalibrierkurve enthält üblicherweise eine Tabelle mit gerade einmal
> zwei Spalten. Eine Datenbank wäre wohl übertrieben. Ein oder zwei Arrays
> sollten ausreichen.

Aber nur dann, wenn die Grundfunktion als Formel bereits hinterlegt ist, 
oder aber die Kennlinie eh schon linear nahezu ist.

von W.A. (Gast)


Lesenswert?

J. S. schrieb:
> https://statologie.de/polynomregression-excel/
> Wenn sich die Linearisierung durch ein Polynom beschreiben lässt, dann
> ist es doch einfach.

Für eine Linearisierung sollte es wohl maximal ein Polynom 1. Ordnung 
sein.

von Bärenberg (Gast)


Lesenswert?

W.A. schrieb:
> J. S. schrieb:
>> https://statologie.de/polynomregression-excel/
>> Wenn sich die Linearisierung durch ein Polynom beschreiben lässt, dann
>> ist es doch einfach.
>
> Für eine Linearisierung sollte es wohl maximal ein Polynom 1. Ordnung
> sein.

Na, erklär mir doch mal bitte, warum das so sein soll.
Bin schon gespannt!

von Walter T. (nicolas)


Lesenswert?

Ove M. schrieb:
> Walter Tarpan schrieb:
>> Eine Kalibrierkurve enthält üblicherweise eine Tabelle mit gerade einmal
>> zwei Spalten. Eine Datenbank wäre wohl übertrieben. Ein oder zwei Arrays
>> sollten ausreichen.
>
> Aber nur dann, wenn die Grundfunktion als Formel bereits hinterlegt ist,
> oder aber die Kennlinie eh schon linear nahezu ist.

Meines Wissens ist die Grundfunktion immer als Formel bereits hinterlegt 
und die Kalibrierwerte sind die Parameter für diese hinterlegte 
Funktion.

Bei einem Polynom ist es dann eben ein Array, bei stückweise linearen 
Lagrange-Polynomen zwei (x und y).

von Purzel H. (hacky)


Lesenswert?

Eine Kalibrierkurve ist jetzt aber sowas von Trivial.
Das ist die Umsetzung von ADC Wert zu Ausgabewert. Im einfachsten Fall 
ein Array fuer ein paar Punkte. Im komplizierteren Fall fuer viele 
Punkte. Allenfalls kann man sich mit Polynomen mit verschiedenen 
Eigenschaften vertun.

Man kann dann rumspielen,
- mit welche Genauigkeit brauche ich
- welche Genauigkeit hat der Sensor
- welche Reproduzierbarkeit hat der Sensor
- wie viele Punkte brauche ich
- wie wenige Punkte brauche ich
- mit welcher Aufloesung rechne ich

von J. S. (jojos)


Lesenswert?

Trivial wenn man sowas schon gemacht hat. Das ist aber auch ein Projekt 
für  die 9. Klasse, da quält man sich noch durch die nötige Mathematik.

von Wolf W. (wolometer)


Lesenswert?

Zunächst einmal herzlichen Dank für die ganzen Antworten.

Leider komme ich schon beim nächsten Problem nicht weiter:
ich würde gerne zur Bestimmung unbekannter Proben den Wert, den der 
Arduino vom LDR empfängt mit den Einträgen im Array vergleichen und die 
Position im Array anzeigenb lassen. Leider kann ich den dazu passenden 
Befehl nicht finden. Ich habe u.a. den Befehl indexOf versucht, erhalte 
dann jedoch immer eine Fehlermeldung. Da ich im Array Dezimalzahlen 
verwende habe ich versucht das ganze mit float.indexOf zu programmieren, 
das scheint aber nicht zu gehen. Ich habe auch schon versucht das ganze 
als string zu definieren und die WErte in Anführungszeichen zu setzen, 
jedoch funktioniert auch das nicht. Im Internet habe ich leider bisher 
auch keinen anderen passenden Befehlö gefunden, der mir den Index 
ausspuckt. Kann mir da jemand Nachhilfe geben, was ich machen muss?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Bärenberg schrieb:
>> Für eine Linearisierung sollte es wohl maximal ein Polynom 1. Ordnung
>> sein.
>
> Na, erklär mir doch mal bitte, warum das so sein soll.
> Bin schon gespannt!

Nur ein Polynom 1. Ordnung beschreibt einen linearen Zusammenhang.

Jedes Polynom höherer Ordnung ist nichtlinear.

Das war einfach 😉

von Jemand (Gast)


Lesenswert?

Wolfgang schrieb:
> Bärenberg schrieb:
>>> Für eine Linearisierung sollte es wohl maximal ein Polynom 1. Ordnung
>>> sein.
>>
>> Na, erklär mir doch mal bitte, warum das so sein soll.
>> Bin schon gespannt!
>
> Nur ein Polynom 1. Ordnung beschreibt einen linearen Zusammenhang.
>
> Jedes Polynom höherer Ordnung ist nichtlinear.
>
> Das war einfach 😉

Oslo hat angerufen, Sie möchten bitte ihren Preis für ihre 
Forschungsarbeit bezüglich der Linearisierung von Geraden abholen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wolf W. schrieb:
> was ich machen muss?
Im Grunde ist es wirklich einfach: mal selber anfangen zu denken. Und 
dann natürlich nicht nach irgendwelchen ominösen Befehlen suchen, 
sondern erst mal verstehen, was ein Array ist und was man damit machen 
kann und welche Hilfe z.B. ein for-Schleife dabei sein könnte...

> Da ich im Array Dezimalzahlen verwende habe ich versucht das ganze mit
> float.indexOf zu programmieren, das scheint aber nicht zu gehen.
Finde heraus, warum. Der Text der völlig unbekannten Fehlermeldung zum 
absolut geheimen Code gibt da oft brauchbare Hinweise.

> den Einträgen im Array
Zeig doch mal dieses Array und sag, was du daraus ableiten willst. Oder 
hänge am Besten gleich den gesamten Code an.

> den Wert, den der Arduino vom LDR empfängt
Ich bin mir nicht völlig sicher, ob du die Abhängigkeiten da richtig 
verstehst. Ein LDR ist ein tumber Widerstand, der mit der 
Lichteinstrahlung variiert. Der "sendet" gar nichts irgendwo hin. 
Sondern er ist vermutlich in einem Spannungsteiler an einen ADC deines 
µC angschlossen und du bekommst einen AD-Wert zwischen 0 und 1023.
Falls das wider Erwarten nicht so ist, solltest du deinen Schaltplan 
auch noch posten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.