Waarde aanpassen d.m.v van een button.

Beste Forumleden,

Ik kom er niet uit hoe ik een waarde kan aanpassen dmv een fysieke knop/button.

Ik ben bezig met een stappenmotor die pas gaat draaien als deze een signaal van een beweging sensor krijgt. Naar wat Google, knip en plak werk heb ik dit voor elkaar gekregen. Allemaal leuk en aardig.

Maar.... nou is de bedoeling dat de waarde ( die van het aantal omwentelingen van de stappenmotor) kan worden aangepast door het indrukken van button. En dat is andere koek.

De waarde is standaard 10 en dan moet deze met 2 knoppen naar boven en naar beneden kunnen worden bijgesteld. Kan iemand mij een zetje de juiste richting ingeven? Alvast bedankt!

goeiedag,

ik neem aan dat je de getal 10 naar beneden of omhoog wilt krijgen met 2 knoppen.
en ik neem aan dat als je de knop 1x indrukt het getal ook met 1 Omhoog of omlaag gaat.

knopstatus = digitalRead(Knop);
  if (knopstatus != laastestatus) { // kijk of knopstatus anders is dan laastestatus.
    if (knopstatus == HIGH) { // LOW als je Pullup gebruikt.
      Waarde10++; // OF --, dit zal de waarde 1 optellen of 1 aftrekken.
    }
  }
  laastestatus = knopstatus; // om er voor tezorgen dat het getal niet blijft optellen of aftellen als je hem ingedrukt houd.

kijk maar of je hier iets mee kan.

Bedankt voor je snelle reactie! Ik ga er mee aan het stoeien. Laat het je weten of het gelukt is.

Bedenk ook gelijk even of je een negatief resultaat wenst, en of je geen limiet wenst.
Als je negatief zou gaan, draai je dus de andere kant op (wel in de gaten houden dat dat dan ook werkelijk gebeurt).
Wanneer je niet negatief kunt worden, ga je na de nul ineens naar het maximaal haalbare getal.
Dat kan ook "interessant" zijn.

Moraal van dit verhaal:
Stel grenzen in.

het stukje spirit gaat wellicht te snel en doe er in het begin maar een delay tussen van 100 milliseconden.
later leer je nog wel omdat met een timer te doen.

shooter:
het stukje spirit gaat wellicht te snel en doe er in het begin maar een delay tussen van 100 milliseconden.
later leer je nog wel omdat met een timer te doen.

zelf nog nooit egt last van gehad.
alleen als ik het met me DUE doe dan heb ik wel eens last van debounce.
maar het ligt ook aan de knop die gebruikt.
ik heb 3 euro kostende!!!! hele lekker indrukbare digitast knopen en daar heb ik HEEEL! veel last van debouce.
en met de 0.05 cent kostende tactile switch Link heb ik er bijna nooit last van.

komt door het gewicht dat beweegt.
en of het vegende contacten zijn (vroeger in telefoontechniek waren er hele afdelingen alleen voor dat debounce.

Bedankt voor alle reactie's. Het heeft even geduurd, maar ik ben al een aardig eindje op weg.
alleen loop ik nou vast op het volgende:

de waarde van myStepper.step(20) moet worden aangepast en daar kan bovenaan niet mee begonnen worden.

En als ik deze i.p.v. de waarde10 in de hier bovengenoemde code zet. Dan maakt de motor 20 stapjes i.p.v. dan deze de motor waarden met 20 stapjes verhoogd. Zie hier onder de code tot zo ver. Ik mis nog een stukje. Maar welke??

void loop() { val = digitalRead(pirPin);

if (val == LOW) {
 
  
  }

else {

  Serial.println (" Draaien ");

  myStepper.step(20);  // deze waarde moet worden aangepast.
  

  delay(100);

}



//----------------------Button state --------------------------



  buttonState = digitalRead(buttonhigh);

  if (buttonState != lastButtonState) { // kijk of knopstatus anders is dan laastestatus.
    if (buttonState == HIGH) { // LOW als je Pullup gebruikt.
        myStepper.step(20+2); // OF --, dit zal de waarde 1 optellen of 1 aftrekken. Nu gaat de motor draaien als er op de button wordt gedrukt.

Is dit al je code ?
Waarom zet je steeds maar een stukje hier neer.
Zo loop je steeds weer tegen een volgend probleem aan omdat je niet alles laat zien en mensen die je willen helpen je daar dus niet eerder op kunnen wijzen.

Maak nog een variabele aan die het aantal te zetten stappen bepaalt.
Die variabele kun je bewerken door iets te doen met toetsen of wat je ook maar bedenkt.
Daarna stuur je het commando om te motor te bewegen, met als argument (wat er tussen de haakjes staat) niet meer een absolute waarde, maar die variabele.

Onderstaande code is op 4 plaatsen aangepast, waarvan 3 zouden moeten doen wat je vraagt.
Kijk even of je snapt wat er daar gebeurt, en laat eens weten wat je denkt dat er gebeurt.
Dan weten wij of je het begrijpt, en wat er eventueel nog veranderd en/of uitgelegd moet worden.

int Steps =20; // Maak een nieuwe variabele die de waarde 20 heeft en die overal geldt

void setup() {
  // Dit stukkie moet er ook in staan

}

void loop() { val = digitalRead(pirPin);

if (val == LOW) {
 
 
  }

else {

  Serial.println (" Draaien ");

  myStepper.step(Steps);  // deze waarde moet worden aangepast.
 

  delay(100);

}



//----------------------Button state --------------------------



  buttonState = digitalRead(buttonhigh);

  if (buttonState != lastButtonState) { // kijk of knopstatus anders is dan laastestatus.
    if (buttonState == HIGH) { // LOW als je Pullup gebruikt.
        Steps =(Steps+2); // OF --, dit zal de waarde 1 optellen of 1 aftrekken. Nu gaat de motor draaien als er op de button wordt gedrukt.

shooter:
het stukje spirit gaat wellicht te snel en doe er in het begin maar een delay tussen van 100 milliseconden.
later leer je nog wel omdat met een timer te doen.

Gaat nooit te snel, hij kijkt naar de state :wink: Debounce zal het wel makkelijk last van hebben. Maar wat is het toch altijd dat iedereen het wiel opnieuw wil uitvinden als het om knoppen gaat? Kies gewoon een leuke library en je bent klaar. Zelf ben ik fan van Bounce2. Code wordt dan iets als:

#include <Bounce2.h>

unsigned int stepSize = 10;
const unsigned int MinStepSize = 1;
const unsigned int MaxStepSize = 100;

const byte ButtonUpPin = 9;
const byte ButtonDownPin = 10;

Bounce buttonUp;
Bounce buttonDown;

void setup(){
  buttonUp.attach(ButtonUpPin, INPUT_PULLUP);
  buttonDown.attach(ButtonDownPin, INPUT_PULLUP);
}

void loop(){
  //read buttons
  buttonUp.update();
  buttonDown.update();
  
  //Check to increase or decrese stepSize
  if(stepSize < MaxStepSize && buttonUp.fell()){
    stepSize++;
  }
  else if(stepSize > MinStepSize && buttonDown.fell()){
    stepSize--;
  }
}

septillion:
Maar wat is het toch altijd dat iedereen het wiel opnieuw wil uitvinden als het om knoppen gaat?

Dat is een kwestie van de materie (willen) snappen.
Je kunt het ook niet interessant vinden en gewoon gaan shoppen tot je iets vind dat het probleem voor je oplost zonder dat je hoeft na te denken.
Maar als je alles zo aanpakt, dan kom je uiteindelijk uit op een andere manier van programmeren.
Die is er ook hoor, iets met blocks in de naam.
Als er dan geen lego steentje(s) voor je probleem is (zijn), dan word het wel een beetje zweten.
Prima hoor, als je zo wil werken.
Daarom heb je er ook de keus toe.
En anderen gaan liever weer iets anders te werk.
Ook niks mis mee, toch ?

ardublock of minibloq er zijn er nog een aantal zoals scratch.

Ik heb niets tegen het willen snappen. Maar niemand gaat toch eerst de Servo library uitpluizen? Of überhaupt al iets als digitalWrite() of Serial?

Het hele idee van Arduino is het aanleveren van hapklare brokken. En als je eenmaal door hebt (bijvoorbeeld door een test sketch uit een voorbeeldenboek ofzo) dat een knop last heeft van bounce en dat je wilt kijken dat de knop ingedrukt wordt en niet of deze ingedrukt is dan heb je geleerd. Kan je daarna gewoon die enorme spaghetti van code en variabele vervangen door een simpele library. Ik vind dat een debounce library standaard met Arduino zou moeten komen. Waarom Servo wel en iets veel gebruikt als dit niet?

Bedoel, Arduino IS al een hele versimpeling van wat er eigenlijk allemaal gebeurd. Dit zodat het beginnen wat laagdrempeliger is en je meer kunt leren als je verder gaat. Maar als je iets geleerd hebt kan je toch net zo goed de makkelijke tools hiervoor oppakken?

jouw stepper doet dus 20 stappen (want dat vraag je step(20)
deze opdracht 1 keer geven en niet in de loop zetten.

daar moet dus een variabele komen: stepper.step(getal)
en dat getal moet je veranderen met drukknoppen.
net als mas3 zegt waar is je hele code.