Sensor si7210 Sensor Daten Auswertung

Kann mir jemand helfen. Ich will die Daten des Sensors über I2c analog oder digital in der Konsole auszugeben. Verwende Visual Studio Code, C++, wäre dringen, danke
Datenblatt: https://docs.rs-online.com/674e/0900766b815e9b5c.pdf

#include <Wire.h>
#include <Arduino.h>

#define SI7210_ADDRESS 0x30
#define SI7210_REGISTER 0xC1
#define OUT_PIN 33
#define V_REF 5.0

void scanI2CDevices();
int16_t readSensorData();
float convertToVoltage(int16_t);

void setup() {
Serial.begin(9600);
delay(50);

Wire.begin();
Serial.println("\nI2C Scanner: Suche nach I2C Geräten...");
scanI2CDevices();
}

void loop() {

int analogValue = analogRead(OUT_PIN);
float analogVoltage = (analogValue / 4095.0) * V_REF;

int16_t sensorValueI2C = readSensorData();
float digitalVoltage = convertToVoltage(sensorValueI2C);

Serial.print("Analog OUT-Pin Spannung: ");
Serial.print(analogVoltage);
Serial.println(" V");

Serial.print("Digital I2C Spannung: ");
Serial.print(digitalVoltage);
Serial.println(" V");

delay(1000);
}

void scanI2CDevices() {
byte error, address;
int devicesFound = 0;

for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0) {
  Serial.print("I2C Gerät gefunden an Adresse 0x");
  if (address < 16) Serial.print("0");  
  Serial.println(address, HEX);
  devicesFound++;
} else if (error == 4) {
  Serial.print("Fehler an Adresse 0x");
  if (address < 16) Serial.print("0");  
  Serial.println(address, HEX);
}

}

if (devicesFound == 0) {
Serial.println("Keine I2C Geräte gefunden\n");
}
}

int16_t readSensorData() {
Wire.beginTransmission(SI7210_ADDRESS);
Wire.write(SI7210_REGISTER);
Wire.endTransmission();

Wire.requestFrom(SI7210_ADDRESS, 2);
if (Wire.available() == 2) {
uint8_t highByte = Wire.read();
uint8_t lowByte = Wire.read();
return (highByte << 8) | lowByte;
}

return 0;
}

float convertToVoltage(int16_t sensorValue) {
const int maxValue = 8192;
return (sensorValue / (float)maxValue) * V_REF;
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Außerdem formatiere den Code bitte ordentlich. Strg+T in der IDE hilft Dir dabei.
Das kannst Du auch noch nachträglich ändern.

Welche IDE verwendest Du und welchen Arduino?
Wo klemmt es denn und wieso ist es dringend?

Gruß Tommy

Der Sensor scheint ein digitales Signal über I2C zu senden, das du digital auslesen möchtest. Der Pin 33 ist für eine analoge Spannungsmessung gedacht, aber wenn der Sensor nur digitale Signale liefert, könntest du diese Messung möglicherweise weglassen, wenn du ausschließlich digitale Daten benötigst.

#include <Wire.h>
#include <Arduino.h>

#define SI7210_ADDRESS 0x31      // Überprüfe die Adresse
#define SI7210_REGISTER 0xC0     // Korrigiertes Register
#define OUT_PIN 33               // Optional für Analog-Messungen
#define V_REF 5.0

void scanI2CDevices();
int16_t readSensorData();
float convertToVoltage(int16_t sensorValue);

void setup() {
  Serial.begin(9600);
  delay(50);

  Wire.begin();
  Serial.println("\nI2C Scanner: Suche nach I2C Geräten...");
  scanI2CDevices();
}

void loop() {
  // Optionale analoge Spannungsmessung
  int analogValue = analogRead(OUT_PIN);
  float analogVoltage = (analogValue / 4095.0) * V_REF;

  // Digitale Daten via I2C auslesen
  int16_t sensorValueI2C = readSensorData();
  float digitalVoltage = convertToVoltage(sensorValueI2C);

  // Analoge Ausgabe
  Serial.print("Analog OUT-Pin Spannung: ");
  Serial.print(analogVoltage);
  Serial.println(" V");

  // Digitale Ausgabe
  Serial.print("Digital I2C Spannung: ");
  Serial.print(digitalVoltage);
  Serial.println(" V");

  delay(1000);
}

void scanI2CDevices() {
  byte error, address;
  int devicesFound = 0;

  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C Gerät gefunden an Adresse 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
      devicesFound++;
    } else if (error == 4) {
      Serial.print("Fehler an Adresse 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
    }
  }

  if (devicesFound == 0) {
    Serial.println("Keine I2C Geräte gefunden\n");
  }
}

int16_t readSensorData() {
  Wire.beginTransmission(SI7210_ADDRESS);
  Wire.write(SI7210_REGISTER);  // Sende das Register, das ausgelesen werden soll
  Wire.endTransmission();

  Wire.requestFrom(SI7210_ADDRESS, 2);  // Lese 2 Bytes (16 Bit)
  if (Wire.available() == 2) {
    uint8_t highByte = Wire.read();
    uint8_t lowByte = Wire.read();
    return (highByte << 8) | lowByte;  // Kombiniere die beiden Bytes
  }

  return 0;  // Rückgabewert 0, falls keine Daten verfügbar
}

float convertToVoltage(int16_t sensorValue) {
  const int maxValue = 8192;   // Beispielwert für die maximale Sensorausgabe, je nach Kalibrierung
  return (sensorValue / (float)maxValue) * V_REF;
}

Hallo, vielen Dank für die Rückmeldungen. Hab inzwischen den code bisschen geändert. Lese jetzt immer das Magnetfeld aus(reicht für meinen Zweck). bekomme auch einen Wert, jedoch immer danach eine Fehlermeldung. Sprich die erste Abfrage funktioniert, jedoch die folgenden Abfragen nicht mehr:

Code:#include <Wire.h>
#include <Arduino.h>

#define SI7210_REG_ADDR_HREVID 0xC0
#define SI7210_REG_ADDR_DSPSIGM 0xC1
#define SI7210_REG_ADDR_DSPSIGL 0xC2

#define SLAVEWRT 0x30

void resetI2CBus() {
Wire.end();
delay(100);
Wire.begin();
Wire.setClock(100000); // Erneutes Setzen der I2C-Frequenz auf 100 kHz
}

void setup() {
Wire.begin();
Wire.setClock(100000);
Serial.begin(115200);

// I2C Scanner, IC found at 0x33
byte error, address;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
delay(100);
error = Wire.endTransmission();
delay(100);

if (error == 0) {
  Serial.print("I2C device found at address 0x");
  if (address < 16) Serial.print("0");
  Serial.print(address, HEX);
  Serial.println("  !");
}

}

// Read ChipID
Wire.beginTransmission(SLAVEWRT);
delay(100);
Wire.write(SI7210_REG_ADDR_HREVID);
Wire.endTransmission();
delay(100);

if (Wire.requestFrom(SLAVEWRT, 1) != 1) {
Serial.println("Fehler beim Lesen. I2C-Bus wird neu initialisiert.");
resetI2CBus();
}

Wire.requestFrom(SLAVEWRT, 1);
delay(100); // read 1 byte from 0x33
byte chipID = Wire.read() >> 4;

Serial.print("ChipID: ");
Serial.println(chipID, DEC); // ChipID should be 1
delay(100);
}

void loop() {
int16_t field; // 16-bit integer for the magnetic field
float result;
float scale = 204.7f;

// Read DSPSIGM (High Byte)
Wire.beginTransmission(SLAVEWRT);
delay(100);
Wire.write(SI7210_REG_ADDR_DSPSIGM);
Wire.endTransmission(false);
delay(100);
if (Wire.requestFrom(SLAVEWRT, 1) != 1) {
Serial.println("Fehler beim Lesen. I2C-Bus wird neu initialisiert.");
resetI2CBus();
}

Wire.requestFrom(SLAVEWRT, 1);
delay(100);
byte highByte = Wire.read();
delay(100);

Wire.beginTransmission(SLAVEWRT);
delay(100);
Wire.write(SI7210_REG_ADDR_DSPSIGL);
Wire.endTransmission(false);
delay(100);
if (Wire.requestFrom(SLAVEWRT, 1) != 1) {
Serial.println("Fehler beim Lesen. I2C-Bus wird neu initialisiert.");
resetI2CBus();
}

Wire.requestFrom(SLAVEWRT, 1);
delay(100);
byte lowByte = Wire.read();
delay(100);

field = ((highByte & 0x7F) << 8) | lowByte;
field -= 16384;

result = ((float)field) * scale / 16384;

Serial.print("Magnetic Field (mT): ");
Serial.println(result);

delay(500);
}

Ausgabe:
[ 87585][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error 263
Fehler beim Lesen. I2C-Bus wird neu initialisiert.
Magnetic Field (mT): -204.70
[ 89999][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error 263
Fehler beim Lesen. I2C-Bus wird neu initialisiert.

Hey, danke für die Rückmeldung. Hab bei @aliarifat794 geantwortet, bzw. meinen neuen Stand präsentiert.

Das, was ich Dir über Codetags und Formatierung des Codes gesychrieben habe, hast Du aber geflissentlich ignoriert, die Fragen auch.
So wird das nichts werden.

Gruß Tommy

Sry/:
Benutze Visual Studio Code und den ESP32 als Steuerelement.
Bräuchte es für die Schule, für ein Projekt.

#include <Wire.h>
#include <Arduino.h>

#define SI7210_REG_ADDR_HREVID 0xC0
#define SI7210_REG_ADDR_DSPSIGM 0xC1
#define SI7210_REG_ADDR_DSPSIGL 0xC2

#define SLAVEWRT 0x30

void resetI2CBus()
{
  Wire.end();
  delay(100);
  Wire.begin();
  Wire.setClock(100000);
}

void setup()
{
  Wire.begin();
  Wire.setClock(100000);
  Serial.begin(115200);

  byte error, address;
  for (address = 1; address < 127; address++)
  {
    Wire.beginTransmission(address);
    delay(100);
    error = Wire.endTransmission();
    delay(100);

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
    }
  }

  // Read ChipID
  Wire.beginTransmission(SLAVEWRT);
  delay(100);
  Wire.write(SI7210_REG_ADDR_HREVID);
  Wire.endTransmission();
  delay(100);

  if (Wire.requestFrom(SLAVEWRT, 1) != 1)
  {
    Serial.println("Fehler beim Lesen");
    resetI2CBus();
  }

  Wire.requestFrom(SLAVEWRT, 1);
  delay(100); // read 1 byte from 0x33
  byte chipID = Wire.read() >> 4;

  Serial.print("ChipID: ");
  Serial.println(chipID, DEC);
  delay(100);
}

void loop()
{
  int16_t field;
  float result;
  float scale = 204.7f;

  // Read DSPSIGM (High Byte)
  Wire.beginTransmission(SLAVEWRT);
  delay(100);
  Wire.write(SI7210_REG_ADDR_DSPSIGM);
  Wire.endTransmission(false);
  delay(100);
  if (Wire.requestFrom(SLAVEWRT, 1) != 1)
  {
    Serial.println("Fehler beim Lesen.");
    resetI2CBus();
  }

  Wire.requestFrom(SLAVEWRT, 1);
  delay(100);
  byte highByte = Wire.read();
  delay(100);

  Wire.beginTransmission(SLAVEWRT);
  delay(100);
  Wire.write(SI7210_REG_ADDR_DSPSIGL);
  Wire.endTransmission(false);
  delay(100);
  if (Wire.requestFrom(SLAVEWRT, 1) != 1)
  {
    Serial.println("Fehler beim Lesen.");
    resetI2CBus();
  }

  Wire.requestFrom(SLAVEWRT, 1);
  delay(100);
  byte lowByte = Wire.read();
  delay(100);

  field = ((highByte & 0x7F) << 8) | lowByte;
  field -= 16384;

  result = ((float)field) * scale / 16384;

  Serial.print("Magnetic Field (mT): ");
  Serial.println(result);

  delay(500);
}

Bei der Ausgabe kommt dieser Fehler: [ 87585][E][Wire.cpp:499] requestFrom(): i2cWriteReadNonStop returned Error 263
Fehler beim Lesen. I2C-Bus wird neu initialisiert.
Magnetic Field (mT): -204.70

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