Hallo blankdc
Werf mal einen Blick in diese praktische Übersicht:
Häää...
Was ist an der "external Pulldown" Methode böse?
Die meinen wohl, dass wenn PIN OUTPUT gesetzt ist: bei gedrücktem Taster kommts zum kurzen...
Ich wollte nur eine Lösung zu meinem Problem. Keine Arbeit aber Danke
Hallo,
ohne Flankenerkennung würde ja ein statisch gedrückter Taster , der bereits entprellt ist , dazu führen das mit dem gedrückten Taster immer weiter gezählt wird. Entprellen geht auch mit einem Hardware Tiefpass, Zählen allerdings immer noch nicht.
Deswegen macht man so was in Statemaschinen.
Das reicht mir nicht als Argument!
Denn auch die Flankenerkennung ist eine Statemachine
Andererseits, hast du damit zugegeben, dass eine Flankenerkennung benötigt wird.
Also reicht mir doch!
Hallo,
mein Vorschlag etwas q&d
Normal würde ich die lib Bounce2 verwenden
/*
* Anschluss Taster zwischen D2 und GND
*/
const byte btn = 2; // = pin D2
bool btnstate, lastbtnstate;
int i = 1;
void setup() {
pinMode(btn, INPUT_PULLUP); // Taster zwischen pin und GND
Serial.begin(9600);
}
void loop() {
delay(20); // schmutziges entprellen
btnstate = !digitalRead(btn);
if (btnstate == true && lastbtnstate == false) {
lastbtnstate=true;
Serial.println(i);
i++;
}
if (btnstate == false )lastbtnstate = false;
}
Ist das Anschauen der Schaltung etwa Arbeit für dich ?
Nein ich wollte nur eine Lösung zu meinem Problem und die habe ich. Mehr wollte ich nicht wissen. Aber trotzdem danke.
#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTools.h>
#include <CombieTypeMangling.h>
using namespace Combie::Millis;
using Taster = Combie::Pin::TasterGND<2>; // Taster zwischen Pin und GND(invertierend)
using Counter = Combie::Tools::Counter<unsigned int>;
Counter counter;
Taster taster;
Combie::Timer::EntprellTimer entprell {20_ms};
Combie::Tools::FlankenErkennung flankenerkennung;
void setup()
{
Serial.begin(9600);
taster.initPullup();
counter.onCount([](Counter &counter){Serial.println(counter);});
}
void loop()
{
counter = flankenerkennung = entprell = taster;
}
Ausgabe:
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
Alle Tastendrücke fein vereinzelt!
Erschließt sich mir auch nicht.
Passiert auch bei externen Pullup nur mit umgekehrten Logigstatus.
@paulpaulson
Dein Zitat in post #21 ist einfach falsch, so ein Tüpische FAlschinformation von Jemanden der die Hälfte verstansden hat und sich genötigt fühlt Sein Halbwissen falsch weiterzugeben.
Grüße Uwe
Noch späte Klarstellung bzw Zusammenfassung der einzelnen Fehler:
A6 ist beim NANO (mit ATmega329 ATmega328 in SMD) kein Digitaler Ein/Ausgang sondern nur ein analoger Eingang.
Darum hat pinMode(A6, INPUT) keinen Sinn.
analogRead(6) liest einen Digitalen Pin analog ein. Da das kein analoger Eingang ist, weiß ich jetzt nicht was der Arduino macht. Müßte man in einigen Bibliotheken nachforschen.
while (analogRead(6) == HIGH);
Das ist nur ein Bremsklotz der den Arduno anhält. Solange der Taster gedrückt ist passiert nichts. Die Zahl wird erst nach dem Loslassen ausgegeben.
Man muß wie Standart in der Technik den falschesten Verwendungsfall, den DAU (Dümmsten Anwender Ueberhaupt) und Haustiere berücksichtigen. Dieser besteht in diesem Fall in einer umgestürzten Blumenwase der Erbtante, die (die Vase, nicht die Erbtante) den Taster dauernd drückt. Mit einer Flankenerkennung und noch einzufügenden Tastendruckdauerüberschreitungserkennung kann der Sketh in einer gewollten Weise weiterarbeiten.
Besser ist eine Erkennung des L-H Übergangs für die Inkrementierung der Variablen und nachgeschaltenen H-L Übergang um das System in Ausgangszustand zu bringen.
if (i == 21) {
i = 1; // Nur zurücksetzen, wenn i 21 erreicht
}
Da ist besser i>=21 z schreiben. Das deckt man alle möglichen und unmöglich erachteten Möglichkeiten ab.
Grüße Uwe
[EDIT]Controllermodell korrigiert [/EDIT]
Eher nicht
Also zumindest auf einem Nano der gerade vor mir liegt ist das so:
analogRead(A6)
und
analogRead(20)
und
analogRead(6)
lesen alle den Analogwert von "A6" ein.
Warum das so ist, ist wohl in Arduino Core zu finden.
Also etwa in dieser Gegend:
und hier:
und "benachbarten" Files.
Uwe, auf welchen NANO Boards ist ein ATmega329 verbaut?
Aber das mit dem A6 ist korrekt.
sch..
Taste abgefehlt.
Der 328 ist gemeint.
Danke für die Korrektur
Uwe
Da muß ich prezisieren:
analogRead(6) liest theoretisch einen Digitalen Pin analog ein.
Da das kein analoger Eingang ist, weiß ich jetzt nicht was der Arduino macht.
Im Zusammenhang mit dem nächsten Satz ist meine Aussage nicht sooo falsch verständlich.
Danke uxomm für die Infos, was der Arduino dann wirklich macht.
Grüße Uwe
Da muß ich prezisieren:
analogRead(6) liest theoretisch einen Digitalen Pin analog ein.
Nach welcher Theorie das so ist, weiß ich nicht.
Praktisch ist es allerdings völlig egal ob du analogRead(6), analogRead(20) oder analogRead(A6) schreibst.
Es wird der gleiche Pin gelesen.
Die Erklärung/Beweis findet sich in #35
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.