Chris85:
- Wenn kein Taster gedrückt ist: "Bitte Programm wählen"
- Wenn Taster gedrückt wird "Programm1"
- Der Taster wird losgelassen - nichts ändert sich
- Der Taster wird nochmals gedrückt: Programmende und "Bitte Programm wählen"
und
- es kann stets nur ein Programm zur selben Zeit gestartet sein
Was mich mal interessiert:
Hat Dich mit der Aufgabe eigentlich jemand ins kalte Wasser geschmissen, ohne dass Du zur Lösung der Aufgabe irgendwie in geeigneter Weise fachlich ausgebildet worden bist?
Oder hast Du Dich in eigener Selbstüberschätzung für diese Aufgabe freiwillig gemeldet?
Anyway.
Bei einer solchen Aufgabe mit fünf Tastern und fünf einzeln zu schaltenden Ausgängen kommen natürlich schon ein paar Dinge zusammen. Datenstrukturen und Algorithmen, globale und lokale Variablen, selbstgeschriebene Funktionen, Enumerationen, Arrays, for-Schleifen, if-Bedingungen. Strukturierte Programmierung, wenn es übersichtlich bleiben soll.
Ich poste Dir mal ein Programmgrundgerüst.
Vielleicht kannst Du Dir was abgucken und dann für Deine Aufgabe soweit fertigstellen.
Das meiste sollte drin sein, und ich habe versucht, das Programm nach dem EVA-Prinzip zu strukturieren, so dass wenigstens die loop-Funktion einfach aussieht:
void loop()
{
eingabe();
verarbeitung();
ausgabe();
}
In der eingabe() Funktion werden die Taster abgefragt und deren Zustände gespeichert.
In der verarbeitung()-Funktion werden die Tastendrücke zum Umschalten der Programme verarbeitet. Für das Setzen der Ausgänge entsprechend dem geschalteten Programm habe ich eine leere switch-case-Anweisung vorgesehen, die entsprechend ausgefüllt werden kann.
Und zum Schluss lauert die ausgabe()-Funktion darauf, dass sich das laufende Programm ändert, und falls das passiert, wird ein anderer Text ausgegeben. Im Beispielprogramm auf Serial, das müßtest Du dann für Textausgabe auf Deinem LCD-Display umschreiben.
Ach ja, mein Programm ist für INPUT_PULLUP geschrieben, also "direkt angeschlossene Taster mit Benutzung der internen PullUp-Widerstände. Falls Du Deine Taster mit externen PullDown-Widerständen beschaltet hast, kann derselbe Code verwendet werden, wenn der INPUTMODE auf INPUT gesetzt wird.
#define INPUTMODE INPUT_PULLUP // INPUT oder INPUT_PULLUP
#define BOUNCETIME 10 // maximale Prellzeit in Millisekunden
byte buttonPins[]={2, 3, 4, 5, 6, 7};// Pin-Nummern der angeschlossenen Buttons
#define NUMBUTTONS sizeof(buttonPins) // Anzahl der Buttons (automatisch definiert)
byte buttonState[NUMBUTTONS]; // Speichert den aktuellen HIGH/LOW Status der Pins
byte buttonChange[NUMBUTTONS]; // Speichert Flankenwechsel an den Pins
enum{UNCHANGED,BUTTONUP,BUTTONDOWN};
void eingabe(){
// Tasterstatus und Flankenwechsel an den Tastern auswerten
static unsigned long lastButtonTime; // Zeitstempel, wann die Routine zuletzt durchlief
memset(buttonChange,0,sizeof(buttonChange)); // Alle alten Flankenwechsel verwerfen
if (millis()-lastButtonTime<BOUNCETIME) return; // innerhalb der Prellzeit die Funktion verlassen
lastButtonTime=millis(); // Zeitstempel der letzten Buttonabfrage aktualisieren
for (int i=0;i<NUMBUTTONS;i++)
{
byte curState=digitalRead(buttonPins[i]); // Aktueller Buttonstatus
if (INPUTMODE==INPUT_PULLUP) curState=!curState; // Vertauschte Logik bei INPPUT_PULLUP
if (curState!=buttonState[i]) // Flankenwechsel erkannt
{
if (curState==HIGH) buttonChange[i]=BUTTONDOWN;
else buttonChange[i]=BUTTONUP;
}
buttonState[i]=curState; // den jetzigen Buttonzustand speichern
}
}
int programRunning=-1; // globale Variable speichert das laufende Programm, -1= kein Programm
void verarbeitung()
{ // Verarbeite Tastendrücke
for (int i=0;i<NUMBUTTONS;i++)
{
if (programRunning==i && buttonChange[i]==BUTTONDOWN) // wenn Programm läuft und Taster gedrückt
programRunning=-1; // Programm aus
else if (programRunning<0 && buttonChange[i]==BUTTONDOWN) // wenn kein Programm läuft und Taster gedrückt
programRunning=i; // laufendes Programm setzen
}
// Verarbeite laufendes Programm
switch (programRunning)
{
case 0:
// Hier Befehl zum Einschalten von Programm-0
break;
case 1:
// Hier Befehl zum Einschalten von Programm-1
break;
case 2:
// Hier Befehl zum Einschalten von Programm-2
break;
case 3:
// Hier Befehl zum Einschalten von Programm-3
break;
case 4:
// Hier Befehl zum Einschalten von Programm-4
break;
default:
// Hier Befehl zum Ausschalten aller Programme
}
}
void ausgabe()
{ // Ausgabe von Programmänderungen als Text (hier: auf Serial)
static int lastProgram; // Merker für das zuletzt in der Anzeige angezeigte Programm
// Nur wenn sich das Programm ändert, wird auch die Anzeige neu geschrieben
if (lastProgram!= programRunning)
{
if (programRunning<0)
Serial.println("Kein Programm");
else
{
Serial.print("Programm-");
// Programme zählen von 0 bis 4, angezeigt werden soll aber von 1 bis 5, daher "+1"
Serial.println(programRunning+1);
}
lastProgram=programRunning;
}
}
void setup() {
Serial.begin(9600);
for (int i=0;i<NUMBUTTONS;i++) pinMode(buttonPins[i],INPUTMODE);
}
void loop() {
eingabe();
verarbeitung();
ausgabe();
}
Wenn irgendwas unklar ist, einfach nachfragen!
P.S.: Es gibt natürlich immer mehrere Möglichkeiten, so etwas zu programmieren.