Hi,
angenommen man hat 2 Taster.
Drückt man den ersten Taster, dann soll ein Timer bis 10 Sekunden zählen.
Wenn in diesen 10 Sekunden jedoch der Taster losgelassen wird, dann soll sich der Timer seinen Zustand merken. Drückt man den gleichen Taster soll normal mit dem Zählen fortgefahren werden. Wenn jedoch der andere Taster gedrückt wird, soll der Timer hinunter zählen.
Wie kann man das am Besten programmiertechnisch lösen?
abv_dipl_htl:
Was meint ihr mit Entprellen? Und warum spielt das überhaupt für das gewünschte Programm eine Rolle?
und was genau ist millis?
Sorry, aber bei diesen Fragen kann ich nur antworten:
Bitte lerne die Basics.
Wenn du mit den Beispielen der IDE durch bist, dann wird dir einiges klarer und die Grundlagen sind ein wichtiger Bestandteil um selbst Programme zu erstellen.
Entprellen ist in dieser Funktion wichtig , da jeder Taster (mechanischer Kontakt) beim Schließen prellt und damit mehrfach Kontakt gibt. Drückst du den Taster vermeintlich ein mal, können so sehr viele Impulse entstehen.
Und millis, lies dir dazu "BlinkWithoutDelay" durch, da wird es beschrieben.
abv_dipl_htl:
Was meint ihr mit Entprellen? Und warum spielt das überhaupt für das gewünschte Programm eine Rolle?
und was genau ist millis?
„Prellen“ ist das schnelle Wechseln zwischen „an“ und „aus“, wenn der Taster noch nicht ganz gedrückt ist. Bei Tastaturen ist das besonders blöd, weil man z. B. drei Buchstaben bekommt, wenn man nur einmal gedrückt hat. Entprellen macht man zum Beispiel, indem man zwischen dem ersten „an“-Signal und dem „Akzeptieren“ des Tastendrucks eine kurze Pause macht. Dabei geht es oft nur um sehr kurze Pausen (Millisekunde oder so).
„millis“ ist die Abfrage eines Zählers, der ständig läuft (auch, wenn sonst gerade ein Programm abgearbeitet wird). Der Vorteil von millis besteht darin, dass man Pausen in ein Programm einbauen kann, ohne delay() benutzen zu müssen. Mit delay() wird der Programmablauf vollständig gestoppt („blockiert“).
Oder seid Ihr wirklich ein Team aus mehreren Leuten und absolut keiner von Euch kann irgendeine Zeile Arduino-Code unfallfrei geradeaus programmieren, obwohl ein (halbwegs sinnvolles) Ablaufdiagramm vorliegt?
// Buttons anschliessen:
// Ein Anschluss an GND, der andere an den definierten Pin
const byte taster1Pin=2;
const byte taster2Pin=3;
const long maxCount=10000; // maximaler Zählerstand in Millisekunden
void setup()
{
Serial.begin(9600); // zum seriellen Debuggen
Serial.println("Good night and good luck");
pinMode(taster1Pin, INPUT_PULLUP);
pinMode(taster2Pin, INPUT_PULLUP);
}
unsigned long lastMillis;
long countMillis;
void loop()
{
long nowMillis= millis(); // aktuellen Stand des Millisekundenzählers
long diff= nowMillis-lastMillis; // Veränderung?
if (diff==0) return; // keine Veränderung ==> loop verlassen
boolean displayNeedsUpdate=false;
lastMillis+=diff; // letzten Stand des Millisekundenzählers merken
// taster1Pin abfragen und hochzählen falls gedrückt
boolean taster1= (digitalRead(taster1Pin)==LOW);
if (taster1) // Taster1 gedrückt?
{
countMillis+=diff; // hochzählen
if (countMillis>maxCount) countMillis=maxCount; // obere Grenze beachten
displayNeedsUpdate=true;
}
// taster2Pin abfragen und runterzählen falls gedrückt
boolean taster2= (digitalRead(taster2Pin)==LOW);
if (taster2) // Taster2 gedrückt?
{
countMillis-=diff; // rimterzählen
if (countMillis<0) countMillis=0; // untere Grenze 0 beachten
displayNeedsUpdate=true;
}
// Zählerwert beo Bedarf irgendwo anzeigen, z.B. auzf Serial:
if (displayNeedsUpdate) Serial.println(countMillis/1000.0,3);
}
Wenn die zeitliche Auflösung zu gering ist, also die ausgegebenen Zählerstände zeitlich zu weit auseindander liegen, kannst Du die Aktualisierungsrate des Zählers erhöhen, indem Du die Baudrate (im Programm und im seriellen Monitor) auf jeweils 115200 Baud setzt.
Serenifly:
Genauer ist es das mechanische Prellen der Kontakte. Wenn man einen Kontakt schließt dann spring er ein paar mal hin und her bis er richtig aufliegt.
Ist dieses Prellen tatsächlich mechanisch bedingt? Ich dachte bislang, dass es die „Art“ von Prellen ist, mit der man (alte) Lichtschalter dazu bringen konnte, eine Glühbirne zu „dimmen“.
gregorss:
Ist dieses Prellen tatsächlich mechanisch bedingt? Ich dachte bislang, dass es die „Art“ von Prellen ist, mit der man (alte) Lichtschalter dazu bringen konnte, eine Glühbirne zu „dimmen“.
Prellen ist wirklich ein mechanisches Hüpfen des beweglichen Teils des Kontakts auf dem feststehenden da der bewegliche Teil mittels Feder an den feststehenden gedrückt wird.
Es gibt einige Konstruktionen die nicht prellen. Eine Möglichkeit davon sind Reedkontakte (2 metallzungen ziehen sich magnetich durch ein externes Magnetfeld an .