/*
 * I2C-Scanner fuer ESP32
 * -----------------------
 * Zweck: Pruefen, ob die HUSKYLENS 2 (oder ein anderes I2C-Geraet)
 *        ueberhaupt am I2C-Bus antwortet.
 *
 * Warum dieser Test?
 *   Wenn im Hauptprogramm staendig "HuskyLens 2 nicht gefunden" erscheint,
 *   liegt das FAST IMMER an der Hardware (Verkabelung / Stromversorgung),
 *   nicht am Programm. Dieser Scanner trennt beide Faelle sauber:
 *
 *     -> Scanner findet 0x32   = Verkabelung/Strom OK, Fehler liegt im Programm.
 *     -> Scanner findet NICHTS = Verkabelung, Pins, Masse oder Stromversorgung
 *                                pruefen (siehe Checkliste unten).
 *
 * Die HUSKYLENS 2 meldet sich im I2C-Modus auf der Adresse 0x32.
 *
 * Wichtig bei der HUSKYLENS 2:
 *   - Sie braucht mehr Strom, als die I2C-Pins des ESP32 liefern koennen!
 *     -> Kamera zusaetzlich ueber ihren eigenen USB-C-Anschluss mit Strom
 *        versorgen (Netzteil/Powerbank).
 *   - Gemeinsame Masse (GND) zwischen ESP32 und Kamera nicht vergessen.
 *   - Im Kamera-Menue muss "Protocol Type" auf I2C stehen (ist Standard).
 *
 * Anschluss (Standard ESP32-WROOM / DevKit):
 *   SDA -> GPIO 21
 *   SCL -> GPIO 22
 *   GND -> GND
 *   (Bei ESP32-S3 / -C3 ggf. andere Pins! Dann I2C_SDA / I2C_SCL unten anpassen.)
 *
 * Nach dem Hochladen: Seriellen Monitor mit 115200 Baud oeffnen.
 */

#include <Wire.h>

#define I2C_SDA 21   // ggf. an euer Board anpassen
#define I2C_SCL 22   // ggf. an euer Board anpassen

void setup() {
  Serial.begin(115200);
  delay(500);

  Wire.begin(I2C_SDA, I2C_SCL);

  Serial.println("=================================");
  Serial.println("   I2C-Scanner fuer ESP32");
  Serial.println("=================================");
  Serial.println("Gesucht wird u.a. die HUSKYLENS 2 auf Adresse 0x32.");
  Serial.println();
}

void loop() {
  byte gefunden = 0;

  Serial.println("Scanne I2C-Bus ...");

  for (byte adresse = 1; adresse < 127; adresse++) {
    Wire.beginTransmission(adresse);
    byte fehler = Wire.endTransmission();

    if (fehler == 0) {
      gefunden++;
      Serial.print("  -> Geraet gefunden auf Adresse 0x");
      if (adresse < 16) Serial.print("0");
      Serial.print(adresse, HEX);

      if (adresse == 0x32) {
        Serial.print("   <== das ist die HUSKYLENS 2!");
      }
      Serial.println();
    }
  }

  if (gefunden == 0) {
    Serial.println("  Kein I2C-Geraet gefunden!");
    Serial.println("  Bitte pruefen:");
    Serial.println("   1. HUSKYLENS 2 ueber eigenen USB-C mit Strom versorgt?");
    Serial.println("   2. SDA/SCL richtig verbunden (nicht vertauscht)?");
    Serial.println("   3. Gemeinsame Masse (GND) zwischen ESP32 und Kamera?");
    Serial.println("   4. Richtige Pins fuer euer ESP32-Board eingestellt?");
    Serial.println("   5. Am Kamera-Menue Protocol Type = I2C?");
  } else {
    Serial.print("  Fertig. ");
    Serial.print(gefunden);
    Serial.println(" Geraet(e) gefunden.");
  }

  Serial.println();
  delay(3000);
}
