Button met meerdere modussen

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 1
Geregistreerd: 21 Nov 2016, 14:14

Button met meerdere modussen

Berichtdoor Emmos » 22 Dec 2016, 13:18

Beste Forum leden.
Ik ben bezig met een project waar ik door middel van een neopixel strip verschillende weermodussen wil weergeven. Dit wil ik doen door met een button telkens naar de volgende weermodus te navigeren. Hetgeen waar ik nu mee zit is dat ik pas naar de volgende modus kan als een loop is afgelopen. Terwijl wat ik wil bereiken is dat ik naar een volgende modus kan wanneer ik mijn button indruk en dus niet hoef te wachten tot dat de loop is afgelopen.

Ik hoop dat jullie mij kunnen helpen.

Alvast bedankt!


Code: Alles selecteren
[code]
#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6
#define Pixels 15
Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(Pixels, PIN);

#define BG 1

// this constant won't change:
const int  buttonPin = 2;    // 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 f=7;
int waitTime = 30;

/* ---------------------------------------------------------------------Thunder*/
int brightVal=0;
int darkVal=0;
int delayVal=0;
int lightVal=0;
int flashVal=0;
int blinkTimes=0;

int brightVal2=0;
int darkVal2=0;
int delayVal2=0;
int lightVal2=0;
int flashVal2=0;
int blinkTimes2=0;

int r=0;
int g=0;
int b=0;

/* ---------------------------------------------------------------------Rain*/
int color;
int center = 0;
int step = -1;
int maxSteps = 16;
float fadeRate = 0.6;
int diff;

//background color
uint32_t currentBg = (0,0,200);
uint32_t nextBg = currentBg;

/* ---------------------------------------------------------------------Cloud*/

void setup() {
  // initialize the button pin as a input:
 // pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
 // pinMode(ledPin, OUTPUT);

  strip_a.begin();
  strip_a.show();
 
  // 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
      // wend from off to on:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    } else {
      // if the current state is LOW then the button
      // wend 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;


  // 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 == 1) {
    digitalWrite(ledPin, HIGH);
    Serial.println("modus1");
  }

if (buttonPushCounter == 2) {
    digitalWrite(ledPin, HIGH);
    Serial.println("modus2");
    ThunderLoop1();
  }
 
if (buttonPushCounter == 3) {
    digitalWrite(ledPin, HIGH);
    Serial.println("modus3");
    fadeInAndOutA(255, waitTime); // Red
}
 
if (buttonPushCounter == 4) {
    digitalWrite(ledPin, HIGH);
    Serial.println("modus4");
    ripple();
  }

if (buttonPushCounter == 5) {
    digitalWrite(ledPin, HIGH);
    Serial.println("modus5");
    Cloud(122, 228, 255, waitTime); // Red
    Cloud(88, 195, 255, waitTime); // Green
  }
 
}

/* ---------------------------------------------------------------------Weercijfer*/
void fadeInAndOutA(uint8_t red, uint8_t wait) {

  for(uint8_t b=25; b <255; b++) {
     for(uint8_t i=f; i < strip_a.numPixels(); i++) {
        strip_a.setPixelColor(i, red*b/255);
        //delay(20);
     }
     strip_a.show();
     delay(20);
  };
  delay(50);

  for(uint8_t b=255; b > 25; b--) {
     for(uint8_t i=f; i < strip_a.numPixels(); i++) {
        strip_a.setPixelColor(i, red*b/255);
        //delay(20);
     }
     strip_a.show();
     delay(20);
  };
  delay(50);

 };

/* ---------------------------------------------------------------------Thunder*/
 void ThunderLoop1(){
  // LEDs remain dark between 1000ms and 8000ms
  darkVal=random(1000,8000);
  darkVal2=random(3000,6000);
  // LEDs will flash between 2 and 21 times
  flashVal=random(2,21);
  flashVal2=random(2,21);
  for(int blinkTimes=0;blinkTimes<=flashVal;blinkTimes++){
    // LEDs will be a RGB value of 0 to 255 to vary brightness
    lightVal=random(255);
    // lightVal set to r, g, b. Can be changed to individual values for other colors
    r=lightVal;
    g=lightVal;
    b=lightVal;
    // LEDs will remain on between 20ms and 200ms
    brightVal=random(15,200);
    // Flashes will be delayed between 20ms and 500ms
    delayVal=random(20,700);
    strip_a.setPixelColor(0,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(1,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(12,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(3,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(14,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(5,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(6,strip_a.Color(r,g,b));
    strip_a.show();
    delay(brightVal);
    strip_a.setPixelColor(0,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(1,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(12,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(3,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(14,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(5,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(6,strip_a.Color(0,0,0));
    strip_a.show();
    //delay(delayVal);
  }

  for(int blinkTimes2=0;blinkTimes2<=flashVal;blinkTimes2++){
    // LEDs will be a RGB value of 0 to 255 to vary brightness
    lightVal2=random(0,255);
    // lightVal set to r, g, b. Can be changed to individual values for other colors
    r=lightVal2;
    g=lightVal2;
    b=lightVal2;
    // LEDs will remain on between 20ms and 200ms
    brightVal2=random(15,200);
    // Flashes will be delayed between 20ms and 500ms
    delayVal2=random(20,500);

    strip_a.setPixelColor(7,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(8,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(9,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(10,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(11,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(2,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(13,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(4,strip_a.Color(r,g,b));
    strip_a.show();
    delay(brightVal2);
    strip_a.setPixelColor(7,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(8,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(9,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(10,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(11,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(2,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(13,strip_a.Color(0,0,0));
    strip_a.show();
    strip_a.setPixelColor(4,strip_a.Color(0,0,0));
    strip_a.show();
    delay(delayVal2);
  }
  delay(darkVal);
}

/* ---------------------------------------------------------------------Rain*/
void ripple() {
  if (BG){
    if (currentBg == nextBg) {
      nextBg = (0,0,200);
    }
    else if (nextBg > currentBg) {
      currentBg++;
    } else {
      currentBg--;
    }
    for(uint16_t l = 0; l < Pixels; l++) {
      strip_a.setPixelColor(l, Wheel(currentBg, 0.1));
    }
  } else {
    for(uint16_t l = 0; l < Pixels; l++) {
      strip_a.setPixelColor(l, 0, 0, 0);
    }
  }


  if (step == -1) {
    center = random(Pixels);
    color = (0,0,200);
    step = 0;
  }

  if (step == 0) {
    strip_a.setPixelColor(center, Wheel(color, 1));
    step ++;
  }
  else {
    if (step < maxSteps) {
      strip_a.setPixelColor(wrap(center + step), Wheel(color, pow(fadeRate, step)));
      strip_a.setPixelColor(wrap(center - step), Wheel(color, pow(fadeRate, step)));
      if (step > 3) {
        strip_a.setPixelColor(wrap(center + step - 3), Wheel(color, pow(fadeRate, step - 2)));
        strip_a.setPixelColor(wrap(center - step + 3), Wheel(color, pow(fadeRate, step - 2)));
      }
      step ++;
    }
    else {
      step = -1;
    }
  }
 
  strip_a.show();
  delay(50);
}

int wrap(int step) {
  if(step < 0) return Pixels + step;
  if(step > Pixels - 1) return step - Pixels;
  return step;
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos, float opacity) {
 
  if(WheelPos < 85) {
    return strip_a.Color((WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity, 0);
  }
  else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip_a.Color((255 - WheelPos * 3) * opacity, 0, (WheelPos * 3) * opacity);
  }
  else {
    WheelPos -= 170;
    return strip_a.Color(0, (WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity);
  }
}

/* ---------------------------------------------------------------------Cloud*/
void Cloud(uint8_t red, uint8_t green, uint8_t blue, uint8_t wait) {

  for(uint8_t b=85; b <255; b++) {
     for(uint8_t i=0; i < strip_a.numPixels(); i++) {
        strip_a.setPixelColor(i, red*b/255, green*b/255, blue*b/255);
     }
     strip_a.show();
     delay(wait);
  };

  for(uint8_t b=255; b > 85; b--) {
     for(uint8_t i=0; i < strip_a.numPixels(); i++) {
        strip_a.setPixelColor(i, red*b/255, green*b/255, blue*b/255);
     }
     strip_a.show();
     delay(20);
  };
};


[/code]

Advertisement

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

Re: Button met meerdere modussen

Berichtdoor Koepel » 22 Dec 2016, 16:05

Dit:
Code: Alles selecteren
    strip_a.setPixelColor(0,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(1,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(12,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(3,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(14,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(5,strip_a.Color(r,g,b));
    strip_a.show();
    strip_a.setPixelColor(6,strip_a.Color(r,g,b));
    strip_a.show();
    delay(brightVal);
kun je vervangen door dit:
Code: Alles selecteren
    strip_a.setPixelColor(0,strip_a.Color(r,g,b));
    strip_a.setPixelColor(1,strip_a.Color(r,g,b));
    strip_a.setPixelColor(12,strip_a.Color(r,g,b));
    strip_a.setPixelColor(3,strip_a.Color(r,g,b));
    strip_a.setPixelColor(14,strip_a.Color(r,g,b));
    strip_a.setPixelColor(5,strip_a.Color(r,g,b));
    strip_a.setPixelColor(6,strip_a.Color(r,g,b));
    strip_a.show();
    delay(brightVal);
De .show() update de hele led strip. Je kunt eerst alle leds goed zetten, dan pas een update met .show() en daarna de delay().

Welk Arduino board heb je ?

Er zijn verschillende manier om te doen wat je wilt, maar ze zijn allemaal een stap ingewikkelder dan wat je nu hebt.

1 ) tinker till you drop
Je kunt een delay() vervangen door een eigen functie, die tijdens het wachten ook naar de knop kijkt. Vervolgens kun je uit die functie springen met een return waarde die aangeeft dat een knop is ingedrukt. Als je bijvoorbeeld drie functies diep zit, dan is het nodig om overal de return waarde in de gaten te houden, om weer helemaal terug te keren.
Als je vervolgens nog meer dingen wilt toevoegen, dan kan dat niet meer.

2 ) millis()
Met millis() kijk je of er op dat tijdstip iets gedaan moet worden. Dan zou je de sequence voor de leds in een tabel kunnen zetten. Als je random kleuren wilt, dan zou je een aparte waarde in die tabel kunnen zetten. Met millis() kun je daarnaast niet alleen naar de knop kijken, maar nog veel meer doen (sensors opvragen enzovoorts). Je sketch zal dan wel helemaal herschreven moeten worden. Je kunt proberen om een korte sequence voor de leds in een tabel te zetten, om te zien of je dat lukt.

3 ) FreeRTOS
Ik heb in het verleden meerdere multitasking libraries geprobeerd op een Arduino Uno. Het schijnt dat FreeRTOS de beste papieren heeft, en die ben ik nu voor het eerst aan het uitproberen. Je kunt dan een taak maken die de leds doet, en vanuit een andere taak kun je die taak deleten. De FreeRTOS is niet pre-emptive, dus ik denk dat er weinig mis kan gaan als je zomaar een taak stopt of delete. Het heeft veel consequenties voor de grootte van de stack en ik weet niet of er nog fouten in de library zitten. Als je dit voorbeeld ziet: https://github.com/feilipu/Arduino_FreeRTOS_Library/blob/master/examples/Blink_AnalogRead/Blink_AnalogRead.ino, en dat spreekt je erg aan, dan kun je dat misschien proberen wanneer je eerder met multitasking hebt gewerkt.

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

Re: Button met meerdere modussen

Berichtdoor shooter » 22 Dec 2016, 20:28

je werkt dus telkens een heel programma af, maar je wilt dus telkens een stapje zetten en dan terug naar de loop. dat doe je met een blink without delay ofwel een timer , en gebruik geen delay, want dan kun je echt helemaal niks.
je moet dus elke functie (en dus ook elke for loop) veranderen.
dus telkens als je een aanroep doet geef je een stappenteller mee die je dus telkens ophoogt als je een functie aanroept.
aan het eind staat de teller dus op 255 en dan roep je die functie niet meer aan. dan ga je terug naar het menu of je gaat naar de volgende functie in je lijst.
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten