Knop en switch case

algemene C code
Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Knop en switch case

Berichtdoor Pexy » 12 Dec 2019, 11:09

Goedendag allemaal,

Graag vraag ik om hulp voor mijn sketch.
De bedoeling is dat als de knop bijvoorbeeld 1 seconde wordt ingedrukt er een sequence gaat starten, nu bijvoorbeeld met een ledje die 2x aan en uit gaat met een interval van 2 seconden.
De sketch werkt, maar ik wil dat zolang de sequence bezig is er niet gereageerd wordt op de knop.
Pas als de sequence afgelopen is mag de knop weer werken.
Hoe is dat het beste toe te passen?

Alvast bedankt.

cpp code
//
// ARDUINO IDE: 1.8.9
// AUTHOR: Pexy
// VERSION: 1.0
// DESCRIPTION: Knop 1 sec. indrukken en dan sequence starten
// DATE: --/12/2019
//

const byte knopPin = 5;
const byte ledPin = 13;

// De staat van knop
int buttonState;
int prevButtonState;

// Variabelen voor knop
unsigned long previousMillis;
const unsigned long timeOut = 1000UL;
bool loopTijd = false;

// Variabelen voor switch case
bool actief = false;
int sequence = 1; // 1 is de eerste sequence variabel
unsigned long sequence_previousMillis;
const unsigned long interval_1 = 2000UL;


void setup()
{
Serial.begin(115200);
pinMode(knopPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}


void loop()
{
buttonState = digitalRead (knopPin);
if (buttonState != prevButtonState)
{
// Wanneer de staat van knop laag is start de looptijd
if (buttonState == LOW)
{
loopTijd = true;
previousMillis = millis();
}
else
{
loopTijd = false;
}
}
prevButtonState = buttonState;

// Wanneer de looptijd voorbij is start functie "actief" met daarin de sequence (case 1)
if (loopTijd)
{
if (millis() - previousMillis >= timeOut)
{
loopTijd = false;
sequence = 1;
actief = true;
}
}


if (actief)
{
switch (sequence)
{
case 1:
if (millis() - sequence_previousMillis >= interval_1)
{
sequence_previousMillis = millis();
{
sequence = 2;
}
}
break;

case 2:
digitalWrite(ledPin, HIGH);

if (millis() - sequence_previousMillis >= interval_1)
{
sequence_previousMillis = millis();
{
sequence = 3;
}
}
break;

case 3:
digitalWrite(ledPin, LOW);

if (millis() - sequence_previousMillis >= interval_1)
{
sequence_previousMillis = millis();
{
sequence = 4;
}
}
break;

case 4:
digitalWrite(ledPin, HIGH);

if (millis() - sequence_previousMillis >= interval_1)
{
sequence_previousMillis = millis();
{
sequence = 5;
}
}
break;

case 5:
digitalWrite(ledPin, LOW);

if (millis() - sequence_previousMillis >= interval_1)
{
sequence_previousMillis = millis();
{
actief = false;
}
}
break;
}
}
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Knop en switch case

Berichtdoor shooter » 12 Dec 2019, 11:22

als de sequence start dan zet je een vlag aan bijvoorbeeld bezig=true;
als het gedaan is dan zet je die vlag weer uit zoals bezig=false; mag ook zijn !true trouwens.
maar dat doe jij al met actief dus wellicht staat het op verkeerde plaats maar dat kun je zelf uitzoeken
je mag schrijven if (actief &&!bezig) {}
paul deelen
shooter@home.nl

Berichten: 50
Geregistreerd: 12 Mrt 2016, 23:38

Re: Knop en switch case

Berichtdoor Pexy » 13 Dec 2019, 09:54

maar dat doe jij al met actief dus wellicht staat het op verkeerde plaats

Heb het inderdaad kunnen oplossen met het aanpassen van dit stukje:
cpp code
if (buttonState == LOW) 
{
if (!actief)
{
loopTijd = true;
previousMillis = millis();
}
}

Nu wordt de knop genegeerd totdat de sequence afgelopen is.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 9 gasten