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");
}
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?
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..."
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);
}
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.
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.