Arduino Variable auf LCD
Hi,
Ich möchte auf meinem LCD eine Zahl hoch zählen lasen sobald ein Knopf gedrückt wird. Ich habe es zuerst so probiert das ich eine variable (Zahl) festgelegt hab die bei knopfdruck um 1 erhöht wird und habe dan versucht mit lcd.print (Zahl) diese variable anzeigen zulassen doch leider bleibt die Zahl bei 0 stehen.
Hier nochmal der Code
.#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);
int zahl = 0;
int input_eins = 2;
int schalterzustand_eins;
void setup()
{ pinMode(input_eins, INPUT); lcd.begin(16, 2); lcd.print("Hallo Welt"); }
void loop() { lcd.setCursor(0, 1);
schalterzustandeins = digitalRead(inputeins);
if (schalterzustand_eins == 1) { zahl= 1+1; } lcd.print(zahl); }
meine frage nun gibt es eine möglich keit das umzusetzen am besten ohne groß liberarys zu in die entwiklungs umgebung zu importieren?
danke schonmal mfg wackel
3 Antworten
Ungetestet und ausm Kopf:
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);
int zahl = 0;
int input_eins = 2;
int schalterzustand_eins_alt = 0;
void setup()
{
pinMode(input_eins, INPUT);
lcd.begin(16, 2);
lcd.print("Hallo Welt");
}
void loop()
{
lcd.setCursor(0, 1);
int schalterzustand_eins = digitalRead(inputeins);
if (schalterzustand_eins_alt == 0 && schalterzustand_eins == 1)
{
++zahl;
lcd.print(zahl);
}
schalterzustand_eins_alt = schalterzustand_eins;
}
danke für deine schnelle Antwort der Code hatte noch kleine fehler wie mal ein _ vergessen aber trotzdem großen dank den es funktioniert ;)
Also beim Arduino hast du loop und setup automatisch. Ich nehme an, dass auf dem Arduino ein sehr abgespecktes OS oder eine Runtime ist, die diese beiden Funktionen aus einer main-Funktion aufruft. Es gibt also keine main. Es ist halt kein normales C und kein normaler Compiler.
Man kann in C++ Bilbiotheken schreiben (sind nur Header und CPP-Dateien, also keine lib oder dll). Daher sind Klassen möglich. Im Arduino-Editor nutzt man dann solche Bibliotheken, aber ich glaub man kann da keine Klassen dann direkt anlegen. Also schon eine Art Kunstgriff. Benutzen kann man Instanzen von Klassen aber wie du siehst.
loop wird automatisch zyklisch aufgerufen. Die Logik drumrum übernimmt wie gesagt eine Runtime oder ähnliches.
Hi, ich habe das programm noch bisschen weiter gesponnen. Ich habe 2 weiter knöpfe Hinzugefügt die die variable zahl um eins veringern oder auf 0 setzen.
Mein Problem ist jetzt dadurch das der Cursor (lcd.setCursor) am anfang des void loops immer wieder an anfang der zeile gesetzt wird kommt das Display bei übergang in eine andere größe der zahl (von einer auf zehner auf hunderter und anders herrum ) durcheinander.
zb.: die zahl beträgt 10 also steht 10 auf dem lcd ziehe ich jetzt 1 ab beträgt die zahl 9 der cursor macht an anfang der zeile und schreibt die zahl 9 über die 1 und die 0 bleibt so das jetzt 90 auf dem lcd zu sehen ist
FRAGE: Wie bekomm ich das weg???
Kenne die Arduino-Libs nicht aber ich schätze
schalterzustandeins = digitalRead(inputeins);
if (schalterzustand_eins == 1) { zahl= 1+1; } lcd.print(zahl); }
müsste wohl eher
schalterzustand_eins = digitalRead(inputeins);
if (schalterzustand_eins == 1) { zahl+=1; } lcd.print(zahl); }
lauten
Soweit ich das überblicke ist das aber auch noch nicht alles, da der dann hochzählt solange man den Schalter gedrückt hat. Man müsste eine Art Flanke abfragen. Also nur wenn schalterzustand_eins vorher 0 war und nun 1 ist, dann hochzählen.
Hast recht (ja nachdem, was die Funktion "digitalRead(inputeins);" nun genau macht)
digitalRead ist ne Standardfunktion von Arduino. Sie liest einen digitalen Wert vom Eingang. Da inputeins gleich 2 ist, liest er von Eingangspin 2.
Also quasi die Schalterstellung (Schalter wird an Pin 2 dran sein nehm ich an).
Logik bzgl Tasterverhalten stimmt. Aber du hast mich neugierig gemacht, wie Manches in Arduino gelöst ist.
1) Programmiert man in Arduino tatsächlich objektorientiert (wegen lcd). Oder ist das irgen ein Kunstgriff.
2) Fehlt da nicht die Main, die erst Setup() und dann meinetwegen in einer while(1)-Schleife loop() aufruft? Oder ist das anders gelöst?