Probleme mit float

Hallo Zusammen,

ich bin gerade dabei, meinen Stromzähler optisch abzulesen. Und zwar dreht sich die Scheibe mit dem roten Strich 75 mal pro kWh.

Im Code habe ich folgende Zeile drin:

unsigned int rev_per_kWh = 75;
float trigger_step = 1.0 / rev_per_kWh;

Also eigentlich kommt da 0.1333 peridosich raus. Wenn ich das mit Serial.println(trigger_step); ausgebe, dann wird da immer 0.01 ausgeben, also auf zwei Nachkommastellen gerundet. Das ist mir natürlich zu ungenau. Sollte ich das ganze lieber als ulong speichern?

Serial.println(trigger_step,6);

Einfach mal die Doku für Serial.print() ansehen:

2 Nachkommastellen ist der Standard für float. Mehr muss man per Hand angeben

Hi

Warum zählst Du nicht einfach die Striche und nur, wenn Du Das brauchst, machst Du daraus eine menschenlesbare Zahl?
Also dann 'Anzahl Striche/75' - Da reichen dann auch zwei Nachkommastellen.

  • Du brauchst kein float
  • Du hast keinerlei Rundungsfehler, erst bei der Anzeige und dort stören Diese nicht

Für Deine rev_per_kWh reicht der Datentyp byte (0...255), spart auch wieder ein Byte.

Mit welchem Sensor detektierst Du den roten Strich?
Hatte, vor einigen Jahren, mit einem CNY70 (Reflex-Koppler) eher bescheidene Ergebnisse - hatte aber auch damit zu tun, daß der Zähler 'zählt', als mit der Ausrichterei (ein Ferraris-Zähler zählt nur hängend, liegend auf dem Tisch tut Der rein gar Nichts - hat mich zwei Abende gekostet).
Nachteil bei dieser Methode: Beim nächsten Ablese-Termin muß der mühsam ausgerichtete Sensor wohl wieder ab.

MfG

Ich nehme einen TCRT5000. Die Idee, nur die Umdrehungen zu zählen, hatte ich auch gerade. Ist einfacher und genauer. Nur funktioniert es nicht.

Hier der Code:

unsigned long Stromumdrehungen;
float StromKwhSeitBoot;

loop() {
  if (debouncerStrom.read()==1) {
    if (StromAlreadyCounted == false) {
      Stromumdrehungen += 1;
      if (Stromumdrehungen > 0) {
        StromKwhSeitBoot = Stromumdrehungen / 75;
        Stromzaehler = StromzaehlerAusIoBroker + StromKwhSeitBoot;
        Serial.print("StromKwhSeitBoot: ");
        Serial.print(StromKwhSeitBoot,8);
        Serial.print("   Stromumdrehungen: ");
        Serial.println(Stromumdrehungen);
      }
      if (StromvortragGesetzt == true) {
        SendeStromzaehler = true;
      }
    }
  }
}

Ich hole mir den letzten Zählerstand aus ioBroker und addiere die Umdrehungen seit Boot des NodeMCU hinzu. Die Summe schicke ich dann wieder zum ioBroker. Funktioniert an sich auch, aber

Meine Testausgaben sehen im Moment so aus:
StromKwhSeitBoot: 0.00000000 Stromumdrehungen: 74
StromKwhSeitBoot: 1.00000000 Stromumdrehungen: 75

Aus irgendeinem Grund werden keine Nachkommastellen berechnet.

Das ist eine Integer Division

StromKwhSeitBoot = Stromumdrehungen / 75;

Wenn das ein Float gerechnet werden soll musst du das dem Compiler auch mitteilen. Im deinem ersten Post hast du das doch getan

Danke für eure Hilfe, den letzten Part habe ich jetzt gerade selbst herausgefunden.

StromKwhSeitBoot = (float)Stromumdrehungen / 75.00000000;

Alles etwas komplizierter beim Arduino. Habe bisher hauptsächlich viel mit VBScript gemacht.