mastershredder:
Zum Sketch: Ich weiß zwar nicht was der genau machen soll, aber wenn ich ihn starte steht zuerst 1 da, wenn ich dann paar mal drücke steht irgendwann dann 2 da. Also ich muss immer ein paar mal drücken dann ändert sich die Zahl mal von 1 auf 2 oder umgekehrt.
Nein nicht ein paar mal.
Das zählen geht im 50 25 millisekundentakt - so schnell kannst Du die Taste gar nicht bedienen.
Sollte Dir das zu langsam sein, ändere "bouncetime".
Das lässt sich sogar einfach mit einem Stück Draht zwischen GND und PIN2 ausprobieren:
12:35:56.957 -> 1
12:35:57.023 -> 2
12:35:57.454 -> 1
12:35:57.752 -> 2
12:35:58.250 -> 1
12:35:58.548 -> 2
12:35:58.814 -> 1
12:35:58.980 -> 2
12:35:59.112 -> 1
12:35:59.244 -> 2
12:35:59.311 -> 1
12:35:59.344 -> 2
12:35:59.742 -> 1
12:35:59.776 -> 2
12:35:59.875 -> 1
12:35:59.941 -> 2
12:36:00.074 -> 1
12:36:00.140 -> 2
12:36:00.206 -> 1
12:36:00.339 -> 2
12:36:00.471 -> 1
12:36:00.604 -> 2
12:36:00.637 -> 1
Deine Frage war:
jetzt zum 1ten oder zum 2ten mal den Button gedrückt habe.
Ich bin davon ausgegangen, das Du die Anzeigen umschalten willst.
Also Start mit: 1
einmal gedrückt: 2
nochmal gedrückt: 1
Das das auch funktioniert, - anders als von Dir beschrieben - kannst Du einfach mit einer seriellen Ausgabe austesten, indem Du nur auf dem SerMon ausgibst.
Genau der selbe Sketch wie oben - nur Ausgabe nicht auf den Displays:
// Forensketch
// basiert auf: https://forum.arduino.cc/index.php?topic=731437.msg4928344#msg4928344
// getestet - Ausgaben siehe oben
// #include <SevSeg.h>
// SevSeg sevseg;
int button = 2; //Button pull up
int buttonSig = 0; //Button pull up
void setup()
{
byte digitPins[] = {3, 4};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool updateWithDelays = false; // Default 'false' is Recommended
bool disableDecPoint = true;
// sevseg.begin(COMMON_ANODE, 2, digitPins, segmentPins, updateWithDelays, disableDecPoint);
// sevseg.setBrightness(90);
pinMode(button, INPUT_PULLUP); //Button pull up
Serial.begin(115200);
}
void loop()
{
// sevseg.setNumber(readTaste());
// sevseg.refreshDisplay();
readTaste();
}
int readTaste() {
static int disp = 1;
const int maxdisp = 2;
static unsigned long lastmillis = millis();
const unsigned long bouncetime = 25; // in ms
static bool laststate = HIGH;
if (millis() - lastmillis > bouncetime) { // prellen der Taste unterdrücken
if (!digitalRead(button) && laststate) { // Taste gedrückt?
lastmillis = millis(); // Zeit merken
laststate = !laststate; // Tastendruck merken
disp++; // hochzählen
if (disp > maxdisp) { // begrenzen
disp = 1;
}
Serial.println(disp); // Ausgabe:
}
else if (digitalRead(button)) { // Taste losgelassen?
laststate = HIGH; // zurücksetzen
}
}
return disp; // zurückgeben
}
Mit einer vernüftigen Beschreibung, was Du tatsächlich willst, wäre das viel einfacher!
Es geht darum, dass der Arduino nicht CHECKT ob ich jetzt zum 1ten oder zum 2ten mal den Button gedrückt habe. Ich habe Tausend Variationen versucht. IF IF, IF ELSE IF, IF ELSE, jetzt habe ich es mit einer && Verknüpfung es will nicht funktionieren. Es wird immer beim ersten drücken gleich 2 ausgewählt.
Du wolltest nicht mit 2 anfangen.
Jetzt willst Du nicht mit 1 anfangen.
Und nu?
PS: Kannst natürlich auch alles rundrum selber machen und nur zählen. Ersetze loop und readTaste:
void loop()
{
// sevseg.setNumber(readTaste());
// sevseg.refreshDisplay();
static int zaehler = 0;
if (readTaste()) {
zaehler++;
Serial.print(F("Zaehler: "));
Serial.println(zaehler);
}
}
bool readTaste() {
static unsigned long lastmillis = millis();
const unsigned long bouncetime = 25; // in ms
static bool laststate = HIGH;
bool tastendruck = LOW;
if (millis() - lastmillis > bouncetime) { // prellen der Taste unterdrücken
if (!digitalRead(button) && laststate) { // Taste gedrückt?
lastmillis = millis(); // Zeit merken
laststate = !laststate; // Tastendruck merken
tastendruck = HIGH;
Serial.print(F("Taste gedrückt?: "));
Serial.println(tastendruck); // Ausgabe:
}
else if (digitalRead(button)) { // Taste losgelassen?
laststate = HIGH; // zurücksetzen
}
}
return tastendruck; // zurückgeben
}