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
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