Hallo,
für mein Projekt, einen Laderegler für ein Windrad per arduino anzusteuern und gleichzeitig einige Messwerte zu erfassen und diese auf einem LCD auszugeben, bastle ich gerade an den einzelnen code-Abschnitten.
Da im gesamten Programm u.a. auch die Umdrehung pro Minute über eine Interruptfunktion gemessen wird und noch andere Dinge zeitkritisch geschehen, suche ich nach Lösungen, die möglichst wenig Rechenleistung und somit Zeit erfordern. Dabei geht es mir NICHT um schmalen Programmcode, sondern um Schnelligkeit.
Jetzt die konkrete Frage:
- Spannungsmessung (funktioniert und die Werte stimmen)
Um auf float-Operationen verzichten zu können habe ich Werte für die Berechnung so skaliert, dass ich mit long rechnen kann und die Division durch 1023 durch die Funktion bitshift right (>> 10, entspricht Division durch 1024) ersetzt und den geringen Unterschied zwischen den Divisoren in der Messwerterfassung kompensiert.
Das sieht dann so aus:
/*Spannungsmessung mit Arduino für Scheibengenerator
Schaltung:
+12V----10k---4k7---10k Poti-----|
|-------------- + Arduino
GND---------------10k------------|
|---GND Arduino
*/
#include <LiquidCrystal.h>
#define voltPin A0 // inputpin für Spannungsmessung an Batterie
const long lVoltConst = 16147; // Konstante für Umrechnung analogen Messwert in Volt
// muss durch Messung und Berechnung in Abstimmung mit dem Poti errechnet werden Formel:
// Messwert Multimeter (Volt) * 1023 / analogIn-Wert am Arduino (Messreihe erforderlich)
long lVoltSensor = 0; // Spannungsmessung an analogIn Pin A0
long lVolt = 0; //gemessene Spannung
void setup()
{
pinMode(voltPin, INPUT); // Pinmode für A0
Serial.begin(9600); // +++Serial initialisieren - nur debug
delay(2000);
}
void loop()
{
lVoltSensor = analogRead(voltPin); //Auslesen Messwert A0
lVolt = lVoltSensor * lVoltConst; // Berechnung Volt 1.
lVolt = lVolt >> 10; // Berechnung Volt 2
Serial.println(lVolt); // nur debug
delay(1000); // +++durch Timefunktion without delay ersetzen
}
Wie gesagt, die Berechnung stimmt auf die zweite Kommastelle mit den Parallelmessungen per Multimeter überein.
Mein Problem ist, dass der Berechnete Wert auf dem Display (bzw. dem serial Monitor) als long ausgegeben wird und real zwischen 5000 und 16000 liegt. Das entspricht zwar genau der Ausgabe in mV, aber ich brauche die Ausgabe in Volt und das nur mit nur zwei Nachkommastellen.
Mit der Lösung 1, den Wert durch 1000 zu dividieren und in einer float-Variable zu speichern, bin ich aber wieder da, dass die Berechnung zeitintensiver wird.
Lösung 2, den long-Wert in einen String umzuwandeln und nach Längenprüfung den Dezimalpunkt einzufügen erfordert aber auch wieder einige Schritte.
Wie kann mann das am optimalsten hinkriegen, dass z.B. der Wert 12534 (mV) als 12,53 (V) ausgegeben (oder gleich so berechnet) wird und dabei möglichst wenig Prozessorleistung abverlangt wird?
Gruß Klaus