wie float in loop() immer wieder auf 0 setzten ?

Hallo allerseits,
ich experimentiere gerade wieder etwas und hänge schön am Anfang, also es geht um folgendes:

Innerhalb der loop() möchte ich eine float Variable immer wieder als 0 (null) haben, aber irgendiw wird immer da weiter gezählt, wo vorher aufgehört wurde. :expressionless: Ich hoffe Ihr versteht was ich meine...

Die Variable "float ZStand_0;" soll in der loop() immer wieder 0 sein , aber er zählt immer einen dazu. grrrr
Was muss ich wo eintragen, damit "ZStand_0" immer wieder 0 ist ?

Hier der Code den ich bis jetzt fertig habe:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <Ethernet.h>                                   // library for ethernet functions

//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x8C };// MAC-Adresse des Arduino
byte ip[]      = { 192, 168, 178, 142 };                // IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                  // Gateway
byte subnet[]  = { 255, 255, 255, 0 };                  // SubNet
byte server[]  = { 192, 168, 178, 111 };                // IP-Adresse des Servers

EthernetClient client;
char host[]    = "192.168.178.111";                     // Domain
char url[]     = "/Arduino/Gas/insert1.php";            // Pfad zur insert1.php
char key[]     = "123456";  
char lesen[]    = "/Arduino/Gas/read.php";               // Pfad zur read.php  
char Mail[]    = "/Arduino/Mail/mailsender.php";        // Pfad zur mail.php
char Fail[]    = "/Arduino/Mail/failmailsender.php";        // Pfad zur mail.php

LiquidCrystal_I2C lcd(0x27,20,4);                       // set the LCD address to 0x27 for a 16 chars and 4 line display
byte hoch3[8] = { 
  B01110, B00010, B00110, B00010, 
  B01110, B00000, B00000, B00000 };     // erzeugt die ³ bei m³

int PowerLED = 3;                                       // rote kontroll LED
int ReedPin = 8;                                        // Schalter ist mit Pin 8 verbunden 
int val;                                                // Variable für den Pin Zustand 
int buttonState;                                        // Variable für den letzten Schalterzustand 
int buttonPresses = 0;                                  // Wie oft ist der Schalter gedrückt
float ZStand = 903789;                                  // Zählerstand bei Anschluss Reedkontakt
float ZStand_DB;                                        // Zählerstand aus DB
float ZStand_Neu;                                       // Zählerstand Neu
float ZStand_0;                  // <-- DB Eintrag leer bzw. keine Verbindung
char returnvalue = 0;                                   // rückgabewert
char buffer[10];                                        // puffer initialisieren mit leerem string

void setup()
{
  pinMode(PowerLED, OUTPUT);                           // Pin rote LED als Ausgang setzten
  pinMode(ReedPin, INPUT);                             // Reedkontakt Pin als Eingang setzten
  Serial.begin(9600);                                  // Start der seriellen Kommunikation mit 9600bps
  digitalWrite(ReedPin,HIGH);                          // Strom auf Reedkontaktpin geben
  Ethernet.begin(mac, ip);                             // IP Konfiguration setzten
  delay(1000);
  lcd.init();                                          // initialize the lcd
  lcd.backlight();
  lcd.createChar(0, hoch3);
  lcd.setCursor(2, 0);                                 // Zeile 1
  lcd.print(F("* Gasduino *"));                        // Begruessung
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print(F("wird gesrtartet"));
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print(F("               "));
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.print(F("wird gesrtartet"));
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);                                 // LCD Zeile 1
  lcd.print(F("Ethernet Starten"));
  delay(2000);
  if(client.connect(server, 8000))                     // LCD Anzeige Server verbindung
  {
   lcd.setCursor(0,1);                                 // Zeile 2
   lcd.print(F("verbunden ..."));
   delay(2000);
   lcd.clear();                                        // lösche Display
   lcd.setCursor(0,0);                                 // Zeile 1
   lcd.print(F("Lese aus DB ..."));
   delay(1000); 
   daten_laden();                                      // DB auslesen beginnen 
   delay(1000);
   ZStand_DB =atof(buffer)/100;                         // durch 100 teilen, weil in der read.php multipliziert wird (*100)
   lcd.clear();                                         // lösche Display
   lcd.setCursor(0 ,0);                                 // Zeile 1
   lcd.print(F("Gasstand aus DB"));
   lcd.setCursor(4 ,1);                                // Zeile 2
   lcd.print(ZStand_DB);                                // aktueller Zaehlerstand
   lcd.setCursor(11,1);
   lcd.print("m");
   lcd.setCursor(12, 1);
   lcd.write(0);
   buttonState = digitalRead(ReedPin);                  // Anfangszustand lesen
   delay(1000);
   //Mail_senden();                                       // Sende Info Mail das Arduino Neu gestartet wurde  
   client.flush();
   client.stop();
  } else {
    digitalWrite(PowerLED, HIGH);
    lcd.setCursor(0, 1);                               // Keine LAN Verbindung
    lcd.print(F(">>> Kein LAN <<<"));
    client.flush();
    client.stop();
  }
}

void loop()
{
 val = digitalRead(ReedPin);                          // Eingabewert lesen und in val speichern
  if (val != buttonState) {                           // Der Zustand des Schalters hat sich verändert 
    if (val == LOW) {                                 // Ist der Schalter gedrückt? 
      buttonPresses++;                                // Inkrementieren der Variablen buttonPresses
      daten_laden();                                  // DB auslesen, wenn beim Start kein Wert eingelen werden konnte
      delay(2000);
      ZStand_DB =atof(buffer)/100;                    // durch 100 teilen, weil in der read.php multipliziert wird (*100)
      if (ZStand_DB > ZStand/100)                     // ist DB eintrag grösser als manueller eintrag
      {
        ZStand_Neu = ZStand_DB*100 + buttonPresses;   // DB eintrag + impuls = Neuer Zählerstand
      }
       else if (ZStand_DB < 1)                        // ist DB eintrag leer bzw. keine Verbindung
      { 
        ZStand_Neu = ZStand_0 + buttonPresses;        // Leere DB + impuls = Neuer Zählerstand
      }
       else
      {
        ZStand_Neu = ZStand + buttonPresses;          // manueller eintrag + impuls = Neuer Zählerstand
      }
    
     lcd.clear();
     lcd.setCursor(0 ,0);                                 // Zeile 1
     lcd.print(F("Now"));
     lcd.setCursor(7, 0);
     lcd.print(ZStand_Neu/100);
     lcd.setCursor(14,0);
     lcd.print("m");
     lcd.setCursor(15,0);
     lcd.write(0);
     lcd.setCursor(0, 1);
      lcd.print(F("MySQL"));
      lcd.setCursor(7, 1);
      if(ZStand_DB < 1){
        lcd.setCursor(7, 1);
        lcd.print(F("Fail  ")); 
      }
      lcd.print(ZStand_DB);
      lcd.setCursor(14,1);
      lcd.print("m");
      lcd.setCursor(15,1);
      lcd.write(0);
      float gz = ZStand_Neu/100;  
      //Daten_senden(gz);                                // Zaehlerstand an DB schicken
      delay(1000);
    }
  }
  buttonState = val;                                      // Den Zustand merken
}

void daten_laden()                                      // DB Abfragen
{
  int index = 0;                                        // zaehlindex auf 0 setzen
  client.connect(server, 8000);                         // connect to server
  Serial.print(F("Verbinde ... "));    
  delay(2000);
  if (client.connected()) {                             // wenn connected, request senden
    digitalWrite(PowerLED, LOW);                        // rote LED aus
    client.print(F("GET "));
    client.print(lesen);
    client.println(F(" HTTP/1.1"));
    client.print(("Host: "));
    client.print(host);
    client.println();
    client.println();
    delay(100);
  } 
  else {
    Serial.println(F("Keine Verbindung..."));
    digitalWrite(PowerLED, HIGH);                       // rote LED an bei Verbindungsfehler
    client.flush();
    client.stop();
    client.connect(server, 8000);                       // connect to server
    delay(1000);
    if (client.connected()) {
      digitalWrite(PowerLED, LOW);                        // rote LED aus
    }
  }

  while (client.available() && client.read() != '

Ich hoffe Ihr köönt mich verstehen, weiß nicht wie ich das genauer beschreiben soll... :blush:);  // Lese solange Bytes aus der Verbindung und wirf sie weg bis ein $ gefunden wird.
  while (client.available() && index < 10) {            // einlesen der Nutzdaten. Aufpassen, das wir die Arraygrenze nicht überschreiten
    buffer[index++] = client.read();                    // solange zeichen vorhanden sind, das aktuelle zeichen in puffer schreiben und zaehlindex erhoehen   
  }

buffer[index] = 0;                                    // wenn keine zeichen mehr vorhanden, dann puffer am letzten (schon erhoehten) index auf
    client.stop();
}


Ich hoffe Ihr köönt mich verstehen, weiß nicht wie ich das genauer beschreiben soll... :blush:

ZStand_0 wird nirgens mit einem Wert geladen und nur 2 mal im Sketch verwendet.

Zeile 034: float ZStand_0;
Zeile 115: ZStand_Neu = ZStand_0 + buttonPresses;

Es genügt wenn in Zeile 034 steht:
float ZStand_0 =0;

Ich erstehe aber nicht zu was Du das machst.

Grüße Uwe

Cetax:
Die Variable "float ZStand_0;" soll in der loop() immer wieder 0 sein , aber er zählt immer einen dazu. grrrr
Was muss ich wo eintragen, damit "ZStand_0" immer wieder 0 ist ?

Die Variable ZStand_0 kommt in Deinem Sketch zweimal vor: Bei der Deklaration und in einer if-Abfrage, aber eine ZUWEISUNG irgendeines Wertes an diese Variable erfolgt NIE! Also globale Variable sollte die vom gcc (trotz float) auf Null initialisiert werden und auch null bleiben, solange das Programm läuft.

Meinst Du auch wirklich ZStand_0 und nicht eine andere Variable?

Zum Beispiel:
buttonPresses++;
...
ZStand_Neu = ZStand_0 + buttonPresses;

Da zählst Du irgendwie die Tastendrücke und dann kommt pro loop-Durchlauf immer die Summe der bisherigen Tastendrücke draufgelegt. Gehe ich mal davon aus, dass ZStand_0 im gesamten Programmablauf null bleibt, dann verändert sich ZStand_Neu wie folgt:

Nach 1x Tastendruck (+ 1 buttonPresses)
ZStand_Neu = 1
Nach 2 Tastendrücken (+ 2 buttonPresses)
ZStand_Neu = 3
Nach 3 Tastendrücken (+ 3 buttonPresses)
ZStand_Neu = 6
Nach 4 Tastendrücken (+ 4 buttonPresses)
ZStand_Neu = 10
Nach 5 Tastendrücken (+ 5 buttonPresses)
ZStand_Neu = 15

Und so weiter und so fort.

Zählfolge 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 ...

Das finde ich für einen Zähler von Tastendrücken ein bisschen - irregulär!

Hallo Uwer,

uwefed:
...
Ich erstehe aber nicht zu was Du das machst.

Ich verschlimmbessere noch meinen Sketch zum Impulse zählen.
Und in einem Display sollen die Impulse angezeigt werden, was funktioniert.
ABER, wenn es mal eine Unterbrechung zur DB gibt, zählt er einfach weiter, soll er ja auch und macht er,
ich möchte jetzt das er dann immer wieder bei Null anfängt die Impulse an zuzeigen, damit ich sehen kann,
wieviele Impulse gerade ohne DB durch gehen.

Ich hoffe du konntets mit ein bischen folgen :blush:

Hallo jurs,

jurs:

Cetax:
Die Variable "float ZStand_0;" soll in der loop() immer wieder 0 sein , aber er zählt immer einen dazu. grrrr
Was muss ich wo eintragen, damit "ZStand_0" immer wieder 0 ist ?

Die Variable ZStand_0 kommt in Deinem Sketch zweimal vor: Bei der Deklaration und in einer if-Abfrage, aber eine ZUWEISUNG irgendeines Wertes an diese Variable erfolgt NIE! Also globale Variable sollte die vom gcc (trotz float) auf Null initialisiert werden und auch null bleiben, solange das Programm läuft.

Meinst Du auch wirklich ZStand_0 und nicht eine andere Variable?

Zum Beispiel:
buttonPresses++;
...
ZStand_Neu = ZStand_0 + buttonPresses;

Da zählst Du irgendwie die Tastendrücke und dann kommt pro loop-Durchlauf immer die Summe der bisherigen Tastendrücke draufgelegt. Gehe ich mal davon aus, dass ZStand_0 im gesamten Programmablauf null bleibt, dann verändert sich ZStand_Neu wie folgt:

Nach 1x Tastendruck (+ 1 buttonPresses)
ZStand_Neu = 1
Nach 2 Tastendrücken (+ 2 buttonPresses)
ZStand_Neu = 3
Nach 3 Tastendrücken (+ 3 buttonPresses)
ZStand_Neu = 6
Nach 4 Tastendrücken (+ 4 buttonPresses)
ZStand_Neu = 10
Nach 5 Tastendrücken (+ 5 buttonPresses)
ZStand_Neu = 15

Und so weiter und so fort.

Zählfolge 1, 3, 6, 10, 15, 21, 28, 36, 45, 55 ...

Das finde ich für einen Zähler von Tastendrücken ein bisschen - irregulär!

Ahh, danke für den Tip bzw. Hinweis. Ich habe immer an falscher stelle geschaut, stimmt ZStand_0 bleibt ja null.
Der buttonPresses wird ja immer erhöht.

Wie kriege ich den denn immer so im Display angezeigt, das er wenn er die Verbindung zur DB verliert, sozusagen angzeigt,
wie viele Zählt ?

Weitergezählt wird ja, aber immer da wo er letztes aufgehört hat.

Hoffe Ihr konntet mir folgen... :blush: