Cree led blink met potentiometer en button.

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 44
Geregistreerd: 21 Dec 2012, 15:23
Woonplaats: Drenthe

Cree led blink met potentiometer en button.

Berichtdoor B.Meijer » 30 Dec 2022, 14:41

Hallo,

Ik heb een vraagje over een stukje code.
Voor een lightpainting project ben ik bezig met een zaklamp te bedienen met een kabel van ongeveer 50cm.
De bedoeling is door middel van een potmeter de snelheid van het knipperen te veranderen. En te starten/stoppen met een drukknop.

Het stukje code dat ik heb gevonden is supermooi voor dit, alleen stopt het niet, maar pauzeert de cyclus. Hieronder de code.
Waar moet ik zoeken om dit pauzeren te veranderen in stoppen.
Zit door mijn beperkte kennis al dagen te speuren in boeken en websites maar kan het nog niet vinden.

Had wel iets gemaakt met een simpele delay, maar dan blijft het niet constant branden bij het uitdraaien van de potmeter.

Groet Bert

Code: Alles selecteren
 
#define LED_PIN 11
#define BUTTON_PIN 3
#define POTENTIOMETER_PIN A1

unsigned long delayBetweenBlink = 500;
unsigned long lastTimeLEDBlinked = 0;

unsigned long debounceDuration = 50; // millis
unsigned long lastTimeButtonStateChanged = 0;
byte lastButtonState = HIGH;

bool blinkEnabled = true;

byte LEDState = LOW;

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
}

void loop()
{
  unsigned long timeNow = millis();
  if (timeNow - lastTimeButtonStateChanged > debounceDuration) {
    byte buttonState = digitalRead(BUTTON_PIN);
    if (buttonState != lastButtonState) {
      lastTimeButtonStateChanged = timeNow;
      lastButtonState = buttonState;
      if (buttonState == HIGH) { // button has been released
        blinkEnabled = !blinkEnabled;
      }
    }
  }
 
  int potentiometerValue = analogRead(POTENTIOMETER_PIN);
  delayBetweenBlink = map(potentiometerValue, 0, 1024, 0, 2000);
 
  if (blinkEnabled) {
    if (timeNow - lastTimeLEDBlinked > delayBetweenBlink) {
      lastTimeLEDBlinked = timeNow;
      LEDState = (LEDState == HIGH) ? LOW : HIGH;
      digitalWrite(LED_PIN, LEDState);
    }
  }
}
Hou niet van de nachtdienst, maar wel van nachtfotografie

Advertisement

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

Re: Cree led blink met potentiometer en button.

Berichtdoor shooter » 31 Dec 2022, 12:16

blinkEnabled = !blinkEnabled;
dan weet je de stand nog niet want het programma is zo snel dat jouw knop al 1000 keer gevraagd is voordat jij de knop hebbediend.
dus die negatie gaat wel maar niet hier dus gewoon fals zeggen en ergens anders true
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Cree led blink met potentiometer en button.

Berichtdoor FonzieBonzo » 03 Jan 2023, 13:22

Als je de knippercode wilt laten stoppen in plaats van pauzeren, kun je een aparte variabele introduceren die bijhoudt of de knippercyclus moet worden gestopt. Je kunt deze variabele bijvoorbeeld stopEnabled noemen.

Je kunt dan het volgende doen:

Voeg een nieuwe variabele stopEnabled toe aan het begin van je code, net zoals je dat met blinkEnabled hebt gedaan. Zet deze variabele op false.

cpp code
bool blinkEnabled = true;
bool stopEnabled = false;


In de if-statement waarbij je controleert of de knop is ingedrukt, kun je stopEnabled op true zetten wanneer de knop wordt ingedrukt. Zo wordt de knippercyclus gestopt wanneer de knop wordt ingedrukt.

cpp code
if (buttonState == HIGH) { // button has been released
stopEnabled = true;
}


Voeg een nieuwe if-statement toe aan de knippercyclus die controleert of stopEnabled true is. Zo wordt de knippercyclus alleen uitgevoerd wanneer stopEnabled false is.

cpp code
if (!stopEnabled) {
if (timeNow - lastTimeLEDBlinked > delayBetweenBlink) {
lastTimeLEDBlinked = timeNow;
LEDState = (LEDState == HIGH) ? LOW : HIGH;
digitalWrite(LED_PIN, LEDState);
}
}


Zet stopEnabled op false wanneer de knop wordt losgelaten, zodat de knippercyclus opnieuw kan worden gestart wanneer de knop opnieuw wordt ingedrukt.

cpp code
if (buttonState == HIGH) { // button has been released
stopEnabled = false;
}


Met deze aanpassingen zal de knippercyclus stoppen wanneer de knop wordt ingedrukt, en opnieuw starten wanneer de knop opnieuw wordt ingedrukt. De potentiometer blijft gebruikt worden om de snelheid van het knipperen aan te passen.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten