noiasca:
Ich würde es an deiner Stelle dennoch noch zu Fuß machen um Sicherheit mit dem Umgang von millis() zu bekommen.
Ich weis, dass da die Meinungen auseinandergehen. Aber meiner Meinung nach muss man den direkten Umgang mit millis() nicht unbedingt wissen, wenn es Libs dazu gibt. Das Arduino-System ist ja prinzipell eher dazu gedacht, möglichst viel zu 'verstecken' und damit einen einfachen Zugang zu vielen Funktionalitäten zu ermöglichen. Wenn ich pinMode, digitalWrite und digitalRead nutze, muss ich ja auch nicht die darunterliegenden Portregister und Bitmasken kennen.
Wichtiger ist es meiner Meinung nach, das Prinzip der blockadefreien Programmierung zu verstehen. Und das ist einfacher, wenn man sich nicht auch noch mit den Details der millis() rumschlagen muss. Aber das muss er letztendlich selbst entscheiden.
odi77:
Bei meiner Modellbahn hab ich dann ja mehrere solcher Tasteraktionen, wie schaffe ich es da jetzt auch mehrere Sketches gleichzeitig am arduino am laufen zu haben.den.
Wie noiasca schon schrieb, geht das nicht mit mehreren Sketches. Vielmehr muss man alles in einen Sketch stopfen. Aber die MobaTools hießen ja nicht so, wenn es da nicht noch mehr gäbe als den Timer
.
Wichtig ist allerdings, dass Du dich mit Arrays und (for-) Schleifen beschäftigst. Das sind ganz grundlegende Programmierkenntnisse, die man unbedingt braucht, wenn es etwas komplexer wird.
Dann bieten dir die MobaTool auch noch die Verwaltung von vielen Tastern an. Allerdings musst Du die Taster zwischen den Pin und Gnd anschließen. Einen zusätzlichen Widerstand brauchst Du dann nicht mehr.
Damit kannst Du den Sketch dann recht einfach erweitern - hier erstmal für 5 Taster:
#include <MobaTools.h>
// Definition der Taster und zugehörigen Ausgänge
// Die Taster müssen zwischen dem Pin und Gnd angeschlossen werden, ein
// Widerstand ist nicht notwendig.
// Festlegen der Anschlußpins
const byte buttonPins[] = { 15, 16, 17, 18, 19 };
const byte ledPins[] = { 2, 3, 4, 5, 6};
const int effektDauer[] = { 10, 20, 5, 30, 60 }; // Dauer in Sekunden
const byte effektZahl = sizeof(buttonPins); // buttonPins MUSS als byte definiert sein
MoToTimer EffektZeit[effektZahl];
MoToButtons Taster( buttonPins, effektZahl, 20, 500 ) ; // 20ms Entprellzeit, 500ms für den Unterschied kurz/lang gedrückt.
void setup() {
for (byte i = 0; i < effektZahl; i++) {
// Die Taster müssen zwischen Pin und Gnd angeschlossen sein
pinMode(buttonPins[i], INPUT_PULLUP);
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
Taster.processButtons(); // Verwalten der Tasterpins;
for ( byte i = 0; i < effektZahl; i++ ) {
// Schleife über alle Taster
if ( Taster.pressed(i) ) {
// Taster wurde gedrückt
if ( EffektZeit[i].running() ) {
// Zeit läuft, abbrechen
EffektZeit[i].stop();
digitalWrite(ledPins[i], LOW);
} else {
// Zeit läuft nicht, neu starten
digitalWrite(ledPins[i], HIGH);
EffektZeit[i].setTime( effektDauer[i]*1000L );
}
}
if ( EffektZeit[i].expired() ) {
digitalWrite(ledPins[i], LOW);
}
}
}
Auf bis zu 16 Taster und Ausgänge kannst Du das nun ganz einfach aufbohren, indem Du einfach die Arrays am Anfang des Sketches entsprechend verlängerst. Sollen es mehr werden ( bis zu 32 ) geht das auch noch mit einer einzigen zusätzlichen Zeile.