I2C Kommunikation mit Waveshare Laser Range Sensor (B) auf ESP32

Hallo zusammen,

ich habe mich jetzt viel durch Foren durchgearbeitet und hier auch das gleiche Thema ohne Lösung gefunden. Viele Antworten lauten: machs doch einfach mit UART statt mit I2C. ...geht aber nicht immer und aus meiner Sicht auch nicht wirklich elegant, aber das ist Geschmackssache.

Ich möchte hier meine Lösung teilen, die für mich funktioniert hat (zu verstehen als Demonstrator)
Das Skript führt zuerst ein Scan durch auf dem I2C durch nach aktiven Sensoren etc. Da sollte der Sensor mit 0x08 auftauchen. Danach hole ich mir ein paar Daten vom Sensor und stelle diese alle Sekunde dar. Vielleicht hilft es dem ein oder anderen weniger suchen zu mussen :slight_smile:

Here it is:

//Der Waveshare TOF Laser Range Sensor (B) muss zuerst über die Software
//Waveshare_TOFAssistant von UART uaf I2C umgestellt werden. Die Schnittstelle
//wird nicht automatisch umgeschalten. Zurückschalten ist über den interface mode
//in 0x0C [0-2] möglich. 
//siehe https://www.waveshare.com/wiki/TOF_Laser_Range_Sensor_(B)#.E3.80.90Range_Precision.E3.80.91 

#include <Wire.h>

#define I2C_ADDRESS 0x08  // Default I2C address of the sensor
#define SDA_PIN 21
#define SCL_PIN 22
uint8_t Anzahl = 0;
uint32_t distance = 0;
uint16_t disStatus = 0;
uint16_t signStrength = 0;
uint8_t presicion = 0;

void setup() {
  Serial.begin(115200);   // Initialize serial communication
  while (!Serial);
  delay(3000);

  Serial.println("starte...");
   // Initialisiere I2C
  Wire.begin(SDA_PIN, SCL_PIN);
  Wire.setClock(100000);        // 100kHz I2C-Takt

  Serial.println("wait for booting devices...");
  delay(3000);

  //Scanne I2C nach Geräten
  Serial.println("\nI2C Scanner");
  for (uint8_t address = 1; address < 127; ++address) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Anzahl++;
      Serial.print("I2C device found at address 0x");
      Serial.println(address, HEX);
    }
  }
  Serial.print("Scan beendet. Gefundene Geräte: ");
  Serial.print(Anzahl);
  Serial.println(".");
}

void loop() {
  // Anfrage der Register 0x24 = Distanz
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(0x24);
  Wire.endTransmission(I2C_ADDRESS);
  // Auslesen der Antwort und zusammensetzen zu einer Zahl
  Wire.requestFrom(I2C_ADDRESS, 2);  // Request 2 bytes
  if (Wire.available() == 2) {
   distance = Wire.read() | (Wire.read() << 8);
  } else {
    distance = 0;
  }

  // Anfrage der Register 0x28 = Distanz Status und Signalstärke
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(0x28);
  Wire.endTransmission(I2C_ADDRESS);
 // Auslesen der Antwort
  Wire.requestFrom(I2C_ADDRESS, 1);  // Request 2 bytes
  if (Wire.available() == 1) {
    disStatus = Wire.read();
    // signStrength = Wire.read();
  } else {
    disStatus = 0;
    // signStrength = 99;
  }

  // Anfrage der Register 0x2C = prezision
  Wire.beginTransmission(I2C_ADDRESS);
  Wire.write(0x2C);
  Wire.endTransmission(I2C_ADDRESS);
  // Auslesen der Antwort
  Wire.requestFrom(I2C_ADDRESS, 1);  // Request 1 bytes
  if (Wire.available() == 1) {
    presicion = Wire.read() & 0x00FF;  // nur bits [0-7]
  } else {
    presicion = 0;
  }

  //Datenausgabe
  Serial.printf("Gemessene Distanz: %5d mm - Status: ", distance);
  if (disStatus == 0) {
    Serial.print("falsch");
  } else {
    Serial.print("ok");
  }
  Serial.printf(" - Präzision: %d mm\n", presicion);

  delay(1000);  // 1 Sekunde warten vor der nächsten Messung
}

Ausgabe wie folgt: 

starte...
wait for booting devices...

I2C Scanner
I2C device found at address 0x8
Scan beendet. Gefundene Geräte: 1.
Gemessene Distanz:  2592 mm - Status: ok - Präzision: 6 mm
Gemessene Distanz:  2611 mm - Status: ok - Präzision: 6 mm
Gemessene Distanz:  2600 mm - Status: ok - Präzision: 6 mm

Bitte korrigiere die Kommentare noch. Du fragst ein Register ab, keine Adresse.

Danke - da hast du recht :slight_smile: , habe ich gleich gemacht

1 Like

Warum führst Du eine Suche durch, wenn die I2C Adresse eh hardcodiert ist? Das habe ich nicht so ganz verstanden.

Hallo Kai,
In diesem Demonstratorcode spiele ich mit den Sensoren. Wenn du die Adresse verstellt hast, dann siehst du es einfach + wenn du mehrere Sensoren einsetzen möchtest, dann siehst du, ob auch alle da sind bzw. alle ich auf den gewünschten Adressen befinden. In meinem Zielcode werden mehrere Sensoren am I2C sein - da ists praktisch :slight_smile: - Scanner befindet sich im setup -> damit habe ich die Infos beim booten. Für das Ansprechen des einen, speziellen Sensors bauchst du den Scanner nicht - da hast du recht.
Gruß Matthias

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