dtostrf void loop

Hallo zusammen,

Ich bin neu, verzeiht Katastrophen! Ich will mir eine eigene Wetterstation bauen, die per 433mhz Daten an einen anderen Arduino sendet. Nach vielen Tagen Variablen Konvertierungs-frust habe ich gestern Abend das erste mal erfolgreich Temperaturdaten übertragen.

Verwendet wird ein DHT22 Sensor und Billig rf/tx Module. Jetzt wollte ich das Programm erweitern damit auch die Luftfeuchtigkeit übertragen wird, aber sobald die Zeile: dtostrf(h,4,2,h_data); ins Spiel kommt, dreht das ganze Program am Rad, jeh nach Position können entweder die Daten des Sensors nicht mehr gelesen werden, oder das Programm macht nur einen durchlauf oder es läuft ohne den delay Befehl zu beachten und gibt nur Müll in der Konsole aus.

Vielleicht konvertiere ich falsch? Kann mir jemand erklären wieso das ist? Oder wie man es besser macht?

Danke!!

Folgender Code funktioniert, aber sobald dtostrf(h,4,2,h_data); ins Spiel kommt, ist nichts mehr wie es sein soll :confused:

#include <VirtualWire.h>
#include <DHT.h>


#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);


float h;
float t;
char t_data[5];
char *h_data;
int i;


void setup() {
  Serial.begin(9600);
  dht.begin();
  Serial.println("start");

  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(2000);	 // Bits per sec
  vw_set_tx_pin(10);
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);
  h = dht.readHumidity();
  t = dht.readTemperature();

  // Debug, anzeige der Daten in der Konsole
  //  Serial.print("Temperatur      : ");
  //  Serial.println(t);
  //  Serial.print("Luftfeuchtigkeit: ");
  //  Serial.println(h);

  // Umwandlung der Float Daten des DHT22 in char fuer die rf Uebertragung
  dtostrf(t,4,2,t_data);
  //dtostrf(h,4,2,h_data);    // <---- BOESE ZEILE!
  
  // Debug  
  Serial.print("Temperatur      : ");
  for (i=0; i<5;i++){
    Serial.print(t_data[i]);
  }
  Serial.println("");
//  Serial.print("Luftfeuchtigkeit: ");
//  for (i=0;i<5;i++){
//    Serial.print(h_data[i]);
//  }
//  Serial.println("");

  vw_send((uint8_t *)t_data, strlen(t_data));
  vw_wait_tx(); // Wait until the whole message is gone
  
}

1.) Mach das Array groß genug! Da muss Platz sein für Vorkommastellen und Punkt und Nachkommastellen und Null-Terminator und Vorzeichen

2.) h_data ist nur ein Zeiger! Was willst du da reinschreiben? Du braucht schon ein richtiges Array als Ziel

sigfault:
// Umwandlung der Float Daten des DHT22 in char fuer die rf Uebertragung

Was für ein Tohuwabohu!

Ein DHT22 Sensor liefert keine "float" Daten!
Die 'float' Werte bekommst Du aus der DHT-Library, die Du verwendest!
Ein DHT22 liefert sowohl die Temperatur als auch die Luftfeuchte in 16-Bit Werten, die locker in eine 'int' Variable reinpassen.

Statt für die Funkübertragung einen lesbaren Roman in ASCII-Text zu machen, der dann je nach gemessenem Wert noch ein kürzerer oder längerer Roman wird, würde ich per Funk 4 Bytes übertragen: Die Temperatur als 'int' und die Luftfeuchte als 'int'.

Und damit keine Informationen verlorengehen, wären die zu übertragenen Werte;

  • Temperatur in Zehntelgrad
  • Luftfeuchte in Zehntelprozent

Also selbst wenn Du diese unsäglichen 'float' aus Deiner Library rausliest, würdest Du als Umformung zum Senden besser sowas wie das verwenden:

int data[2];
data[0] = round(10*dht.readTemperature());
data[1] = round(10*dht.readHumidity());

Und dann überträgst Du immer genau diese 4 Datenbytes per Funk und keine Romane.

Wenn Du auf der Empfängerseite dann wider die beiden int-Werte empfangen hast und Du unbedingt wieder 'float' Werte haben möchtest, kannst Du ja leicht wieder float-Werte erhalten, indem Du durch 10.0 teilst. Mehr als das muss nicht sein.

@Serenifly
Das mit dem Zeiger hab ich gar nicht mehr gesehen. Nach dem ändern funktioniert es.

@jurs
Danke für die Tipps, ich hab es jetzt soweit umgebaut das ich die Daten wie beschrieben auslese und Übertrage. Der "float" kommt vom Beispielprogramm das mit der dht library mit kommt, ich hab mir das nicht ausgedacht, Ich versuch auch mal direkt an die Sensor Daten zu kommen, aber da werde ich eine Weile brauchen.

Danke euch beiden!