ich hab gerade angefangen ein bisschen mit den oben genannten Geräten rum zu spielen. Ich wollte die Entfernung durch den TOF Entfernungsmesser einen Abstand auf dem SH1107 in mm anzeigen lassen. Mein Kenntnisstand ist nicht gerade groß, und ich bin jetzt nach längerem abklappern durch euer Forum, dem posten meines Problems im Computerbase-Forum unter Einplatinencomputer, und den Codevorschläge durch ChatGPT einfach nicht weitergekommen.
Ich habe festgestellt dass ich nicht weiter als Zeile 32, also display.begin komme. Weder bekomme ich eine Anzeige im Display, noch bekomme ich eine weitere prints im Serial Monitor(SMon). Mit zwei unabhängig voneinander getrennten instructions hab ich beide Geräte getestet, das Display zeigt was an, und der TOF gibt was im SMon aus. Beide sind über I2C angeschlossen und holen sich auch 5V vom Nano, der wiederum via USB angeschlossen ist.
Ich würde mich sehr freuen wenn ihr mir da weiter helfen könnt. Grüße
#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SH110X.h"
#include "Adafruit_VL53L0X.h"
/*-------------------- Variablen --------------------*/
/*
#define // Platzhalter
*/
/*-------------------- Display --------------------*/
Adafruit_SH1107 display = Adafruit_SH1107(64, 128, &Wire, -1);
/*-------------------- Rangemeter --------------------*/
Adafruit_VL53L0X sensor = Adafruit_VL53L0X();
void setup() {
/*-------------------- Global --------------------*/
Serial.begin(115200);
Serial.println("Serielle Schnittstelle wird geöffnet");
while (! Serial) {delay(1);}
Wire.begin();
Serial.println("Suche Display");
delay(250);
/*-------------------- Display --------------------*/
display.begin(0x3C, true); // hier kommt der Serial Monitor nicht weiter
display.clearDisplay();
Serial.println("Display Gefunden"); //mit dieser Zeile hab ich versucht zu sehen ob Code weiter geht
display.display();
delay(250);
display.clearDisplay();
display.setRotation(1);
display.setTextSize(1);
display.drawPixel(100, 100, SH110X_WHITE);
display.display();
delay(250);
/*-------------------- Rangemeter --------------------*/
Serial.println("Adafruit VL53L0X test.");
if (!sensor.begin(0x29, false, &Wire)) {
Serial.println(F("Failed to boot VL53L0X")); //wird schon nicht mehr im Serial Monitor angezeigt
while (1)
;
}
Serial.println(F("VL53L0X API Continuous Ranging example\n\n"));
sensor.startRangeContinuous();
}
void loop() {
/*-------------------- Rangemeter --------------------*/
if (sensor.isRangeComplete()) {
/*-------------------- Display --------------------*/
display.firstPage();
display.setDrawColor(1);
display.print(sensor.readRange());
Serial.print(sensor.readRange()); //sollte auch im SMon die Entfernung anzeigen
display.sendBuffer();
}
}
Mittlerweile hab ich noch die Adressen durch ADafruit TestBed I2C_Scan gecheckt und es wurden beide bestätigt. Vielleicht auch noch um das als zusätzliche Frage in den Raum zu werfen: Muss ich etwas zusätzlich in den Code einfügen damit beide Geräte über einen I2C Zugang laufen?
Ich würde mich sehr freuen wenn ihr mir weiter helfen könntet.
Grüße
der nächste Neue mit einem wahrscheinlich einfachen Problem
Die Ada mit SH1107 hat bei mir auch nicht funktioniert.
Was ist das für OLED ?
Wenn 0,98" dann kann sein das der Treiber ist SSD1306.
Meistens die 1,3" haben den SH aber nur wen das Display I²C ist
Könnte auch sein daß der I2C Bus zu lange ist, bzw die Pullupwiderstände zu klein sind.
Der NANO arbeitet mit 5V,
der V53L0X arbeitet mit max 3,6V (auch auf dem I2C Bus)
der SH1107 hab ich nichts explizites gefunden, da die Versorgungsspannung 3,3V sein soll wird der I2C Bus aucha uf dieser Spannung laufen.
Darum bräuchtest Du einen I2C Pegel Wandler. Auf der 3,3V Seite sollte 2,2kOhm ( 1,5kOhm) Pullupwiderstand und auf der Nano 5V Seite müßten 4,7kOhm reichen.
Da ich Deine Module nicht kenne weiß ich nicht ob auf einem von denen Level Shifter oder Pullupwiderstände verbaut sind. Sind diese vorhanden müssen gegebenenfalls die Widerstandswerte angepaßt werden.
Hi Fony und danke für die Antwort.
Die U8g2 und -glib habe ich schon probiert aber da es das 1,3" Display ist mit 128x64 Pixel, gab es dort leider nicht die Treiber Das Display hat ja, wie geschrieben, mit den Adafruit Beispielen funktioniert. Erst wenn 2 I2C Geräte angeschlossen sind dann nicht mehr.
Die Teile sind von M5 und es steht 5 V drauf. Dementsprechend hatte ich sie so auch angeschlossen. Beide haben auch unabhängig voneinander funktioniert mit dieser Verkabelung.
Was genau ist der Unterschied zwischen normalen Widerständen und Pullupwiderständen? Und bräuchte ich sie immer noch wenn 5 V ja zur Funktion führen?
Da ich nicht zu gut Bescheid weiß welche Libs später im Code benötigt werden habe ich sie einfach mit aus den Beispielen übernommen.
Zu guter Letzt möchte ich noch anmerken das auf dem OLED der Hinweis drauf steht dass die 0x3C Adresse als 7-bit betrieben wird. Kommt da vielleicht das Problem her?
Du bist dir sicher dass das OLED mit SH1107 ist, einen 1,3" 128x64 mit SH1107 ist mir nicht bekannt, alle was mir bekannt sind haben SH1106 teilweise mit SPI + I²C drauf, zeige mall link zum Display damit nicht im dunklem laufe, Danke.
Der Unterschied ist daß Pullupwiderstände Widerstände sind die ein Signal auf eine Spannung ( zB 5V oder 3,3V ) zieht. Wenn das Signal nicht durch einen Ausgang auf Masse gezogen wird ist das Signal 5 bzw 3,3V bzw HIGH.
Pullupwiderstände beschreibt nur wie die Widerstände eingesetzt werden. Gleich wie Vorwiderstände bei LED.
Ok beide Module können mit 5V Betriebsspannung versorgt werden.
Bist Du sicher daß die beiden Module 5V auf den Datenleitungen SDA und SCL vertragen?
Mehrere I2C Module am I2C BUS bzw längere Kabel benötigen mehr Strom um schnell genug von LOW auf HIGH zu wechseln. diesen Strom stellt der Pullupwiderstand zur Verfügung. Ist der Widerstand zu groß erreicht das Signal nach einem LOW nicht mehr schnell genug den HIIGH Pegel um ein HIGH darstellen zu können. Es werden statt L und H dann LL gelesen und die Slaves erkennen nicht mehr daß sie angesprochen werden. Also wenn der I2C mit einem Modul nahe am Arduino funktioniert heißt es noch nicht daß der Bus auch mit 2 Modulen und etwas längeren Kabeln funktioniert.
Kannst Du mit dem I2C Scanner Sketch die Adressen von beiden Modulen gleichzeitig sauber auslesen ?
Also der erste Schaltplan mit dem VL53L0X hat eine Level Shifter auf dem Modul und kann darum mit einem 5V I2C Master wie dem NANO verbunden werden.
Das M5 OLED Modul ist für ein System gebaut, das mit 3,3V Signalspannung arbeitet ( M5Stack verwedet einen ESP32) Darum brauchst Du für dieses OLED einen Level Shifter ansonsten machst Du es auf die Dauer kaputt.
Grüße Uwe
Wenn ich vielleicht noch mal nachfragen dürfte, ist der nicht vorhandenen Pull-Up Widerstand der Grund weshalb der Code für die Nutzung beider Geräte beim Initiieren nicht weiter kommt? Sie bleiben ja trotzdem beide nutzbar wenn sie einzeln angesprochen werden, und auch am gleich Port hängen.
Ich hab noch mal rum getestet, eine schlankere Instruction geschrieben, so wie Pullup Widerstände in Höhe von 2kOhm eingefügt. Bei der Instruction hab ich dann festgestellt sobald ich die Variable der ToF Sensor Klasse zuordne, dass ich in mein oben benanntes Problem springe, also nach display.begin nichts weiter mehr passiert. Mittlerweile hab ich mich entschieden die Werte über den Serial Monitor anzeigen zu lassen bzw. über PuTTY dann auch zu loggen. So umgehe ich die Problematik mit dem nicht funktionierenden Display.