Go Down

Topic: Zahlenwerte über I2C senden (Read 377 times) previous topic - next topic

mario01

Vielen dank :)

Es funktioniert.


Master:

Code: [Select]

#include <Wire.h>
int led=13;
union Data
{
  byte asArray[sizeof(int)];
  int temp;
};

Data slaveOne;

void setup()
{
  Wire.begin();
  Serial.begin(9600);
 
}

void loop()
{
 
  if (getValues(1, slaveOne))    //Daten anfordern
  {
    Serial.println("Master:");
    Serial.println(slaveOne.temp);
   
    Serial.println();
 
  }
 
  delay(1000);
}



bool getValues(byte slave, union Data& values)
{
  Wire.requestFrom(slave, sizeof(values));
   
  if (Wire.available() > 0)
  {
    for (unsigned int i = 0; i < sizeof(values); i++)
      values.asArray[i] = Wire.read();

    return true;
  }
  else
    return false;
}



Slave:

Code: [Select]
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

union Data
{
 byte asArray[sizeof(int)];
  int temp;
};

Data values;

void setup()
{
  Wire.begin(1);
Serial.begin(9600);
   
  Wire.onRequest(requestHandler);
 


  sensors.begin();/* Inizialisieren der Dallas Temperature library */
}

void loop()
{
  sensors.requestTemperatures(); // Temp abfragen

  values.temp=sensors.getTempCByIndex(0);

}



void requestHandler()
{
  //hier geht nur einmal write() !!
 
  Wire.write(values.asArray, sizeof(values));
}



Nun werde ich das ganze mit 2 Variablen versuchen und danach das ganze mit Kmh und Regenmenge:-)

Serenifly

#16
Aug 13, 2017, 12:30 pm Last Edit: Aug 13, 2017, 12:35 pm by Serenifly
Quote
Nun werde ich das ganze mit 2 Variablen versuchen
Mit zwei Variablen ist es das einfachste man verwendet ein anonymes struct in der Union. Das ist auch in dem Original-Beispiel so drin.

z.B. zwei ints:
Code: [Select]

union Data
{
  byte asArray[2 * sizeof(int)];
  struct
  {
     int var1;
     int var2;
   }
};

Das struct sorgt dafür dass die Speicheranordnung mit dem Array passt, aber da es keinen Namen hat kann man die Variablen wie vorher einfach über den Namen der Union ansprechen

mario01

Ich habe jetzt ein bisschen getestet sogar mit drei Variablen und komme nun mit der Sache klar.


Nun möchte ich den nächsten Schritt gehen und versuchen das ganze mit FHEM zu verbinden.

Go Up