RE: Arduino-Hilfe benötigt: Zugkraftmesswagen

#26 von MicroBahner , 01.09.2019 21:01

Hallo Frank,
wenn Du es nicht-blockierend brauchst, geht es leider nicht mehr ganz so einfach. Du musst dann den Zeitpunkt des Drückens und des Loslassens als jeweils eigene Ereignisse erkennen, damit der Arduino zwischen diesen Ereignissen normal im loop weiterlaufen kann. So wie Du es versucht hast, würde ja die Zeit beim gedrückten Taster ständig neu gestartet und nie ablaufen.
Hinzu kommt, dass Du den Taster jetzt auch noch entprellen musst, da Du sonst zuviele 'Drücken' und 'Loslassen' Ereignisse bekommst.
Das Entprellen geht am einfachsten, indem der Taster nicht zu oft sondern nur so alle 10-20ms abgefragt wird ( hängt von der Prellzeit des Tasters bzw Reedkontaktes ab). Wenn Du loop-Zeiten in der Größenordnung hast ( oder akzeptieren und per 'delay' einstellen kannst ) geht es ohne ein explizites Entprellen. Dann entprellt die Loopzeit.
Die Flanke erkennst Du, wenn Du dir bei jedem Abfragen des Tasters den 'alten' Zustand für die nächste Abfrage merkst, und so eine Änderung ( das 'Drücken' bzw.. 'Loslassen' ) erkennen kannst. Beim Ereignis 'Drücken' wird die Zeit gestartet, und beim Ereignis 'Loslassen' wird geschaut, ob die Zeit abgelaufen ist oder nicht.


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino-Hilfe benötigt: Zugkraftmesswagen

#27 von MicroBahner , 01.09.2019 21:39

Mal ein kleiner Sketch, um das Prinzip zu zeigen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
/* Betätigungsdauer Taster erkennen
*/
#include <MobaTools.h>
 
EggTimer Prellzeit;
const int entprellZeit = 20; // in ms
const byte warteZeit = 100; // = 2sek, in Entprellzeit-Einheiten
int warteZaehler; // Zaehler für die Länge des Tastendrucks
bool tasterStatus = HIGH; // aktueller Tasterstatus
const byte tasterPin = 12;

void setup() {
Serial.begin( 115200 );
pinMode( tasterPin, INPUT_PULLUP );
Prellzeit.setTime( entprellZeit );
}
 
void loop() {
// Länge eines Tastendruckes auswerten
if ( ! Prellzeit.running() ) {
// Taster nur alle 20ms ( Entprellzeit ) abfragen
Prellzeit.setTime( entprellZeit );
warteZaehler ++;
// Taster abfragen
if ( tasterStatus != digitalRead( tasterPin ) ) {
//Flankenwechsel am Taster
if ( tasterStatus == HIGH ) {
// Taste wurde gedrückt, Zeit starten
warteZaehler = 0;
tasterStatus = LOW;
} else {
// Taste wurde losgelassen, auswerten
tasterStatus = HIGH;
if ( warteZaehler < warteZeit ) {
Serial.println("kurz gedrückt");
} else {
Serial.println("lang gedrückt");
}
}
}
}
// hier kann beliebiger weiterer Code stehen, der ständig im loop abgearbeitet wird
}
 


viele Grüße
Franz-Peter
Ein 'elektromechanisches' Stellwerk
Der (ehemalige) 'Eisberg'


 
MicroBahner
Metropolitan (MET)
Beiträge: 2.833
Registriert am: 28.11.2012
Ort: Mittelfranken
Gleise Tillig Elite
Steuerung Eigenbau
Stromart Analog


RE: Arduino-Hilfe benötigt: Zugkraftmesswagen

#28 von fbstr , 01.09.2019 22:01

Danke Franz-Peter,
das werde ich diese Woche mal versuchen umzusetzen.


Gruss
Frank
---------------------------------------------------------------------------------------------------------------------
MobaLedLib Wiki
Projekt "Bahnpark Augsburg"
Stummitreff BB: jeden 3. Freitag im Monat im Haus Sommerhof in Sindelfingen


 
fbstr
Metropolitan (MET)
Beiträge: 2.535
Registriert am: 28.08.2016
Ort: Stuttgart
Gleise Peco Code 75, Trix C
Spurweite H0, H0e
Steuerung YD7001, MobaLedLib, MirZ21, Lenz LZV100
Stromart DC, Digital


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz