Probleme mit 16x2 LCD-Display

Schönen guten Tag,

momentan arbeite ich an einer Art Fahrradcomputer, welchen ich während einer Fahrradtour dazu verwenden will mittels der Messung des Luftdruckes die momentane Höhe über NN auszulesen. Neben dieser Funktion lese ich zudem die momentane Temperatur sowie die Luftfeuchtigkeit aus. Leider bin ich noch ein blutiger Anfänger und bin soeben an ein für mich unlösbares Problem gestoßen und hoffe nun von euch einen entscheidenden Tipp zur Lösung dieses Problems zu bekommen.

Die Anzeige der zuvor genannten Messwerte sind auf einem 16x2 LCD-Display in einer Dauerschleife erst einmal kein Problem. Nun wollte ich das ganze Projekt ein wenig "anspruchsvoller" gestalten indem ich einen Taster verwende, der eine Variable hochzählt und in Abhängigkeit von dieser Temperatur, Luftdruck oder Höhe über NN auf dem Display anzeigt.

Das Entprellen des Schalters sowie das Hochzählen der Variable gelingen auch noch ohne Probleme. Nun komme ich jedoch zu meinem eigentlichen Problem. Nun habe ich jeder Variable einen Messwert zugeordnet. Z.B Temperatur = 1, Luftfeuchtigkeit = 2, usw.
Drücke ich den Schalter und lasse ihn anschließend wieder los ist der Kontrast des Displays so gering, dass die Werte kaum ablesbar sind.
Halte ich den Schalter jedoch gedrückt (HIGH) so sind die Werte ohne Probleme lesbar.

Für eure Bemühungen bin ich euch jetzt schon sehr dankbar.

Mit freundlichen Grüßen:

Fibbonacci

Dein Problem ist so nicht zu verstehen bzw. zu lösen.
Du solltest uns deinen Sketch zeigen.

#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

#define ONE_WIRE_BUS 9
#define DHT11_PIN 6
int chk;
int Schalter = 8;
int Zeit;
int Dauer;
int Variable = 0;
int displayBeleuchtung = 7;
dht DHT;

Adafruit_BMP085 bmp;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
lcd.begin(16, 2);
pinMode(Schalter,INPUT);
pinMode(displayBeleuchtung, OUTPUT);

}

void loop() {

// Hier findet die Entprellung des Schalters statt.

if (digitalRead(Schalter) == HIGH){
Zeit = millis();

while (digitalRead(Schalter) == HIGH)
Dauer = millis() - Zeit;}

if (Dauer > 500){
Dauer = 0;
Variable = Variable + 1;
}

// Hier findet die Messung als auch die Anzeige der Temperatur mittels eines 16x2 LCD-Displays statt.
if (Variable == 1){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperatur");
lcd.setCursor(0, 1);
lcd.print(bmp.readTemperature());
lcd.setCursor(4, 1);
lcd.print("*C");}

// Hier findet die Messung als auch die Anzeige der relativen Luftfeuchtigkeit mittels eines 16x2 LCD-Displays statt.
if (Variable == 2){
chk = DHT.read11(DHT11_PIN);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Luftfeuchtigkeit");
lcd.setCursor(0, 1);
lcd.print(DHT.humidity, 1);
lcd.setCursor(4, 1);
lcd.print("%");}

// Hier findet die Messung als auch die Anzeige des Luftdruckes mittels eines 16x2 LCD-Displays statt.
if (Variable == 3){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Luftdruck");
lcd.setCursor(0, 1);
lcd.print(bmp.readPressure());
lcd.setCursor(4, 1);
lcd.print("mbar");}

// Hier findet die Messung als auch die Anzeige der Höhe über NN mittels eines 16x2 LCD-Displays statt.
if (Variable == 4){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hoehe ueber NN");
lcd.setCursor(0, 1);
lcd.print(bmp.readAltitude());
lcd.setCursor(7, 1);
lcd.print("meter");}

if(Variable == 5){
Variable = 0;
}

}

Offener Eingang!

Schalte den internen Pullup ein, schalte gegen GND mit dem Taster und dreh daher die Logik um.

Ich binnicht sicher, ob es hier an einem offenen Eingang liegt. Das könnte man durch einen Pulldown-Widerstand aber einfach testen.

Ich kann aber noch nicht übersehen, wie du in die jeweilige Position schalten willst.
Du solltest deine Struktur überdenken und mit Funktionen arbeiten.

Eine für die Anzeige und weitere für die jeweiligen Sensoren.
Das wird übersichtlicher und erleichtert die Fehlersuche.

Hallo,

der Effekt kommt zu Stande weil du permanent ohne Pause aktualisierst und dazu noch am laufenden Band mit lcd.clear das Display löschst. Dadurch schreibst und löschst du ohne ende im Wechsel. Effekt ist was du gerade siehst.

lcd.clear nimmt man ganz selten. Man überschreibt besser immer gezielt mit Leerstellen oder neuen Text. Cursor positionieren und überschreiben. Die gesamte Aktualisierung sollte auch im Sekundentakt erfolgen. Dann flimmert auch nichts.