Arduino Uno LCD mit Menü

Hallo,
ich habe folgendes Problem:
Nachdem wir in der schule schon nicht Unsere Musik Box (30LEDs als blinkmuster) mit einem VU Metre Kombinieren konnten wollte ich wenigstens ein kleines Menü erstellen.
Leider Funktioniert das nicht so ganz und nun wollte ich hier nach hilfe fragen.
Was ist falsch an dem Code?

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int a=0;
int b=0;
int c=0;
int d=0;
int e=0;
int f=0;

void setup()
{
Serial.begin(9600);
lcd.begin(16,2);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
}

void loop()
{
lcd.setCursor(1,0);
lcd.print(“Music Box 2000”);
lcd.setCursor(4,1);
lcd.print(“Welcome”);
delay(2000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading-”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading–”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading—”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading----”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading-----”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading------”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading-------”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading--------”);
delay(500);
lcd.clear();
lcd.setCursor(3,0);
lcd.print(“Please Wait”);
lcd.setCursor(0,2);
lcd.print(“Loading---------”);
delay(500);

if (a==0)
{
a=1;
}

Serial.println(a);

while (a==1)
{
lcd.clear();
lcd.setCursor(5,0);
lcd.print(“Menu”);
lcd.setCursor(0,1);
lcd.print(“Choose a Program”);

b=analogRead(0);

if(b>100)
{
a=2;

}

delay(300);
}

delay(300);

b=analogRead(0);
if(b>100)
{
a=a+1;
}

c=analogRead(3);
if(c>100)
{

a=a-1;
}

Serial.println(a);

delay(500);

while(a==2)
{
lcd.clear();
lcd.setCursor(4,0);
lcd.print(“Flash”);
lcd.setCursor(8,1);
lcd.print(“1”);
}

Serial.println(a);

}

Danke im Vorraus
GunterJauch

Deine Loading-Anzeige steht ohne Bedingung in der loop-Schleife. Also läuft das immer wieder so durch.
Aber was du bestimmt mit der Variable a bezwecken willst - dass die Loading-Anzeige nur einmal durchläuft. Richtig?

Dazu muss die Bedingung

if (a==0)
  {

an den Anfang der Anzeige (also gleich nach Beginn der loop-Schleife).
Aber "a2 darfst du dann nicht nochmal verwenden.
Dann läuft das nur einmal durch.

Oder su machst das nicht in “loop” sondern in “setup” rein. Dann müsste das auch nur einmal durchlaufen.

Zweitens machen sich delay-Befehle meist nicht so gut, da zb. in dieser Wartezeit keine Taster eingelesen werden können.

Damit sind wir bei den Tastern.
Wenn du analoge Eingänge als digitale nutzen willst kannst du sie zb so ansprechen:

int taster1 = A0;
int taster2 = A1;

void setup(){
 pinMode(taster1, INPUT);
 pinMode(taster2, INPUT);
}

void loop(){

wasauchimmer = digitalRead(taster1);

usw....

Wenn du keine externen Pullup oder Pulldown Widerstände verwenden willst, kannst du auch die internen nutzen.
Allerdings sind das nur Pullup-Widerstände. Also musst du nicht mit 5V, sondern mit 0V schalten, und den Status dann auf LOW abfragen.

void setup(){
 pinMode(taster1, INPUT);
 digitalWrite(taster1, HIGH);
 pinMode(taster2, INPUT);
 digitalWrite(taster1, HIGH);
}

Dann kommt leider noch das große Problem mit dem Tasterprellen hinzu. Also wenn du den Taster drückst kommen sehr schnell viele Impulse hintereinander, und der Zähler zählt nicht nur 1 weiter, sondern gleich mehr. Dafür gibts die Bounce-Libary. Damit kann man das umgehen.

http://www.arduino.cc/playground/Code/Bounce

Also zb. so:

#include <Bounce.h>

int taster1E = A0;
int taster1;

int taster2E = A1;
int taster2;

Bounce taster1B = Bounce( taster1E,30 ); //30 = 30 Millisekunden. Mit dem Wert muss man manchmal etwas hin und her probieren - je nach Taster.
Bounce taster2B = Bounce( taster2E,30 );

void setup(){
 pinMode(taster1E, INPUT);
 digitalWrite(taster1E, HIGH);
 pinMode(taster2E, INPUT);
 digitalWrite(taster1E, HIGH);
}

void loop() {
bouncer.update ( );

taster1 = taster1B.read();
taster2 = taster2B.read();

Damit kannst du dann den taster1 oder taster2 Wert sauberer weiterverarbeiten.

Und anstatt der while-Schleifen musst du if-Schleifen verwenden, weil du die Bedingung nicht innerhalb der Schleife änderst.
Also bei if (wert==2){ } - wird die Schleife einmal durchlaufen, sobald wert = 2 ist. Bei while(wert==2){ } wird die Schleife solange durchlaufen, solange wert = 2 ist.
Also wenn du innerhalb dieser Schleife den Wert nicht änderst, läuft die für immer durch.

So. Das wäre erstmal meine Meinung dazu. Bin aber auch noch ziemlicher Neuling, und manches kann man bestimmt noch besser machen.
Hoffe aber, das hilft dir ein klein wenig weiter.