een drukknop 4 keer drukken dan led aan

Arduino specifieke Software
Gebruikers-avatar
Berichten: 317
Geregistreerd: 15 Nov 2015, 11:54

Re: een drukknop 4 keer drukken dan led aan

Berichtdoor Gij Kieken » 13 Jun 2019, 23:59

Het opzuiveren van de code en meerdere voorwaarden inbouwen laat ik aan jouw over.
Anders is de pret eraf .
Het is zeker niet de beste code maar vele wegen leiden naar Rome.
Experimenteer ermee en probeer nog voorwaarden in te bouwen (8 keer drukken modulo.....)
Code: Alles selecteren
/*
  State change detection (edge detection)

  Often, you don't need to know the state of a digital input all the time, but
  you just need to know when the input changes from one state to another.
  For example, you want to know when a button goes from OFF to ON. This is called
  state change detection, or edge detection.

  This example shows how to detect when a button or button changes from off to on
  and on to off.

  The circuit:
  - pushbutton attached to pin 2 from +5V
  - 10 kilohm resistor attached to pin 2 from ground
  - LED attached from pin 13 to ground (or use the built-in LED on most
    Arduino boards)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonStateChange
*/
// ---------------------------------------------------------
// De code is wat aangepast om een puls te geven na modulo 4
// keer drukken op een knop
// ---------------------------------------------------------
// Als alles naar je zin verloopt commentarieer dan de volgende regel
#define DEBUG
// Variabelen en constanten nodig voor de sequentie
unsigned long previousMillis;
const unsigned long sequenceTime = 2000UL; // 2 seconden
bool startSequence = false; // De tijd waarin je moet drukken
const int pulsTime = 500; // Zorgt voor een puls van 1/2seconde

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

void setup() {
// initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
// initialize the LED as an output:
  pinMode( LED_BUILTIN, OUTPUT);
// initialize serial communication:
#ifdef DEBUG
  Serial.begin(9600);
#endif
}

void loop() {
  unsigned long currentMillis = millis(); // Houd te tijd bij
// read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
    if (buttonState == HIGH) {
// if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
#ifdef DEBUG
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
#endif
      if ( !startSequence) { // Start de looptijd
        previousMillis = currentMillis;  // remember this time
        startSequence = true; // enable the timer
#ifdef DEBUG
        Serial.println( "De Knop is ingedrukt en de tijd loopt.");
#endif
      }
    }
// Delay a little bit to avoid bouncing
    delay(50);
  }
// save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;
// Kijk of je binnen de tijd 4 keer gedrukt heb
  if (startSequence) { // loopt de tijd ?
    if ( currentMillis - previousMillis >= sequenceTime) {
      startSequence = false; // zet terug af, 1-keer doorlopen
// Turns on the LED every four button pushes by checking the modulo of the
// button push counter. The modulo function gives you the remainder of the
// division of two numbers:
// Hier kun je nog meer voorwaarden defineren
      if (buttonPushCounter % 4 == 0) {
        digitalWrite(LED_BUILTIN, HIGH);
      }
      buttonPushCounter = 0;  // Reset de teller
#ifdef DEBUG
      Serial.println( "De 2 seconden zijn voorbij.");
#endif
// Hier blijft de code hangen,maar in dit geval maakt het niet uit
      delay (pulsTime); // Wacht tot de pulstijd voorbij is
      digitalWrite(LED_BUILTIN, LOW); // Schakel de Led of relais uit
    }
  }
}

Advertisement

Gebruikers-avatar
Berichten: 2013
Geregistreerd: 06 Aug 2016, 01:03

Re: een drukknop 4 keer drukken dan led aan

Berichtdoor Koepel » 14 Jun 2019, 00:34

@britting, je bent goed op weg, maar een zetje van Gij Kieken was wel nodig.

Sketch van britting:
Kun je voortaan de code tags gebruiken ? Er is een knop "Code" en als je de code tussen code tags zet, dan ziet het er beter uit.
Het denderen tegen gaan en dat te scheiden van de rest met een aparte functie "debounce()" is heel goed.
Die functie debounce() geeft altijd iets terug. Als de ingang nog flink staat te denderen, en het nog niet mogelijk is te zeggen wat het wordt, dan zou zo'n functie eigenlijk terug moeten melden: "ik weet het nog niet".
Nederlandse namen voor de variabelen is geen enkel probleem.
Als je een zelfde soort stukje code steeds herhaalt, dan kun je aanvoelen dat het eenvoudiger kan. Ik bedoel die "if(teller == 1), if(teller==2)", enzovoorts.
De variable "boolean" is iets van Arduino. In de C++ taal heet zo'n variabele een "bool".
Stel dat ik een timer met millis() voor het gemak een "kookwekker" noem. Als de kookwekker afloopt, dan moet opnieuw begonnen worden. Kun je vertellen wat je wilt ?
1) Vanaf het eerste moment dat een knop wordt ingedrukt de kookwekker starten. Dan wil je dus eigenlijk dat de laatste vier binnen de tijd zijn. Bijvoorbeeld 4 keer drukken binnen 1 seconde.
2) Bij iedere keer dat de knop wordt ingedrukt de kookwekker starten (dat is eenvoudiger). Bijvoorbeeld de pauze tussen de knoppen indrukken niet langer dan 300ms (dan wordt het totaal 1.2 seconden).

Sketch van Gij Kieken:
Ik zie dat je het StateChangeDetection voorbeeld ( https://www.arduino.cc/en/Tutorial/StateChangeDetection ) hebt uitgebreid.
Het commentaar kun je beter in laten springen, in lijn met de code. De DEBUG maakt het nog wat lastiger om te lezen.
Wanneer iemand vier keer op de knop drukt, dan doe je nog niets. Er wordt gewacht totdat de tijd verloopt en dan pas kijk je over er 4 of 8 of 12 keer gedrukt is. Dat kan beter :geek:

Gebruikers-avatar
Berichten: 317
Geregistreerd: 15 Nov 2015, 11:54

Re: een drukknop 4 keer drukken dan led aan

Berichtdoor Gij Kieken » 14 Jun 2019, 08:35

Hey,Koepel
Leuk opgemerkt, de bedoeling is dat Britting zelf eens goed nadenkt en het wat opschoont.
Het wachten deed ik met opzet.
Het trukje met Debug mag er gerust uit zeker voor zo een kort stukje code,dat was even een geintje en nogmaals een aanzet om Britting tot denken aan te zetten.

Berichten: 7
Geregistreerd: 08 Jun 2019, 00:35

Re: een drukknop 4 keer drukken dan led aan

Berichtdoor britting » 15 Jun 2019, 22:54

bedankt voor de hulp, fantastisch.
nu snap ik het, het is goed gekomen .
als ik iets vraag dan ben ik eerst al uren bezig geweest ,
ik ben er pas mee begonnen met programmeren .
bedankt voor jullie tijd .

Gebruikers-avatar
Berichten: 317
Geregistreerd: 15 Nov 2015, 11:54

Re: een drukknop 4 keer drukken dan led aan

Berichtdoor Gij Kieken » 16 Jun 2019, 12:04

Is altijd prettig als er feedback komt.
Het is de bedoeling zoals reeds eerder vermeld om de code wat op te zuiveren.
Inspringingen voorzien waar nodig en eventueel het commentaar wijzigen in een voor jouw verstaanbare tekst.
Een opdrachtje zou kunnen zijn de vaste modulo 4 te wijzigen in een variable en een paar testjes uitvoeren.
Een button klik toevoegen zo dat je hoort als je de drukknop indrukt.
Een melodietje afspelen bij juiste code ingave.
Een peut toon bij foutieve ingave.
etc...

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Koepel en 2 gasten