[gelöst] Problem mit SPI Display und I2C sensor

Hallo,

ich benutze ein ST7789 SPI Display und einen ADS1115 Wandler mit fertigen Librarys.
Habe für den ADS schon andere Librarys getestet aber alle bleiben hängen.
Wenn ich die scripts einzeln laufen lasse geht alles.
Aber zusammen bleibt das Display dunkel. Man sieht zwar das es resettet aber nichts erscheint.
Habe gemerkt sobald der ADS den Wert abrufen soll mit,

int16_t val_0 = ADS.readADC(0);

bleibt alles hängen.

Ich habe das Problem in anderen Foren auch schon gefunden aber noch keine Lösung.
Anscheinend blockieren SPI und I2C sich wenn der eine abgerufen wird.

Kann da jemand helfen

Gruss
Stefan

Ja klar, wir helfen gern.
Nur dazu brauchen wir deinen kompletten Sketch.
Ich nutze selbst in vielen Projekten SPI Displays zusammen mit I2C Komponenten und habe noch nicht erlebt, das sich da was aufhängt, wenn alles richtig programmiert wurde.
Wichtig ist auch, welchen Controller du verwendest.

Hier mal der sketch,
hab jetzt von adafruit die ADS library wieder rein getan

#include <Adafruit_ST7789.h> // Hardware-spezifische Bibliothek für ST7789
#include <SPI.h>

#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

// Display
#define TFT_CS 5
#define TFT_RST 7
#define TFT_DC 4
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);





void setup() {
  Serial.begin(9600);
  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    while (1);
  }
  tft.init(240, 280); // Init ST7789 280x240
  tft.fillScreen(ST77XX_BLACK);
  tft.setRotation(2);
  tft.invertDisplay(true);

}

void loop() {
  int16_t adc0, adc1;
  float volts0, volts1;

  adc0 = ads.readADC_SingleEnded(0);
  //adc1 = ads.readADC_SingleEnded(1);
  //volts0 = ads.computeVolts(adc0);
  //volts1 = ads.computeVolts(adc1);

  // Display aktualisieren
  tft.setCursor(20, 20);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(2);
  tft.print("Voltage: ");
  tft.print(volts1,1);
  tft.println(" V");

  Serial.print("U = ");
  Serial.print(volts1,1);
  Serial.println(" V       ");
    
  delay(1000);  // 1 Sekunde warten
}

sobald die Zeile zum abholen der Werte auskommentiert wird geht alles beides
adc0 = ads.readADC_SingleEnded(0);

Und was genau heißt das jetzt ?
Geht oder geht nicht ?

Schau dir mal die Beispiele vom ADS an.
Gib mal Link zum Display und was für MCU wird ganutzt.

Wie fony schon schreibt, schau dir die Beispiele an und richte dich danach.
Mach nicht irgend was, was nicht der Library entspricht.
Und bitte beantworte alle Fragen.

Wen ich das gut im Gedechnis habe muss man die versterkung am ADS einstellen im Setup, sonst spint das Ding
Wolle hat schönen Beitrag drüber.
Am meinem alten Tablet link einstellen, bringt mich fast um, macht alles nur nicht das was soll :joy:

Wo bitte ist Wire.h?
Nicht alle Bibliotheken binden den ein.

Bei der Adafruit gib es ein default, die muss nicht eingestellt werden.
Und die hat das wire auch mit drin.
Und hier der Link von Wolle: ADS1115 - A/D-Wandler mit Verstärker • Wolles Elektronikkiste (wolles-elektronikkiste.de)

also, wenn die Zeile weg ist "adc0 = ads.readADC_SingleEnded(0);" und er keinen wert von I2C bus holt, geht der serielle Monitor und dann bekomme ich mit dem Serial monitor eine Anzeige "U = 0,0" und auf dem Display "Voltage: 0,0V" , zwar jetzt keine Werte aber es wird was angezeigt.

Mit wire.h habe ich auch schon probiert aber dann wird auch nichts angezeigt.

Wie gesagt wenn ich 2 programme mache, eins für das display und eins für den ADS mit serieller Ausgabe geht ja beides und es werden auch werte angezeigt so wie es sein soll, also hat es ja eigentlich auch nichts mit dem wire.h zu tun

ich kann nochmal versuchen die standart werde direkt rein zu schreiben.
Hab auch von Wolle das Beispiel genommen und das geht auch aber zusammen mit SPI Display eben nicht.

Wenn es ein problem mit den 2 programmen geben würde, denke ich würde ja keins funktionieren

hier im forum war auch so ein problem

Nochmal...beantworte alle Fragen !

Und dein Link zeigt leider das übliche Problem:
Es werden nicht alle Fragen beantwortet.

Der Sketch ist alles von den Beispielen der library’s die im example Ordner

Was meinst du noch für Fragen.

Die findest du in Post#2 und #5

Na und der Jenninger beatwortet auch nicht die Fragen.
Noch mall was für Display, was für "Arduino"?
Die meisten SPI Displays sind für 3,3V somit nicht für Uno R3, Nano R3, Mega 2560 geeignet für direkten Betrieb. Habe mich nicht geirrt alle Display was ich habe gefunden sind reine 3,3V Displays, bis 1,8" .
Der ST7789 kann ja nur 220 x 320 Pixel ansteuern, meistens sind das Waveshare Displays.

Statt Adafruit wurde die Bibliothek für ADS vom Robb Tilarart nehmen, so wie TFT_eSPI für Display.
Leider habe das Display nicht, jedoch die TFT_eSPI kommt sich nicht in die Quere mit I²C.
Deine Bibliotheken mögen sich nicht :wink:

Und genau das ist ein Problem. Wie soll man da helfen, wenn nicht mal unsere Fragen beantworten werden, "können oder wollen".
Da läuft doch dann etwas richtig schief.

Räume Deinen Code auf!

/tmp/arduino_modified_sketch_190343/sketch_jul27b.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_190343/sketch_jul27b.ino:33:11: warning: variable 'adc0' set but not used [-Wunused-but-set-variable]
   int16_t adc0, adc1;
           ^~~~
/tmp/arduino_modified_sketch_190343/sketch_jul27b.ino:33:17: warning: unused variable 'adc1' [-Wunused-variable]
   int16_t adc0, adc1;
                 ^~~~
/tmp/arduino_modified_sketch_190343/sketch_jul27b.ino:34:9: warning: unused variable 'volts0' [-Wunused-variable]
   float volts0, volts1;
         ^~~~~~
/tmp/arduino_modified_sketch_190343/sketch_jul27b.ino:44:12: warning: 'volts1' is used uninitialized in this function [-Wuninitialized]
   tft.print(volts1, 1);
   ~~~~~~~~~^~~~~~~~~~~

Und dann erklär mal, was Du sehen willst, wenn Du es nicht nimmst und zur Anzeige bringst.

Was ich weis habe mittgegeben, habe mall den ADS genutzt mit TFT aber das war noch zu Arduino Nano Zeiten, TFT war damals ein 2,4" 8Bit Display.