Logfile Flasch CSV Mega Ds18B20 Kommastelle ;)

Hallo Leute leider finde ich nichts und weis auch gerade nicht wo ich zu suchen anfangen sollte da das projekt nun einen umfang erreicht hatt,
das es ein wenig unübersichtlich für einen total noob wie mich wird. :wink:

Nun ich habe einen mega mit 10 Stück DS18B20 für eine Heizung wie Üblich
Nun das Programm leuft gans gut der mega liest die 10 stück sauber aus und Schreibt das ganze in die loggfile alles top nur hab ich mit der kommastelle eine Problem momentan leuft das so 25.50 als temperatur ich brauche aber die null am ende nicht sondern nur die 25.5

#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ethernet.h>
#include <Flash.h>
#include <TinyWebServer.h>
#include <string.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 6 // DS18B20 an Pin 6 anngeschlossen 

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/*--------------------------------------------------------------------------------DS18B20 Adresses-----------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------*/

DeviceAddress VorlaufWaermepumpe = { 0x28, 0xFF, 0x00, 0x2F, 0x4D, 0x04, 0x00, 0xB8 };
DeviceAddress RuecklaufWaermepumpe = { 0x28, 0xFF, 0xD0, 0x24, 0x4B, 0x04, 0x00, 0xA3 };
DeviceAddress VorlaufPufferspeicher = { 0x28, 0xFF, 0xC8, 0x2F, 0x4D, 0x04, 0x00, 0xA4 };
DeviceAddress RuecklaufPufferspeicher = { 0x28, 0xFF, 0x92, 0x1F, 0x4B, 0x04, 0x00, 0x15 };
DeviceAddress VorlaufWarmwasser = { 0x28, 0xFF, 0xBA, 0x1D, 0x4B, 0x04, 0x00, 0xD4 };
DeviceAddress RuecklaufWarmwasser = { 0x28, 0xFF, 0x26, 0x20, 0x4B, 0x04, 0x00, 0x97 };
DeviceAddress VorlaufHeizkreis1 = { 0x28, 0xFF, 0x01, 0x20, 0x4B, 0x04, 0x00, 0x3E };
DeviceAddress RuecklaufHeizkreis1 = { 0x28, 0xFF, 0x41, 0x24, 0x4B, 0x04, 0x00, 0xD9 };
DeviceAddress VorlaufHeizkreis2 = { 0x28, 0xFF, 0xD5, 0x1E, 0x4B, 0x04, 0x00, 0x22 };
DeviceAddress RuecklaufHeizkreis2 = { 0x28, 0xFF, 0x0B, 0x24, 0x4B, 0x04, 0x00, 0x8D };

File logfile;


  sensors.begin(); DEC;   // Start up the library
  sensors.setResolution(VorlaufWaermepumpe, 9);
  sensors.setResolution(RuecklaufWaermepumpe, 9);
  sensors.setResolution(VorlaufPufferspeicher, 9);
  sensors.setResolution(RuecklaufPufferspeicher, 9);
  sensors.setResolution(VorlaufWarmwasser, 9);
  sensors.setResolution(RuecklaufWarmwasser, 9);
  sensors.setResolution(VorlaufHeizkreis1, 9);
  sensors.setResolution(RuecklaufHeizkreis1, 9);
  sensors.setResolution(VorlaufHeizkreis2, 9);
  sensors.setResolution(RuecklaufHeizkreis2, 9);

  sensors.requestTemperatures();
  float tempVorlaufWaermepumpe = sensors.getTempC(VorlaufWaermepumpe); //damit wird die Temperatur an tempinsideThermometer gegeben
  float tempRuecklaufWaermepumpe = sensors.getTempC(RuecklaufWaermepumpe);
  float tempVorlaufPufferspeicher = sensors.getTempC(VorlaufPufferspeicher);
  float tempRuecklaufPufferspeicher = sensors.getTempC(RuecklaufPufferspeicher);
  float tempVorlaufWarmwasser = sensors.getTempC(VorlaufWarmwasser);
  float tempRuecklaufWarmwasser = sensors.getTempC(RuecklaufWarmwasser);
  float tempVorlaufHeizkreis1 = sensors.getTempC(VorlaufHeizkreis1);
  float tempRuecklaufHeizkreis1 = sensors.getTempC(RuecklaufHeizkreis1);
  float tempVorlaufHeizkreis2 = sensors.getTempC(VorlaufHeizkreis2);
  float tempRuecklaufHeizkreis2 = sensors.getTempC(RuecklaufHeizkreis2);

  logfile.print(tempVorlaufWaermepumpe);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" | Vorlauf Waermepumpe: ");
  Serial.print(tempVorlaufWaermepumpe);
Serial.write(176);
#endif 

  
  logfile.print(tempRuecklaufWaermepumpe);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Ruecklauf Waermepumpe: ");
  Serial.print(tempRuecklaufWaermepumpe);
Serial.write(176);
#endif
 
 
  logfile.print(tempVorlaufPufferspeicher);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Vorlauf Pufferspeicher: ");
  Serial.print(tempVorlaufPufferspeicher);
Serial.write(176);
#endif 
  
  
  logfile.print(tempRuecklaufPufferspeicher);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Ruecklauf Pufferspeicher: ");
  Serial.print(tempRuecklaufPufferspeicher);
Serial.write(176);
#endif


  logfile.print(tempVorlaufWarmwasser);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Vorlauf Warmwasser: ");
  Serial.print(tempVorlaufWarmwasser);
Serial.write(176);
#endif //ECHO_TO_SERIAL 

  
  logfile.print(tempRuecklaufWarmwasser);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Ruecklauf Warmwasser");
  Serial.print(tempRuecklaufWarmwasser);
Serial.write(176);
#endif //ECHO_TO_SERIAL


  logfile.print(tempVorlaufHeizkreis1);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Vorlauf Heizkreis1: ");
  Serial.print(tempVorlaufHeizkreis1);
Serial.write(176);
#endif 
  
  
  logfile.print(tempRuecklaufHeizkreis1);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Ruecklauf Heizkreis1: ");
  Serial.print(tempRuecklaufHeizkreis1);
Serial.write(176);
#endif


  logfile.print(tempVorlaufHeizkreis2);
logfile.print(",");
#if ECHO_TO_SERIAL
  Serial.print(" |  Vorlauf Heizkreis2: ");
  Serial.print(tempVorlaufHeizkreis2);
Serial.write(176);
#endif 
  
  
  logfile.print(tempRuecklaufHeizkreis2);
#if ECHO_TO_SERIAL
  Serial.print(" |  Ruecklauf Heizkreis2: ");
  Serial.print(tempRuecklaufHeizkreis2);
Serial.write(176);
#endif



logfile.flush();

^^ ich habe den code gekürtzt weill nicht alles hier rein geht auf das wesentliche.

Die DS18B20 als float Zahl auszulesen ist absolut unnötig und nicht sinnvoll.

Auf AVR 8Bit haben keine Recheneinheit für das Rechnen mit Fließkommazahlen. Es geht zwar, benötigt unnötig viel Rechenpower und Speicher.

printf() ist standardmäßig nicht für float Zahlen freigeschaltet.

Für die Logfile macht es Sinn, die Werte mit Festkommarithmetik zu nutzen. Soll heißen, du speicherst alles nur in int ab.

Beispiel:
float tempVorlaufPufferspeicher = sensors.getTempC(VorlaufPufferspeicher);
=>
int tempVorlaufPufferspeicher = (sensors.getTempC(VorlaufPufferspeicher)) * 10;

Aus 23.50 wird dann 235. So am besten auf der Karte abspeichern. Für die Auswerteeinheit (CSV -> PC) kannst du das ganze dann wieder umwandeln.

Wegen printf, entweder aufbohren, -> google
oder schreibe dir eine kleine Funktion (davon ausgehen, dass die Werte so wie oben geschrieben (235) ankommen.

void write_float(int temp)
{
int i = temp/10;
int f = temp%0;

if(i < 10) Serial.printf(" ");
Serial.print(i);
Serial.print(".");
Serial.print(j);
}

sschultewolter:
printf() ist standardmäßig nicht für float Zahlen freigeschaltet.

printf() nicht, aber das ist auch was anderes wie die Arduino Print Klasse.

Da kann man bei Floats die Anzahl der Nachkommastellen angeben:

Ist da für Serial, aber geht genauso mit allen anderen Klassen die print()/println() machen

Da wir schon mal beim Ratschlaggeben sind:
Bitte benutze das F() Makro bei allen print von Texten. Damit wird der Tesxt nicht ins RAM kopiert und RAM gespart.
zB
Serial.print(" | Ruecklauf Pufferspeicher: ");
wird
Serial.print(F(" | Ruecklauf Pufferspeicher: "));

Grüße Uwe

max-power:
alles top nur hab ich mit der kommastelle eine Problem momentan leuft das so 25.50 als temperatur ich brauche aber die null am ende nicht sondern nur die 25.5

Bei print sind für die Ausgabe von Gleitkommazahlen standardmäßig zwei Nachkommastellen voreingestellt.

float zahl=1.234;
Serial.print(zahl);
// führt zur selben Ausgabe wie
Serial.print(zahl,2);

Wenn Du eine andere Anzahl an Nachkommastellen benötigst, gibst Du einfach die gewünschte Zahl an Nachkommastellen an, z.B. für eine Nachkommastelle im Logfile:

logfile.print(tempRuecklaufHeizkreis2,1);

Vielen dan für die tollen tipps ich werde alles noch genau bearbeiten und mich melden auf jeden fall hatt das mit dem ,1 für das komma gut funktioniert nun versuch ich das mal im laagnzeittest

THX

Hallo,

ich nehme an, wenn Du das als csv speicherst, dass Du die Daten in Excel weiterverarbeiten möchstest. Dann muß aber der Punkt gegen ein Komma getauscht werden. Sonst macht Excel Mist.

Da ich all meine Daten die auf SD Karte geschrieben werden als String umwandle, tausche ich den Punkt gegen ein Komma wie folgt.

void Zeichen_in_charArray_ersetzen (char* zeichenkette, char charSearch, char charReplace)
{
  int i = 0;
  while ( zeichenkette[i] != '\0')  {
    if ( zeichenkette[i] == charSearch )  {   // suche nach Zeichen 'charSearch' und
      zeichenkette[i] = charReplace;          // ersetze es durch 'charReplace'
    }
  i++;
  }
  //return zeichenkette;
}

Aufruf

Zeichen_in_charArray_ersetzen(_AD_Channel_1, '.', ',');

Die Wandlung von float in eine Zeichenkette ginge wie folgt, war mal ein Tipp von Serenifly.

dtostrf(_Kanal_1, 5, 2, _AD_Channel_1);  // Input, Gesamtstellen inkl. Komma, Nachkommastellen, Output

Warum sind denn die Code-Felder immer groß?