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.
#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
}
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.
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.
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.
Danke, es funktioniert endlich. Das hat mir so viele Nerven gekostet Jetzt bin ich erstmal wieder enstpannt - naja jetzt muss ich noch den Hauptteil der Facharbeit schreiben. Nochmal vielen Dank!