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.


