Go Down

Topic: Oude waarde blijft op LCD staan (Read 358 times) previous topic - next topic

Koen_P_Belgium

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?

Code: [Select]

#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");
}
You don't need to re-invent the wheel, Just improve it!

PieterP


Koen_P_Belgium

#2
Jan 09, 2018, 11:14 pm Last Edit: Jan 09, 2018, 11:19 pm by Koen_P_Belgium
Hoi Pieter, bedankt voor je reply, dit heb ik reeds getest, en dan begint het hele lcd te flikkeren, zoals de kerstboom :)

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?
You don't need to re-invent the wheel, Just improve it!

ArdLab_Gent

#3
Jan 09, 2018, 11:22 pm Last Edit: Jan 09, 2018, 11:27 pm by ArdLab_Gent
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
ArdLab geeft Arduino workshops voor beginners.
ArdLab is lid van de STEM-Academie.
http://www.ardlab.gent - http://www.stem-academie.be/

Koen_P_Belgium

#4
Jan 10, 2018, 08:59 pm Last Edit: Jan 10, 2018, 09:07 pm by Koen_P_Belgium
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
Code: [Select]
lcd.print(sensorwaarde);

dat het zoiets wordt:

Code: [Select]
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..." :(
You don't need to re-invent the wheel, Just improve it!

Koen_P_Belgium

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

Code: [Select]

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
You don't need to re-invent the wheel, Just improve it!

nicoverduin

Ik zou eens googelen op sprintf... en voordat je het display update eerst checken of het veld is gewijzigd. Zie strcmp
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

PieterP

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 :)

MAS3

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

PieterP

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.

MAS3

Is dat niet een antwoord dat de vraagsteller veel beter kan gebruiken dan het eerdere ?
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

nicoverduin

Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

Koen_P_Belgium

Ik heb er nu zoiets ingeplant:

Code: [Select]

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...
You don't need to re-invent the wheel, Just improve it!

MAS3

#13
Jan 12, 2018, 09:47 pm Last Edit: Jan 12, 2018, 09:48 pm by MAS3
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.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Koen_P_Belgium

#14
Jan 12, 2018, 09:57 pm Last Edit: Jan 13, 2018, 11:25 am by Koen_P_Belgium
Thanks! that did the trick :) :)

met
Code: [Select]

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

werkt het perfect!
You don't need to re-invent the wheel, Just improve it!

Go Up