JUMO CEROS S01 M I²C Sensor auslesen

Hallo,

ich möchte von dem genannten Sensor den Druck und die Temperatur per I²C auslesen und seriell mitschreiben. Die Hardware läuft soweit, doch ich habe keine Ahnung wie ich Werte von dem Sensor bekomme, kann mir bitte jemand behilflich sein?

Hier das Datenblatt.

https://www.jumo.net/attachments/JUMO/attachmentdownload?id=591714

Vielen Dank

Woher weißt du, dass die Hardware funktioniert ?

Ab Seite 8 im Datenblatt ist doch beschrieben, wie du die I2C-Schnittstelle ansprechen musst.

Bei I²C starte ich mit einem I²C-Scanner, um zunächst die Anschlüsse, die Funktion der PullUp-Widerstände zu überprüfen und letztlich die Adresse zu ermitteln. Beispielsweise Arduino MultiSpeed I2C Scanner.

Da ein I²C-Scann die Adresse 0x28 ergeben hat, gehe ich von der funktionierenden Hardware aus.

Ehrlich gesagt, verstehe ich von der Schnittstellenbeschreibung nicht ganz so viel.

Hier zum Beispiel einer meiner Versuche:

#include <Wire.h>

#define BAUDRATE 9600 // Serial baud rate
#define I2C_ADDR 0x28 // Default LMI address (A0=A1=0)
#define I2C_CLOCK 100000 // May also try 400000 or 1000000
#define CMD_GET_DATA 0x51// “Blocking read” command

void setup() {

  Serial.begin( BAUDRATE ); // Configure serial output

  delay( 200 ); // Wait 200 ms

  Wire.begin(); // Configure I2C
  Wire.setClock( I2C_CLOCK ); // Set I2C clock rate
  Wire.beginTransmission( I2C_ADDR ); // Start I2C packet
  Wire.write( CMD_GET_DATA ); // Add command byte
  Wire.endTransmission(); // Finalize packet

}

void loop() {

  short data;


  Wire.requestFrom( I2C_ADDR, 2, 3 ); // Read two bytes from I2C

  if( Wire.available() >= 2 ) {

    delay( 200 ); // Wait 200 ms
    data = Wire.read(); // read low byte
    //data |= ((short)Wire.read())<<8; // read high byte
    Serial.println( data ); // print the reading

  }
}

Bravo, erste Hürde genommen.

Ich verstehe das so, daß zunächst drei Byte als Anforderung "ich möchte einen Druckmeßwert haben" geschickt werden müssen. Erst danach kann der Wert gelesen werden. Mein ungetesteter Vorschlag dazu:

void loop() 
{
  uint8_t a = 0, b = 0, c = 0;
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(0x2E);
  Wire.write(0x21);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADDR, 3);  // drei Bytes holen
  a = Wire.read();
  b = Wire.read();
  c = Wire.read();
  Serial.print( " 0x");
  Serial.print( a, HEX);
  Serial.print( " 0x");
  Serial.print( b, HEX);
  Serial.print( " 0x");
  Serial.print( c, HEX);
  Serial.println();
  delay(1000);
}

Vielen Dank, das hat mir sehr geholfen.

Nun hänge ich daran die Daten zu interpretieren, hier mein bisheriger Code:


#define BAUDRATE 9600
#define I2C_ADDR 0x28
#define I2C_CLOCK 100000


void setup() {

  Serial.begin( BAUDRATE );
  Wire.begin();
  Wire.setClock( I2C_CLOCK );

}

void loop() 
{
  get_pressure();
  get_temperature();
  delay(1000);
}

void get_pressure() 
{
  uint8_t a = 0, b = 0, c = 0;
  Wire.beginTransmission( I2C_ADDR );
  Wire.write(0x2E);
  Wire.write(0x21);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADDR, 3);
  a = Wire.read();
  b = Wire.read();
  c = Wire.read();
  Serial.print( " a=");
  Serial.print( a, HEX);
  Serial.print( " b=");
  Serial.print( b, DEC);
  Serial.print( " c=");
  Serial.print( c, DEC);
  Serial.println();
}

void get_temperature() 
{
  uint8_t d = 0, e = 0, f = 0;
  Wire.beginTransmission( I2C_ADDR );
  Wire.write(0x2E);
  Wire.write(0x1D);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(I2C_ADDR, 3);
  d = Wire.read();
  e = Wire.read();
  f = Wire.read();
  Serial.print( " d=");
  Serial.print( d, HEX);
  Serial.print( " e=");
  Serial.print( e, DEC);
  Serial.print( " f=");
  Serial.print( f, DEC);
  Serial.println();
}

Ausgabe:
a=2E b=22 c=254
d=2E e=67 f=220
a=2E b=23 c=2
d=2E e=67 f=226
a=2E b=22 c=254
d=2E e=67 f=222

Nun müsstest du die bytes zusammensetzen. Offensichtlich kommt der Druck wert zB als 16 Bit Integer. Also zb so

uint16_t pressure = (uint16_t)(b<<8) | (uint_16_t)(c);

Denn b ist ja offensichtlich das höherwertige byte [8...15] und c das niederwertige [0...7]. Deshalb b um 8 bits nach links geschoben und dann mit c verodert.

Temperatur dann entsprechend.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.