Nano + Bluetooth + TFT = weisses Display

Hi

Diese Thematik gibts schon etliche Male, jedoch habe ich bislang keine Lösung gefunden.
Ich verwende:
DollaTek 2.4 Zoll TFT SPI LCD-Modul ILI9341 mit 8-poligem PCB-Bildschirm

AZDelivery HC-05 HC-06 Bluetooth Wireless RF-Transceiver-Modul RS232 serielle TTL

Das Ganze auf einem Nano mit diesem Code:

//#include <Wire.h>
#include <SPI.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
String outdate = "";
const unsigned int DISPLAY_TIMEOUT = 8000;
bool displayIsOn = false;
unsigned long displayTimeout;

#include <SoftwareSerial.h>
SoftwareSerial BTserial(2, 3);
// BTconnected will = false when not connected and true when connected
boolean BTconnected = false;
// connect the STATE pin to Arduino pin D4
const byte BTpin = 4;

#include <Adafruit_GFX.h>      // include Adafruit graphics library
#include <Adafruit_ILI9341.h>  // include Adafruit ILI9341 TFT library
// initialize ILI9341 TFT library with hardware SPI module
//SCK (CLK) ---> Nanao Port D13
//MOSI(DIN) ---> Nano Port D11
// BLK an 3,3V VCC
#define TFT_CLK 13
#define TFT_MISO 12
#define TFT_MOSI 11
#define TFT_DC 5
#define TFT_CS 10  //erforderlich!
#define TFT_RST A4
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

String readString;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
const long interval = 3000;
int Blight = 0;

int trigger = 7;      //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
int echo = 6;         // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards
long dauer = 0;       // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung = 0;  // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.

void setup() {
  clock.begin();
  // Nur zum Setzen der Zeit einmal freisetzen
  // Manual (YYYY, MM, DD, HH, II, SS
  //clock.setDateTime(2024, 1, 20, 13, 23, 00);
  Serial.begin(9600);
  tft.begin();
  tft.setRotation(1);
  tft.fillScreen(ILI9341_BLACK);  // Bildschirm blau hinterlegen
  tft.setTextSize(2);             // Schriftgröße einstellen 1 - 40 Zeichen pro Zeile, 2 - 20 Zeichen pro zeile, 3 - 13 zeichen pro Zeile
  // Schriftgroße 2 hat Hoehe x Breite = 14 x 10 Pixel
  tft.setTextColor(ILI9341_YELLOW);  // Farbe der Schrift einstellen
  tft.setCursor(0, 18);              // Cursor auf oben links setzen Spalte, Zeile in Pixel
  tft.print("B:");
  tft.setCursor(0, 36);
  tft.print("Innen:");
  tft.setCursor(30, 18);
  tft.print("Warte");

  // wait until the HC-05 has made a connection
  while (!BTconnected) {
    if (digitalRead(BTpin) == HIGH) { BTconnected = true; };
  }
  tft.setCursor(70, 36);
  tft.print("     ");
  BTserial.begin(38400);
  //lcd.noBacklight();
  pinMode(trigger, OUTPUT);  // Trigger-Pin ist ein Ausgang
  pinMode(echo, INPUT);      // Echo-Pin ist ein Eingang
}


void loop() {
  digitalWrite(trigger, LOW);          //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
  delay(5);                            //Dauer: 5 Millisekunden
  digitalWrite(trigger, HIGH);         //Jetzt sendet man eine Ultraschallwelle los.
  delay(10);                           //Dieser „Ton“ erklingt für 10 Millisekunden.
  digitalWrite(trigger, LOW);          //Dann wird der „Ton“ abgeschaltet.
  dauer = pulseIn(echo, HIGH);         //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
  entfernung = (dauer / 2) * 0.03432;  //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
  //Serial.println(entfernung);

  //displayBacklight();


  /*
  if (tasterstatus == LOW) {
    lcd.backlight();
    currentMillis = millis();
  }
  if (currentMillis - previousMillis >= interval) {
    lcd.noBacklight();
    previousMillis = currentMillis;
    Serial.print(millis() - currentMillis);
  }
*/

  dt = clock.getDateTime();
  char timebuffer[8];
  char datebuffer[5];
  sprintf(datebuffer, "%02u.%02u", dt.day, dt.month);
  tft.setCursor(0, 0);
  tft.print(datebuffer);
  tft.print("." + String(dt.year));
  sprintf(timebuffer, "%02u:%02u:%02u", dt.hour, dt.minute, dt.second);
  tft.print(" " + String(timebuffer));
  tft.setCursor(70, 36);
  tft.print(String(clock.readTemperature()) + "C  ");

  if (digitalRead(BTpin) == HIGH) {
    if (BTserial.available() > 0) {
      delay(100);
      String readString = BTserial.readString();
      //Serial.println(readString);
      int firstClosingBracket = readString.indexOf('<');
      int secondClosingBracket = readString.indexOf('>', firstClosingBracket + 1);
      String readString1 = readString.substring(firstClosingBracket + 1, secondClosingBracket);
      //Serial.println(readString1);
      if (readString1.length() > 20) { readString1.substring(1, 20); }
      tft.setCursor(30, 18);
      tft.print(readString1);
      Serial.println(readString1);
      readString = "";
      readString1 = "";
    }
  } else {
    tft.setCursor(30, 18);
    tft.print("Kein Signal      ");
  }
}
void displayBacklight() {
  if (displayIsOn && (millis() - displayTimeout <= DISPLAY_TIMEOUT)) {
    //lcd.setCursor(15, 1);
    //lcd.print(String(((millis() - displayTimeout) / 1000) + 1) + " Sek");
    //Serial.println(((millis() - displayTimeout) / 1000)+1);
  }

  if (entfernung > 0 && entfernung <= 10)  //Pseudocode!
  {
    displayTimeout = millis();

    if (!displayIsOn) {
      displayIsOn = true;
      //lcd.backlight();
    }

    return;
  }

  if (displayIsOn && (millis() - displayTimeout > DISPLAY_TIMEOUT)) {
    displayIsOn = false;
    //lcd.noBacklight();
  }
}

Das Problem:
Solange das BT-Modul abgesteckt ist oder auf eine Verbindung wartet, funktioniert alles. Hat das BT-Modul eine Verbindung wird das Display weiss und bleibt so.

Ich habe auch schon andere Libraries getestet, mögliche Timerprobleme ausgeschlossen, eine externe Stromversorgung angeschlossen und bin nun ratlos.

Der Text "B:", "Innen:" und "Warte" werden nur angezeigt, solange das BT-Modul keine Verbindung hat.

Bin für Ratschläge, Tipps und jegliche Hilfe dankbar.

Wo? Wen auf VCC am Nano bringt das nichts.
Nano wen Nachbau kann nur bis 20 mA liefern.
Du weist das Deine teile sind 3,3V Teile? Du befeuerst die aber mit 5V auf RX (BT) und auf Display.
Stecht doch großgeschrieben drauf, lange werden die nicht leben.

Ein exaktes Schaltbild könnte bei der Fehlersuche sehr gut helfen.
Und div. Tipps hast du ja schon von @fony erhalten.

Ich habe mir extra einen Logic Level Converter zugelegt:


Mit dem funktioniert das Display überhaupt nicht.Ich finde den Beitrag nicht mehr, aber da hatte jemand das selbe Display und es muss mit 5V betrieben werden.

Mach mall Foto der anderer Seite, mag sein das der braucht 5V wegen vorhandenen Regler 5 ->3,3V jedoch ILI9341ist ein 3,3V Treiber, er wird mit 5V auf der SPI Seite funktionieren nur nicht lange, egal was so manche im Netz schreiben.

Könnte ja sein, dass der Logiklevel Converter nicht passt. Poste doch einfach mal einen Link zu dem Teil, dann müssen wir nicht suchen und finden evtl. falsche Teile.
Ein Schaltbild fehlt leider noch.

Da sollte man sich einfach an das Datenblatt halten.
Und ein Link des Displays ist auch besser als ein nichtssagedes Foto.

Wurde auf dem TXS0108 der OE Pin auf HIGH gezogen mit einem 1 ~ 10kOhm Widerstand?
Bedeutet Widerstand auf 3.3V oder 5V dran und auf OE legen (Pull UP)

Daher ja auch die Frage nach einem Schaltbild, da kann man oft die Fehler drauf erkennen.
Und den OE kann man auch direkt auf High (VCC) legen.

Im Datenblatt stecht was von den 1 bis 10k Widerstand. Man muss dazu schreiben es gibt viele welche den IC nachbauen, bedeutet gleich so viel Blätter.

Ja, das lese ich auch, wenn der zusätzlich noch durch einen OK oder OD Transistor gesteuert werden soll. Also als Pullup. Wenn der fix an sein soll, reicht direkt VCC. Aber ok, ein Widerstand ist auch gut.
Wäre nur schön, wenn der TO auch weitere Infos liefert.

Hab den Artikel gefunden:
https://www.rc-modellbau-portal.de/index.php?threads/arduino-nano-mit-dollatek-2-4-tft-spi-lcd-farb-modul-ili9341.8222/post-471462

Das Datenblatt vom Display (meines hat kein Touch):
dollatek.TXS0108.pdf (32,2 KB)

Ja, prima...und was steht hier:

Zitat:
muss an dem VCC-Pin mit 5V und nicht mit 3V3 betrieben werden. Die 4 SPI - Leitungen, wie gehabt mit Levelshifter oder Widerstandsteiler auf 3V3. BLK fest an 3V3.

Dann zeig doch endlich dein Schaltbild, wie du es gemacht hast. Wie sollen wir so deine Fehler finden. Und weiter raten möchte ich nicht.

Das ist kein Datenblatt, eher ein Schaltbild. Evtl. deins ?

@donsenilo1968
Sollte das PDF in Post #11 dein Schaltbild sein, dann kann es nicht funktionieren.
Da hast du total andere Pins verwendet. Die stimmen nicht mit deinem Sketch in Post#1 überein.
So kann es nicht funktionieren.

Ich habe die Luxusversion (2,8 Zoll, Touch + SD) und die läuft an einen ESP32 am 3.3 Volt hervorragend.

Ich habe das Teil aber auch mal aus Spass an einen Nano getestet. Hat mich 2 Sifter gekostet nur für das Display.

Es zuckte zwar auch mit 5V lief aber instabil. Wie gesagt es zuckte.

Stromversorgt wurde es direkt aus den Nano.

Gruß

Pucki

Dort ist auch kein Touch dran nur Display.
Wo ist das Foto der Rückseite? oder wenigstens ein Verweis, es gibt 3Sortet vom deinem Display. Warum wird als DollaTek verkauft? es ist gaannzz Doll, eigentlich ist ein Waveshare TFT.

Du hast ein LCD Wicki wie schon.
Was hier nix zu sagen hat, auch wen dein AZ den anders nennt.
Bitte keine Antwort war nur Geradestellung.

Nee, weil es gaaaanz billig ist. :wink:
Ein weiteres Problem ist wohl, der TO vermischt hier diverse Schaltungs und Sketchvorschläge, ohne richtig zu wissen, was gehen muss.
Wenn er endlich mal die angefragten Dinge liefern würde, kämen wir ja weiter, auch ohne die unwichtigen Infos von Bucky.

https://www.amazon.de/DollaTek-LCD-Modul-Laufwerksfarbdisplay-8-poligem-PCB-Bildschirm/dp/B07QFVBLDS

Das ist fast das selbe wie meins. Außer das es teurer ist, und kein Touch und kein SD hat.

Die Pin beschreibung steht sogar in den Verkaufstext.

Gruß

Pucki

Hör mall wo ist dein SD Slot drauf?
Mag sein das Waveshare macht auch Displays mit SD nur habe keine gesehen, extra nachgeguckt machen nicht.
Also Ende mit dem Müll was hat hier nichts zu suchen, das alles wissen wir ab #1 wen es geht um den TO Display.
Schätze bist der Meinung, das hier alle sind Deppen.

Wenn du weniger mobben würdest und der TO den Amazon link MIT Bewertungen lesen würde, dann das ganze anlysierten würde dann wüste er mit hoher Wahrscheinlichkeit wo der Fehler ist.

Kleiner Tipp : An den Display fehlt was. Ergo muss man da tricksen. Steht in den Bewertungen. Sogar das da einer auch Probleme bei einen Nano hat.

Gruß

Pucki.

PS : CS :wink: