Problem beim Werte aufsummieren

Hallo,

für eine Messanwendung möchte ich jede Sekunde einen Wert erfassen und die Werte aufsummieren. Das erfassen der Werte funktioniert.
Für das Aufsummieren habe ich mir einen vereinfachten Sketch geschrieben um dies zu testen. Eigentlich sollte sich der Wert jede Sekunde um das vorgegeben Inkrement erhöhen und dies an der seriellen Schnittstelle anzeigen:

void setup() {
  Serial.begin(9600);

 // float Zwischenwert;
}

void loop() {

  float Inkrement = 1;
  float Summe;
  float Zwischenwert;

  Summe = (Zwischenwert + Inkrement);
  Zwischenwert = Summe;  
  Serial.println(Summe);
  
  delay(1000);
  
}

Viele Grüße

Andreas

  float Inkrement = 1;
  float Summe;
  float Zwischenwert;

Wegen der Ungenauigkeit von Fließkommazahlen beim Arduino kannst Du keine Summe mit einer Fließkommazahl machen. Irgendwann hat das Aufsummieren keinen Einfluß mehr auf die Fließkommazahl.

nimm unigned long.

Grüße Uwe

Das ist nicht das Hauptproblem. Zwischenwert ist eine lokale Variable, die am Ende von loop() aufhört zu existieren

Und entweder Summe oder Zwischenwert ist überflüssig. Eine Variable reicht da völlig

Entweder machst du deine Summe static, oder global.

Hallo,

vielen Dank für die Antworten.
Wie muss ich den Code ändern. Bin grad etwas hilflos... :wink:

Gruß Andreas

void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  static uint32_t Summe=0;
  Serial.println(++Summe);
  delay(1000);
}

Nun läufts:

void setup() {
  Serial.begin(9600);

 // float Zwischenwert;
}

void loop() {

  unsigned long Inkrement = 1;
  unsigned long Summe;
  static unsigned long Zwischenwert;

  Summe = (Zwischenwert + Inkrement);
  Zwischenwert = Summe;  
  Serial.println(Summe);
  
  delay(1000);
  
}

Danke für die Hilfe! "Static" bei Zwischenwert war der entscheidende Hinweis. Wieder was gelernt :slight_smile:

Gruß Andreas

Und auch wirklich verstanden ?
Ist nicht unwichtig.

Ulli

Hallo Arduino_Andi,
gerade Anfangs in der Lernphase finde ich es erleichternd, Strukturen zu lernen, an die man sich später, nach einer Pause möglichst gut erinnert und auch nach kurzem Einblick nachvollziehen kann.

Wie Serenifly schrieb, hören Variablen am Ende einer function() auf zu existieren. Und wenn zu Begin einer function() Variablen deklariert werden, sind sie bei wiederholtem Aufruf immer wieder neu, mit dem Anfangswert da.
Du kennst den Film mit Jack Nicholson "Und ewig grüßt das Murmeltier"?

Static, wie von Serenifly zu verwenden, funktioniert. Allerdings mußt Du immer im Augen behalten, wo Du Static angewendet hast und wo nicht.

Selbst ziehe ich vor, Variablen, mit denen in loop() fortlaufend gearbeitet wird, im Deklarationsteil zu deklarieren. Dann sind sie global und sind in jeder function() verfügbar.

Das sieht dann so aus:

float Inkrement = 1;
float Summe;
float Zwischenwert;

void setup() {
  Serial.begin(9600);
}

void loop() {
  Summe = (Zwischenwert + Inkrement);
  Zwischenwert = Summe;
  Serial.println(Summe);

  delay(1000);
}

Wie mans macht, ist etwas Geschmackssache. Allerdings sollte man sich im eigenen Code immer wieder finden und nicht willkürlich einmal eine und dann die andere Strategie verfolgen, wenn es keinen sinnvollen Grund dazu gibt, sonst schleichen sich schnell Fehler ein.

Aber was solls, letztens bin ich selbst noch über einen ähnlich gelagerten eigenen Fehler gestolpert und Serenifly machte mich darauf aufmerksam;)