LCD Probleme - Seltsame und fehlerhafte Zeichen werden ausgegeben

Hallo zusammen, ich bin Anfänger und programmiere für meine Facharbeit in der 10. Klasse einen smarten Mülleimer mit einem Arduino. Ich habe ein Problem mit meinem Ultraschallsensor und dem LCD-Display – es werden seltsame Zeichen angezeigt, obwohl der Code eigentlich funktionieren sollte. Kann mir jemand helfen, herauszufinden, warum mein LCD-Display nicht den richtigen Text anzeigt, wenn der Ultraschallsensor eine bestimmte Distanz erkennt? Es zeigt - wie auf dem Bild zu erkennen, komische Zeichen an. Ich habe das LCD schon mit einem normalen helloworld script probiert und da lief es einwandfrei.

Listenelement`

#include <Servo.h> //Servobibliothek importieren
#include <LiquidCrystal.h> //LCD-Bibliothek importieren

Servo motor1; //den motor1 als Servo definieren
const int signalPin = 8; // Der Ultraschalsensor ist am Digital-Pin 8 angeschlossen
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //LCD ist an diesen Pins angschlossen

void setup() {
  motor1.attach(9); //der Servo ist an Pin 9 angschlossen
  pinMode(signalPin, OUTPUT); // repräsentiert digitalen Pin wieder (hier: Pin 2), Pin wird als Ausgang definiert -> benötigter Puls für Sensor
  lcd.begin(16, 2); //Display wird gestartet und kann 16 x 2 Zeichen ausgeben
}

void loop() {
  motor1.write(0); //Servoarm auf 0° einstellen
  long duration, distance;
    
  digitalWrite(signalPin, LOW);
  delayMicroseconds(2); //kein Signal soll anliegen -> Fehlervermeidung

  
  digitalWrite(signalPin, HIGH);
  delayMicroseconds(10); //Signal für 10 Mikrosekunden aktivieren -> Ultraschallmessung (min. 10 µs!)
  digitalWrite(signalPin, LOW); //Signal wieder deaktivieren

  pinMode(signalPin, INPUT); //den Sensor als Empfangsquelle definieren -> Messung
  duration = pulseIn(signalPin, HIGH); //Durchführung der Messung -> Ergebnis wird in der Variable "duration" gespeichert
  
  distance = (duration * 0.0343) / 2; //Distanz zum Hindernis berechnen; die Zeit, die für Hin- und Rückweg des Signals gebraucht wird (duration) mit der Schallgeschwindigkeit multipliziert und dann durch 2 geteilt (wegen Hin- und Rückweg des Signals)

  if (distance < 20){
    motor1.write(90);
    lcd.clear();//löscht LCD Bildschirm
    lcd.print("Bitte einwerfen");
    delay(500);
  }
  else if (distance > 20){
    motor1.write(0); //Wenn ein Hindernis näher als 20cm am Sensor ist -> Servoarm wird auf 90° gestellt
  }
  delay(400); //400 Millisekunden zwischen Messungen
}


`

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

@flex
Du verwendest Pin 2 doppelt.
Einmal für den Sensor - ein zweites mal für das Display.
Damit kommt das Display außer Takt.

Korrigiere den Sketch und poste den neuen Sketch in Code Tags.

Danke dir. Das hatte ich dann halt auch ausprobiert und mal die Pinbelegung vom Sensor auf Pin 8 gelegt. Nun funktionierte das LCD perfekt, aber der normale Code ging nicht mehr. Also die Mülltonne/ Servo blieb einfach die ganze Zeit auf. Wahrscheinlich funktioniert somit der Sensor richtig. Achso, ich benutze einen grove Ultraschallsensor und ein Base Shield. Aber da müsste ja D8 für den Sensor auch funktionieren, wenn D2 auch funktioniert..

Grundsätzlich sollte das auch mit D8 auc funktionieren. Was genau ist das für ein Sensor ?
Poste bitte einen Link.
Mir bekannte US-Sensoren nutzen 2 Pins.

Naja den Sensor + Kabel hab ich direkt von meiner Schule bekommen..
Ich habe halt auf dem Arduino ein Base Shield, weshalb Ich keine 2 Pins brauche. Es ging alles perfekt, bis ich das LCD einband. In anderen Programmen ohne LCD geht D8 auch.
https://botland.de/grove-abstands-und-bewegungssensoren/11360-grove-ultraschall-abstandssensor-3-350cm-5903351247177.html

Stimmt, den Sensor habe ich übersehen.
Der geht mit einer Leitung.

Und warum nimmst du nicht die vorgeschlagene Library dazu ?

Ich wusste noch gar nicht, dass es eine Library gibt. Naja Ich hatte anfangs es halt auch schon ohne geschafft..

Ja, die übernimmt meist die Arbeit korrekt.
Was mir noch auffällt, du musst den Pin für den Sensor in der loop auch am Anfang wieder auf Ausgang stellen, sonst sendet der nix mehr.

Das steht auf der verlinkten Seite von dir.

Das heißt? Einfach den pinMode(signalPin, OUTPUT); an Anfang des Loops?

abhängig davon was du anschließend mit deinen Pin machen willst.
wenn du irgendwo digitalWrite SCHREIBST musst du ihn auf Output setzen.
bevor du liest - muss es ein Input sein.

Verlinke mal die Seite wo du den Sketch für den Ultaschallsensor mit einem Pin her hast.

Genau.

Danke, es funktioniert endlich. Das hat mir so viele Nerven gekostet :joy: Jetzt bin ich erstmal wieder enstpannt - naja jetzt muss ich noch den Hauptteil der Facharbeit schreiben. Nochmal vielen Dank!

Alles, gerne. Weiterhin viel Erfolg.

Aber sieh dir nochmal die Library an, wie es da gemacht wird.