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
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.
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
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'
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
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 ?
. 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 ?
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.