Arduino I2C versagt seinen Dienst

Hallo liebe Community,
ich möchte einen Arduino mit einem Raspberry pi über I2C verbinden. Eigentlich keine Hexerei. Nach Anschluss (erstmal mit Level Converter) und entsprechender Programmierung fand der Raspberry den Arduino nicht. Selbst mit i2cdetect war kein Device zu finden. Selbst ohne Level Converter nicht. Dann habe ich den Raspberry mit einem BH 1750 ausprobiert und habe eine Adresse und auch Daten erhalten. Also liegt das Problem im Arduino. Nach dem Umbau des BH1750 auf den Arduino waren diesem keine Werte mehr zu entlocken. Ich habe jetzt schon einiges in Foren gelesen und auch ausprobiert, leider ohne Erfolg. Selbst mit den diskutierten PullUp Widerständen. Leider alles ohne Erfolg.

Verkabelung:

Arduino --> BH1750
5V VCC
GND GND
A5 SCL
A4 SDA
GND ADDRESS

Folgender Sketch:

#include <Wire.h>
#include <AS_BH1750.h>

AS_BH1750 sensor;

void setup() {
  Serial.begin(9600);
  Serial.println("** SETUP **");
  boolean Init = false;
  Init = sensor.begin();
  Serial.println(Init);
  //if(!sensor.begin()) {
  //  Serial.println("BH1750 nicht initilisiert!");
  //  while(true);
  //} else {
  //  Serial.println("BH_1750 gefunden!");
  //}

}

void loop() {
  Serial.println("** Loop **");
  float lux = sensor.readLightLevel();
  Serial.println("Lichteinfall: " + String(lux) + " lx");
  delay(1000);
}

Bis zum println "Setup" kommt er. Dann tut sich nichts mehr.

Wer hat eine Idee? Danke

Du musst dem Arduino sagen, dass er Slave sein soll und auf welche I2C-Adresse er hören soll. Info.
z.B.:

Wire.begin(4);

teilt ihm das mit, incl. der Aderesse 4.

Gruß Tommy

Und im aktuellen Fall ist er der Master und muss den BH1750 aufrufen.

Das macht er bei mir mit:

lightMeter.begin();

Das sollte doch im Beispiel der Library zu sehen sein.

Zeig doch mal einen Link zur Library.

Hallo Zusammen,
danke für die Hinweise. Dies mit der Slave-Addresse habe ich bei dem Versuch mit dem Raspberry ja gemacht. Ich habe jetzt in dem BH1750 Sketch nochmal Wire.begin(); hinzugefügt. In diesem Sketch ist der Arduino ja der Master, also ohne Adresse. Alles ohne Erfolg. Der Start des Sensors ist in der Zeile Init = sensor.begin();. Ich hatte in der Library nachgeschaut. begin() liefert ein Boolean. Dies soll die Variable Init aufnehmen und dann mit Serial.print(Init); ausgeben. So weit kommt der der Sketch aber gar nicht.

Verstehe ich das richtig, dass Du den Arduino als Master gegenüber dem Sensor und als Slave gegenüber dem Raspi betreiben willst? Ich glaube das geben die Libs nicht her.

Da könntest Du den Arduino ja auch weg lassen und den Sensor vom Raspi aus abfragen.

Gruß Tommy

Dann nimm mal den Address-Pin vom GND runter.
In einem Beispiel wird der auch frei gelassen.

Tommy, Slave war vorher am Raspi.
Jetzt ist er nur Master.

Also keinen Raspi mehr? Oder doch nur ein Teilversuch?

Irgendwie ist das unklar.

Gruß Tommy

Tommy56:
Ich glaube das geben die Libs nicht her.

Das immer wieder auftrende Drama ist folgendes;
Wire.begin(); in der Lib.begin() Methode!
Welches ein vorheriges Wire.begin(irgendwas); im Hauptprogramm "überschreibt"

Das ist das einzige Hindernis, gleichzeitig Master und Slave zu sein.

Ein Fall für die Streckbank!

So wie ich es rauslese, aktuell ohne Raspi.

Nur Master für den Sensor.
Und dieser macht normal keine Probleme. Ich habe selbst mehrer davon verbaut.

combie:
Das immer wieder auftrende Drama ist folgendes;
Wire.begin(); in der Lib.begin() Methode!
Welches ein vorheriges Wire.begin(irgendwas); im Hauptprogramm "überschreibt"

Das ist das einzige Hindernis, gleichzeitig Master und Slave zu sein.

Danke für die Info.

Gruß Tommy

Hallo Zusammen,
der Arduino soll nicht Master und Slave sein. Ich hatte vorher versucht den Raspberry mit dem Arduino per I2C zu verbinden. Der Raspberry fand den Arduino nicht, selbst mit dem Kommandozeilenbefehl i2cdetect nicht. Um Fehler auszuschalten habe ich den Raspberry mit dem BH1750 verbunden (ohne Arduino natürlich). Dies klappte auf Anhieb. Somit muss ich davon ausgehen, dass der Arduino das Problem ist. Deshalb habe ich den Sensor auf den Arduino umgebaut. Dies klappte dann nicht mehr.
Selbst mit dem Beispiel i2c scanner aus der Wire Library findet der Arduino den Sensor nicht.

@ combie Ich habe den zu Anfang geposteten Sketch zunächst ohne Wire.begin() geschrieben und dann noch mal zur Sicherheit mit Wire.begin() beides ohne Erfolg. Bus meldet sich einfach nicht. der Arduino friert ein.

Egal was ich dem i2c des Arduino verkaufe, ich bekomme keine Antworten vom Bus. Ich muss davon ausgehen, dass dieser Arduino irgendein Problem mit seinem I2C Bus hat. Warum auch immer. Verzweifel!!!

Hast du mal meinen Post #7 gelesen ?

Bus meldet sich einfach nicht.

Wire meldet sehr wohl Fehler an die Anwendung.
Viele Libs werten diese Meldungen leider nicht aus.

Da musst/darfst/kannst du dann händisch nacharbeiten.

der Arduino

Leider sagst du nicht welcher Arduino!
) oder habe ich das übersehen? (

Hintergrundwissen zu I2C

@HotSystems welchen meintest du? #7 ist von Tommy56. Wenn du das mit lightmeter.begin() meinst, dann habe ich das bei mir in Zeile 10 Init = sensor.begin();
@tommy56 Der Arduino ist derzeit nur zum Test des I2C am BH1750. Damit läuft es nicht. Wie eben gesagt selbst der Beispielsketch aus der i2c_scanner der Wire Library friert ein.

@combie Es ist ein Arduino UNO Rev3

Zeig doch mal ein Foto deines Aufbaus.
So dass alles zu erkennen ist.

Hallo Zusammen,
mal drei Bilder, ich hoffe man kann den Aufbau erkennen :slight_smile:
Die PullUps sind später dazu gekommen. Ohne Erfolg

Du hast die Widerstände im Schaltbild falsch angeschlossen.
Steckbrett ist ok.

HotSystems:
Du hast die Widerstände im Schaltbild falsch angeschlossen.
Steckbrett ist ok.

Stimmt war etwas flott unterwegs

bastler371:
Stimmt war etwas flott unterwegs

An deinen Fotos ist kein auffälliger Fehler zu entdecken.

Das einzige, was ich mir jetzt noch vorstellen kann, dein Sensor ist nicht für 5Volt geeignet.

Poste doch mal einen Link vom Lieferanten.