Oude waarde blijft op LCD staan

Hoi allen,

Ik ben wat aan het leren met een LCD en ultrasoon afstandssensor.

Wat zich voordoet, is als de afstand groot wordt , en dan weer kleiner, er de oude waarde half blijft op staan, en ik kan in de I2C LCD library niet terug vinden hoe ik dit kan vermijden. Kan iemand me hier bij helpen?

#include <Wire.h>
#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

#define RED 0x1
#define YELLOW 0x3
#define GREEN 0x2
#define TEAL 0x6
#define BLUE 0x4
#define VIOLET 0x5
#define WHITE 0x7

const int trigPin = 9;
const int echoPin = 10;
long duration;
int distanceCm, distanceInch;

void setup() {
  // Debugging output
  Serial.begin(9600);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);

  lcd.setBacklight(WHITE);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
uint8_t i=0;
void loop() {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distanceCm= duration*0.034/2;
  distanceInch = duration*0.0133/2;

  lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed
  lcd.print("Distance: "); // Prints string "Distance" on the LCD
  lcd.print(distanceCm); // Prints the distance value from the sensor
  lcd.setCursor(14,0);
  lcd.print("cm");
}

Ik vermoed dat je Adafruit_RGBLCDShield::clear moet gebruiken.

Pieter

Hoi Pieter, bedankt voor je reply, dit heb ik reeds getest, en dan begint het hele lcd te flikkeren, zoals de kerstboom :slight_smile:

ik heb de lcd.clear() tussen verschillende regels toegepast, maar altijd het zelfde resultaat. De cijfers zijn dan inderdaad wel weg maar het display is dan bijna onleesbaar

Is er een mogelijk spaties, of eventueel "leading zeros" bij de waarde te voegen?

voor je de nieuwe waarde op het display zet :

cursor op juiste positie zetten en de oude waarde overschijven met spaties

cursor weer op de juiste positie zetten en nieuwe waarde schrijven

Bedankt voor de tip, maar ook hier flikkert het lcd, weliswaar enkel de gelezen waarde, de vaste tekst niet.
Enkel bij het inbouwen van een delay() van een seconde of zo wordt het display leesbaar, maar ik wou delays vermijden.

Kan de waarde van de sensor "geconverteerd" worden naar tekst?

ipv

lcd.print(sensorwaarde);

dat het zoiets wordt:

lcd.print("sensorwaarde");

/offtopic/ waarom moet ik 5 min wachten als ik via de edit een tikfout aanpas? ik krijg de melding : "You have exceeded the number of posts you can make in a 5 min period. Try again later..." :frowning:

ik heb een oplossing gevonden... en het lijkt goed te werken

lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed
  lcd.print("Distance: "); // Prints string "Distance" on the LCD
  
  if (distanceCm < 10) {
    lcd.print("000");
  }
  
  else if (distanceCm < 100) {
    lcd.print("00");
  }
  
  else if (distanceCm < 1000) {
    lcd.print("0");
  }
  
  lcd.print(distanceCm); // Prints the distance value from the sensor
  lcd.setCursor(14,0);
  lcd.print("cm");
  delay(100);

  if (distanceCm < 5) {
    digitalWrite(relayPin, HIGH);
    lcd.setBacklight(RED);
  }
  else {
    digitalWrite(relayPin, LOW);
    lcd.setBacklight(WHITE);
  }

er worden nu netjes "leading zero's" toegevoegd

Ik zou eens googelen op sprintf... en voordat je het display update eerst checken of het veld is gewijzigd. Zie strcmp

nicoverduin:
Ik zou eens googelen op sprintf... en voordat je het display update eerst checken of het veld is gewijzigd. Zie strcmp

Nergens voor nodig als je enkel het getal wijzigt :slight_smile:

Hoezo nergens voor nodig ?

Het resultaat van sprintf verandert alleen als het getal distanceCm verandert, dus vergelijken met strcmp is niet nodig, je hoeft enkel het getal met het vorige te vergelijken.

Is dat niet een antwoord dat de vraagsteller veel beter kan gebruiken dan het eerdere ?

Yep

Ik heb er nu zoiets ingeplant:

int distanceCm;
char intConversie[4];
...

void loop();

sprintf(intConversie, "%04X", distanceCm;

lcd.print(intConversie);

op het lcd is nu de waarde af te lezen met "leading zero's"

maar als nu de waarde meer dan 10 wordt, komt er op het lcd waardes zoals 002A, 0FF0, 001C, etc...

De X in de sprintf regel, geeft aan dat het getal hexadecimaal moet worden.
Dan is de waarde dus wel 10, maar niet tien.
De hexadecimale waarde 10 staat voor zestien.

Laat de X weg, of geef een passende Specifier (klik !).
Arduino is C++ gebaseerd, en de link hierboven verwijst naar printf, waar dezelfde specifiers gelden.

Thanks! that did the trick :slight_smile: :slight_smile:

met

sprintf(intConversie, "%04d", distanceCm);

werkt het perfect!

I know:)