Float Temparaturwert über I2C Senden

Hey Community,

da bin ich mal wieder. Bin mal wieder zu blöd :confused: .

nachdem ich es geschafft habe das Wire Beispiel hochzuladen, wollte ich jetzt erstmal klein anfangen und einen einfachen Temperaturwert von einem DHT11 rüber zusenden. schön loyft nicht. also ich habe zwei nanos.

hier der code für den sender:

#include <Wire.h>

#include <TroykaDHT.h>

DHT dht(4, DHT11);

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onRequest(requestEvent); // register event

    dht.begin();
}

void loop() {
  delay(100);

  
}

void requestEvent() {

    dht.read();
   
  
   
  Wire.write( dht.getTemperatureC()); // respond with message of 6 bytes
  // as expected by master
}

Empfänger:

#include <Wire.h>

void setup() {
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop() {
  Wire.requestFrom(8, 6);    // request 6 bytes from slave device #8

  while (Wire.available()) { // slave may send less than requested
    char c = Wire.read(); // receive a byte as character
    Serial.println(c);         // print the character
  }


}

als Fehler beim Sender steht : call of overloaded ‘write(float)’ is ambiguous

kann mir jemand helfen ? Vielen Dank schonmal

laberkop:
… wollte ich jetzt erstmal klein anfangen …

Dann ist float schon mal problematisch.

Schaue Dir mal write() an, dann siehst Du, daß float da nicht vorkommt: kein Byte, keine Zeichenkette, kein Feld. Das will Dir der Compiler sagen.

Mehrere Wege führen zum Ziel. Wenn Dich union und struct nicht schreckt, kannst Du ein Bytefeld mit dem Inhalt der float-Bytes übertragen. Oder Du multiplizierst die Temperatur mit zehn, wandelst in Integer und überträgst deren zwei Bytes.

Link <<

Nur Zweiter :frowning:

'write(float)' is ambiguous

Da hast du Glück, dass der Compiler nicht irgendwas macht.
write(float) gibt es nicht, und es ist unklar, was stattdessen zu verwenden ist.

Zusätzlich könnte man anmerken, dass das weitere mit den 6 byte wohl auch unverstanden übernommen wurde.

Datentypen!

Eine Temperatur 0...200 C passt eigentlich in ein einziges Byte. Das wäre am einfachsten.

michael_x:
Datentypen!

Eine Temperatur 0...200 C passt eigentlich in ein einziges Byte. Das wäre am einfachsten.

Doch das ist noch vom hello Beispiel hab's nur vergessen .
Aber wie kann ich denn den Datentyp vom Sensor von float zu Byte verändern? Oder hab ich da was falsch verstanden

noiasca:
Temperatur verzehnfachen und dann als int16_t in zwei separaten bytes senden und am anderen Ende die zwei bytes wieder zusammensetzen.

Könntest du das vielleicht noch Mal für dumme erklären hab ich nicht so ganz verstanden

noiasca:
Temperatur verzehnfachen und dann als int16_t in zwei separaten bytes senden und am anderen Ende die zwei bytes wieder zusammensetzen.

So blöde die Amerikaner sich oft anstellen, Fahrenheit ist einfach praktischer: kein Vorzeichen und keine Kommastelle im Alltag erforderlich.

byte temp = (byte)  dht.getTemperatureC();

ungetestet

Man kann auch statt int16_t die 4 bytes einer float Variable übertragen.

michael_x:
So blöde die Amerikaner sich oft anstellen, Fahrenheit ist einfach praktischer: kein Vorzeichen und keine Kommastelle im Alltag erforderlich.

byte temp = (byte)  dht.getTemperatureC();

ungetestet

Der Compiler sagt : 'class DHT' has not member named 'getTemperature'

getTemperatureC

michael_x:
getTemperatureC

Was ein Buchstabe so alles ändern kann

michael_x:
getTemperatureC

Jetzt wird am Empfänger am seriellen Monitor spiegelverkehrte Fragezeichen angezeigt

noiasca:
Auf der anderen Seite liest du die zwei Byte (Annahme als msb und lsb) und baust du es wieder zusammen

int16_t mytemp = (msb <<8 ) | lsb ; // MSB nach links geshiftet und das LSB verODERt ergibt wieder die vollständige 10fache Temperatur (damit die Kommastelle erhalten bleibt).

Deklariere ich die beim Empfänger genau wie beim Sender ? Weil er jetzt sagt er kennt mytemp msb und lsb nicht

genau gleich nicht, aber mit den gleichen Datentypen.

int16_t mytemp=0;
byte lsb=0;
byte msb=0;

noiasca:

Also vielen Dank erstmal für die Hilfe :)). Aber jetzt werden am seriellen Monitor auch Spiegelverkehrte Fragezeichen angezeigt. Lass ich denn den : char c =Wire.read so wie er ist ?

Wie wäre es mal etwas Basiswissen über Datentypen zu lernen?

noiasca:
Wie hast du das umgesetzt?

. Also mir fällt Grad auf das ich das über serial Print gemacht habe was ja keinen Sinn ergint. Ich müsste das doch in das wire.read reinschreiben oder ?

Serenifly:
Wie wäre es mal etwas Basiswissen über Datentypen zu lernen?

wäre echt nicht schlecht. Hätte aber nicht gedacht dass es komplex ist(für mich zumindest)

Im Kapitel Send and receive any data type findest Futter für C&P. Ist allerdings nicht leicht verdaulich, für mich allerdings eine gut geschriebene Fundgrube.

Ob es Dir hilft, mußt Du selbst herausfinden :slight_smile: