Servus,
das Problem bzw die Lösung ist wahrscheinlich banal aber ich bin regelrecht am verzweifeln. Bei einem Wert unter 50 soll die Variable messMittel (long) auf 0 gesetzt werden. Jedoch wird messMittel immer auf 0 gesetzt egal welchen Wert messMittel aufweist.
if(messMittel < 50){ messMittel=0; }
Ich habe verschieden Schreibweisen ausprobiert, auch das Umstellen der Bedingung hat nicht geholfen.
// Offset Stromsensor
const int Offset1 = 512;
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
Serial.print("Sensor1 in mA: ");
Serial.println(sensCurDC(0));
delay(50);
}
long sensCurDC(int pin) {
long mess;
long messMittel;
for(int i=0;i<20;i++){
mess = analogRead(pin) ;
delay(1);
mess = (mess - Offset1) * 1000;
messMittel = messMittel + mess;
}
messMittel= messMittel / 20;
// /* zum testen
Serial.print(messMittel);
Serial.print("; ");
// */
messMittel = messMittel * 50 /1024;
// /* zum testen
Serial.println(messMittel);
// */
if(messMittel < 50){ messMittel=0; }
// /* zum testen
Serial.println(messMittel);
// */
return messMittel;
}
Ich messe mit der Funktion Ströme bis 14A. Werte unter 50mA interessieren nicht und sollen daher als 0 angesehen werden.
Was mache ich falsch? Bitte helft mir
Danke
Käpt'n Kriechstrom
die If-Abfrage macht genau das, was du von ihr verlangst
Ich glaub es liegt eher an den Divisionen: "long" ist ein Integer Wert der keine Kommastellen beinhaltet. In C ist das so, dass alles zur nächst niedrigeren ganzen Zahl abgerundet wird. Sprich 0,99 wird zu 0 und 0,95 wird auch zur 0. Bei 1,75 wird daraus 1.
Versuch deine Ergebnise mal hiermit auszugeben. Bei einer Division habe ich einen "." hinter den Zahlen eingefügt, damit die Mikrocontroller weiß, dass es sich kurzzeitig um Kommazahl in der Rechnung handelt. Zudem sollte man mit Klammern arbeiten, so dass das Zwischenergebnis nicht Null ergibt, weil 50/1024 ergibt 0 und nicht einen Wert der logisch ist. Daher vielleicht erst mit 50 Multiplizieren und dann dividieren.
Daher vielleicht erst mit 50 Multiplizieren und dann dividieren
In diesem Satz muss man das "vielleicht" streichen. Dann kann man auch mit einer Integer-Division leben.
Ausserdem sind lokale Variable auf dem Stack, wie z.B. long messMittel;
nicht initialisiert, und könnte z.B. von vornherein einen negativen Wert haben. Der wird dann bei dir in
if ( messMittel < 50) messMittel = 0;
auf 0 angehoben. Vermutlich meinst du eigentlich unsigned long messMittel=0;
Was mich so jedoch echt verwirrt ist das die vorherige Version funktioniert hat wenn ich die If-Abfage auskommentiert hab. Die angezeigten Stromwerte waren realistisch und entsprachen den Werten die das Multimeter angezeigt hat.
Erst hatte ich die Funktionen mit Float Variablen geschrieben. Hatte dann jedoch gelesen das Berechnungen mit Fließkommazahlen auf dem Mikrokontroller recht lange dauern. Durch die Multiplikation des AD-Wertes mit 1000 komme ich auch auf eine Genauigkeit die für meine Zwecke volkommen ausreichend ist.