Go Down

Topic: drukknop 5 keer indrukken alvorens een led gaat branden (Read 396 times) previous topic - next topic

gertneys

Hallo iedereen, 
Sinds deze week heb ik een starterskit aangekocht om samen met mijn zoontje de eerste stappen in de programmeer wereld te zetten. Momenteel willen we met een drukknopje werken, dit drukknopje zouden we bijvoorbeeld 5 keer moeten indrukken alvorens er een led gaat branden. In bijlage zit onze sketch, zou er iemand kunnen verbeteren/aanvullen/aanpassen, ... zodat we ons doel kunnen halen? We geraken er maar niet uit en hopen aan de hand van een voorbeeld de taal weer beter te snappen. Bedankt alvast, Groeten Gert en Cis

wildbill

Look at the state change example. You need to increment your count when the pin becomes pressed, not when it is pressed.

sebasdt1

hey gertneys,

Je zou tinkercad kunnen gebruiken voor het simuleren van de codeering als je niet weet wat het gaat doen. (deze oplossing is natuurlijk niet 100% water dicht)

Met dit programma kan je ook gebruik maken van code blokken. maakt het coderen makkelijker maar is niet alles.


Voor de volgende keer als je codeering klein is zou je gebruik kunnen maken van [.code][./code](min de puntjes) ookwel code brackets
hier heb voorbeeld gemaakt voor jullie op tinkercad sketch knop. (ook heb ik wat extra's toegevoegd) 
Deze link verloopt over 334 uur. als je er mee heb getinkerd dan staat hij in je eigen circuits.
als er nog vragen zijn vraag ze gerust!

(of pak de codeering hier:)
Code: [Select]
/*
  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
*/

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

const int ledPin = 13;       // the pin that the LED 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
int buttonPushCounter2 = 0;   // counter for the number of button presses
int buttonState2 = 0;         // current state of the button
int lastButtonState2 = 0;     // previous state of the button


void setup() {
  // initialize the button pins as a inputs:
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // 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++;
      if (buttonPushCounter >= 10) {//set a boundary for the counter. if the counter is higher than 10 set it to 10
        buttonPushCounter = 10;
      }
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // 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;


  buttonState2 = digitalRead(buttonPin2);
  // compare the buttonState to its previous state
  if (buttonState2 != lastButtonState2) {
    // if the state has changed, increment the counter
    if (buttonState2 == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter--;
      if (buttonPushCounter <= 0) { //set a boundary for the counter. if the counter is below 0 set it to 0
        buttonPushCounter = 0;
      }
      Serial.println("on");
      Serial.print("number of button pushes: ");
      Serial.println(buttonPushCounter);

    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState2 = buttonState2;


  // 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:
  if (buttonPushCounter == 5) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }



}



Koepel

gertneys, de State Change Detection sketch: https://www.arduino.cc/en/Tutorial/BuiltInExamples/StateChangeDetection.

sebasdt1, Ik kan de simulatie starten en de code wijzigen maar ik zie nergens een knop om het naar mijn eigen Tinkercad omgeving te kopiëren. Dat was vroeger wel mogelijk.

gertneys

hallo, 
Bedankt voor de hulp, dankzij jullie tips is het gelukt (zie bijlage).
Al vermoed ik wel dat het hier en daar efficiënter kan? op naar het volgende, ik begin de smaak te pakken te krijgen.
Groeten Gert

Koepel

Het kan beter, maar wat vooral beter kan is om de tekst van de code netjes te maken.
Als je ieder inspringen, iedere spatie, iedere komma goed zet, dan is vaak in één oogopslag te zien hoe de structuur van de code is.

Als je een beetje met de code husselt, dan kan de code ook wat beter.
Niet getest, maar volgens mij is dit hetzelfde:

Code: [Select]

const int buttonPin = 2;
const int ledPin = 13;
int buttonPushCounter = 0;
int lastButtonState = LOW;

void setup()
{
  pinMode( buttonPin, INPUT);
  pinMode( ledPin, OUTPUT);
}

void loop()
{
  int buttonState = digitalRead( buttonPin);
  if( buttonState != lastButtonState)
  {
    if( buttonState == HIGH)
    {
      buttonPushCounter++;
      delay( 10);        // een soort van ontdender van de knop

      if( buttonPushCounter == 5)
      {
        digitalWrite( ledPin, HIGH);
        delay( 5000);     // led aan gedurende 5 seconden
        digitalWrite( ledPin, LOW);
        buttonPushCounter = 0;    // start opnieuw met tellen
      }
    }
    lastButtonState = buttonState;
  }
}


Tijdens de delay van 5 seconden kun je niet kijken of de knop wordt ingedrukt. Daar zijn manieren voor om dan toch te kijken of de knop wordt ingedrukt. Dat komt later ;)

gertneys

hallo, 
Code heb ik aangepast, merci alvast!
Een delay van 10 was iets te krap denk ik (gaf storing), ik heb deze op 200 gezet en dat werkt.

Nogmaals bedankt, 
Groeten Gert

sebasdt1

beste gert,

de volgende uitdaging is om millis() te gebruiken inplaats van delay.
Het is namelijk zo dat delay de volledige codering stopt en als er iets anders moet gebeuren in de tussen tijd dan kan dat niet. (met uitzondering van interupts) en met millis gaat het wel of makkelijker.

Millis() wordt vaak gebruikt in het debouncen (dedenderen) van knoppen en het vervangen van lange delays.
(dat is de storing waar je het over heb, het denderen van het contact)

Om hier een begin hier mee te maken kan je gebruik maken van blink without delay.
het is namelijk wel zo dat het zo op deze manier telkens een stukje complexer wordt.

Code: [Select]
/*
  Blink without Delay

  Turns on and off a light emitting diode (LED) connected to a digital pin,
  without using the delay() function. This means that other code can run at the
  same time without being interrupted by the LED code.

  The circuit:
  - Use the onboard LED.
  - Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA
    and ZERO it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN
    is set to the correct LED pin independent of which board is used.
    If you want to know what pin the on-board LED is connected to on your
    Arduino model, check the Technical Specs of your board at:
    https://www.arduino.cc/en/Main/Products

  created 2005
  by David A. Mellis
  modified 8 Feb 2010
  by Paul Stoffregen
  modified 11 Nov 2013
  by Scott Fitzgerald
  modified 9 Jan 2017
  by Arturo Guadalupi

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
*/

// constants won't change. Used here to set a pin number:
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}



sebasdt1


sebasdt1, Ik kan de simulatie starten en de code wijzigen maar ik zie nergens een knop om het naar mijn eigen Tinkercad omgeving te kopiëren. Dat was vroeger wel mogelijk.
kan je misschien proberen om in de bibilotheek te zoeken naar mijn naam (sebasdt).
het zou kunnen dat hij daar tussen staat. (ik heb ook een quad H brug gemaakt)
als het goed is staat hij daar.

Koepel

zoeken naar mijn naam (sebasdt).
Ja, dan lukt het wel :D

Het is een beetje omslachtig:
In mijn eigen "dashboard" rechtsboven op het vergrootglas klikken om te zoeken.
Dan op "Mensen" klikken, jouw naam invullen en op Enter drukken
Daar naar toe, dan op "Circuits" klikken.
Daar zie ik twee circuits die openbaar zijn. Dan kan ik er eentje aanklikken.
En ja hoor, dan staat er een knop bij: "Kopieer en Tinker".

Ik probeerde nog eens via die link in bericht #2, maar dan krijg ik dus echt niet die knop "Kopieer en Tinker".
Tinkercad geeft zelf deze link bij je project: https://www.tinkercad.com/things/8qSgMszBdcw en dan verschijnt die knop wel. Als ik echter via mijn eigen Dashboard zo'n link probeer te vinden van mijn eigen projecten, dan kan ik die niet vinden.

Go Up