Ich habe eine Frage zur mehrfachen Verwendung eines Tasters:
Ich möchte mit einem Taster einen Ablauf starten. Danach möchte ich diesen Taster anders verwenden, respektive um damit das Display umzuschalten (solange der Taster gedrückt ist, wird am Display etwas anderes angezeigt). Oder geht das nicht und bei jedem Tasterdruck wird der ursprüngliche Ablauf neu gestartet?
Ist dies überhaupt möglich bzw. falls ja, wie muss ich dies anlegen bzw. wonach suchen? Solange ich die Suchbegriffe "Taster" und "mehrfach" verwende, finde ich Lösungen zum Entprellen.
Ja, das ist möglich, wenn du dir in einer Variablen merkst, das der Ablauf schon gestartet wurde und du anschließend andere Funktionen starten möchtest.
Dabei ist natürlich auch ein entprellen nötig.
Du musst aber auch dabei berücksichtigen, dass dein Ablauf irgend wann durchgelaufen ist und wieder neu gestartet werden muss, da muss zuvor die Merker-Variable auch wieder gelöscht werden.
@Dieter: das ist egal, denn nach dem kompletten Durchlauf ist die Sache erledigt und es wird mit dem Hauptschalter komplett abgeschaltet.
Da fällt mir in diesem Zusammenhang noch ein: ich möchte auch einen Aus-taster (Not-aus) einbauen. Soll ich diesen überhaupt über einen Port abfragen oder ist es einfacher, diesen als Reset auszuführen, da bei einem manuellen Abschalten ohnehin neu gestartet werden soll/ muss?
@Tommy: da habe ich mich wohl etwas unglücklich ausgedrückt. Wie ein "richtiger" Not-Aus angeschlossen wird, weiß ich natürlich, auch, dass es ein Öffner sein muss wegen der Drahtbruchsicherheit. Ich möchte einfach nur in den Ablauf dahingehend eingreifen können, dass ich ihn stoppe und zum Anfang zurückkehre, nicht einfach nur pausieren. Darum die Frage, ob ich diesen Taster beim Reset anschließe. Außerdem habe ich noch einen Hauptschalter ca. 4cm daneben, falls Not am Mann ist. Richtlinien zur elektrotechnischen Sicherheit werden natürlich eingehalten.
@Rentner: danke, aber das wäre mit Kanonen auf Spatzen schließen, soviel benötige ich nicht.
Allgemein gilt: Reset im Programm auszulösen soll nur von schlechter Programmierung ablenken.
Du kannst (fast) alle Abläufe auch gesteuert wieder auf einen definierten Zustand setzen.
Dazu musst Du das Problem aber konkret analysieren. Die allgemeinen Bemerkungen, die Du bisher abgegeben hast, genügen dazu nicht.
Ein Notaus sollte die Anlage stoppen.
Alle Aktoren von der Steuerung abwerfen.
Die Anlage muss in einen sicheren Zustand fallen.
Gerne per Federspeicher oder Schwerkraft.
Ein "zum Anfang zurückkehren" wäre eine Aktivität, im Notaus Zustand.
Das verbietet sich in der Regel.
Man muss also wirklich und ernsthaft entscheiden, ob der Taster ein Notaus sein soll, oder ein einfaches Bedienelement der Steuerung.
In beiden Fällen hat das Bedienelement nichts am Resetpin zu suchen.
Allgemein gilt: Reset im Programm auszulösen soll nur von schlechter Programmierung ablenken.
In den meisten Fällen sicherlich richtig.
Auch wenn ich es anders formulieren würde.
buffalo64:
Danke schön, dann sehe ich mir die Tutorials von agmue mal durch, die sind mir gerade ins Auge gehüpft...
Die sind schon etwas angestaubt, ich habe sie immer entsprechend meines Kenntnisstandes geschrieben. Mit "agmue anleitung" als Suche im Forum zu finden. Bitte auch die Links zu anderen Autoren beachten, die haben es manchmal besser gemacht.
Ich habe es jetzt mit If-Abfragen und einer Schleife gelöst. Millis brauche ich dann aber an anderer Stelle auch, so wie jetzt ist für mich übersichtlich.
Kann man das so machen oder ist das programmtechnisch "schlecht"?
[code]
bool Run = 0;
int START = 7;
int Rot = 9;
int Gelb = 10;
int Gruen = 11;
void setup() {
pinMode (Rot, OUTPUT);
pinMode (Gelb, OUTPUT);
pinMode (Gruen, OUTPUT);
pinMode (START, INPUT_PULLUP);
Serial.begin(9600);
}
void loop()
{
Serial.println(Run);
if (digitalRead(START) == LOW){
Run = 1;
}
if (Run == 1){
for (int i = 0; i < 1001; i++) {
Serial.println(i);
Serial.println();
digitalWrite(Gelb, HIGH);
digitalWrite(Gruen, HIGH);
digitalWrite(Rot, LOW);
if (digitalRead(START) == LOW) {
digitalWrite(Gruen, LOW);
digitalWrite(Rot, HIGH);
}
if (i == 1000)
{
Run = 0;
}
}
}
else {
digitalWrite(Gelb, LOW);
digitalWrite(Rot, LOW);
digitalWrite(Gruen, LOW);
}
}
buffalo64:
Kann man das so machen oder ist das programmtechnisch "schlecht"?
"Ein Programm, das tut, was es soll, ist ein gutes Programm!" hat mir mal jemand geschrieben, das gebe ich weiter.
Aber Luft nach oben sehe ich schon. Konstanten sollten keinen kostbaren Variablenspeicher verschwenden und die Logik kann noch etwas bereinigt werden.
Eigentliches Problem ist aber die blockierende for-Schleife, die andere Aktivitäten verhindert. Mit einer blinkenden LED habe ich das mal verdeutlicht. So eine "Herzschlag-LED" sollte man anfangs immer einbauen, um Blockaden zu erkennen. Außerdem ist die Baudrate Zeitgeber für die Schleife.
Die for-Schleife ist nur zum Testen, weil es für mich schneller gegangen ist. Ich wollte hier nur testen, ob das mit der mehrfachen Verwendung des Tasters (Gelb dauerhaft während des Zyklus, der mit dem Taster gestartet wird und mit dem selben Taster dann zwischen rot und grün umschalten) mittels der if-Anweisungen funktioniert.
In meinem Sketch verwende ich dann die millis-Funktion für den Zyklus, aber diese ist für mich noch nicht so einfach zu durchschauen, das kommt noch....