Go Down

Topic: code lichtaansturing omzetten naar NlinkWithoutDelay (Read 176 times) previous topic - next topic

deodutie

Ik ben bezig aan een project waarbij er een serie van 20 verlichtingszones in verschillende patronen knippert. Ik ben momenteel bezig met de aansturing van deze verlichting en om deze correct de laten functioneren moeten de delays uit de code gewerkt worden, ik kom er niet uit hoe ik dit moet doen.
Kan iemand me hiermee helpen?

Bij voorbaat dank

Daan


Code: [Select]
const int buttonPin = 4;   


int oldButtonVal = 0;
int var = 1;
int nPatterns = 4;
int lightPattern = 1;

int buttonState = 0;       


void setup() {

    for (int pin = 26; pin <= 46; pin++ ){
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }


    pinMode(buttonPin, INPUT);
    digitalWrite(buttonPin, HIGH);
    pinMode(8, OUTPUT);
}

 void loop() {
  digitalWrite(8, HIGH);

  buttonState = digitalRead(buttonPin);


   int buttonVal = digitalRead(buttonPin);
  if (buttonVal == LOW && oldButtonVal == HIGH) {
    lightPattern = lightPattern + 1;
  }
  if (lightPattern > nPatterns) lightPattern = 1;
  oldButtonVal = buttonVal;

  switch(lightPattern) {
    case 1:
     allon();
      break;
    case 2:
      alloff();
      break;
    case 3:
      allon();
      break;
    case 4:
     alloff();
     break;
    case 5:
     allon();
     break;
  }
}
    void allon() {
  for (int pin = 26; pin<= 46; pin++){
    digitalWrite(pin, LOW); 
  }
}

void alloff() {
  for (int pin = 26; pin<= 46; pin++){
    digitalWrite(pin, HIGH); 
  }
}

void snake() {
  for (int i = 0; i <=19; i++){
    for (int pin = 22; pin<= 41 - i; pin++){
      digitalWrite(pin - 1, HIGH);
      digitalWrite(pin, LOW);
      delay(160);
    }
  }
}

void allblink(int times){
  for (int i = 1; i <= 4 * times; i++){
    var = (var + 1) % 2;
    for (int pin = 22; pin <= 41; pin++){
      if(pin % 2 == var){
        digitalWrite(pin, LOW); 
      }else{
         digitalWrite(pin, HIGH);
      }
    }
    delay(250);
  }
}

void quadblink(int times) {
  for (int i = 1; i <= 20 * times; i++){
    var = (var + 1) % 4;

for (int pin = 22; pin <= 41; pin++){
  if(pin % 4 == var){
    digitalWrite(pin, LOW); 
  }else{
     digitalWrite(pin, HIGH);
      }
    }
    delay(250);
  }
}

void randa(int times) {
  for (int i = 1; i <= 100 * times; i++){
    digitalWrite(random(22,42), LOW);
    digitalWrite(random(22,42), HIGH);
    delay(100);
  } 
}




shooter

ja dat vraagt wat werk, maar kan wel hoor.
als je in een delay zit (en dat is eigenlijk altijd, dan werkt de knop niet.
zet je switch ook in een functie, dat is handiger.
in elke case zet je dan een wachttijd neer
en in je loop zet je dan 
IF ((millis()-starttijd)> wachttijd)
{starttijd=millis();
doe de case
}
dan wordt de case telkens gedaan als de tijd om is, en de rest van de tijd kijkt hij naar de schakelaar.
dan gaat het wel zo snel dat de kontaktdender van de knop gaat blijken. dus een delay van 10 ms is daar wel op zijn plaats denk ik.
opdracht : doe die dender ook met een tijd.


paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

MAS3

Heb je al gespeeld met die blink without delay sketch ?

Die is er voor om te leren hoe dat werkt (je moet dan wel redelijk met de Engelse taal overweg kunnen, om de uitleg erbij te volgen).
Nu leer je niet zo heel veel van het laden van een kant en klare sketch in je Arduino, en ook niet zo veel van het lezen ervan.
Je gaat pas echt leren en begrijpen, als je het voorbeeld gaat aanpassen en dan kijkt of die aanpassing doet wat je je ervan had voorgesteld.
Dus, sluit 1 of meer extra LEDs (met weerstand uiteraard) aan op je Arduino, en laat die met die voorbeeld sketch in verschillende ritmes knipperen.
Als je eerst met 1 LED, dan met 1 plus 1 extra LED en dan met nog meer LEDs gaat werken, kun je zo jouw idee├źn over hoe een en ander werkt testen en eventueel bijstellen.
Het enige dat je daarmee kwijt bent, is wat tijd.
Maar dat is niet bepaald duur, want het levert je begrip van de stof op, en plezier van het spelen met de sketch (en het boeken van resultaten).

Dit is dan ook wat je met alle meegeleverde voorbeeld sketches zou moeten doen om ze goed te begrijpen.
Daar zijn ze (alle die ik zelf gezien heb) ook op gebouwd.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

luc_de_smedt

Beste,

Werk met tellers die je op tijdbasis (bv. elke 10ms) verhoogt (zie multitasking item op dit forim).
je vergelijkt deze tellers met vaste waardes om uitgangen aan en uit te zetten.  Je reset deze tellers als de aan-uit cyclus is uitgevoerd.

bv.

elke 10ms verhoog je teller 1 en teller 2

als teller 1 > 500 dan led 1 aan
als teller 1 > 1000 dan led 1 uit en teller 1=0

als teller 2 > 1000 dan led 2 aan
als teller 2 > 2000 dan led 2 uit en teller 2=0

enz...

hier zal led 1 elke 0,5 sec van status wijzigen en led 2 elke seconde.


Groeten,

spirit

Quote
elke 10ms verhoog je teller 1 en teller 2

als teller 1 > 500 dan led 1 aan
als teller 1 > 1000 dan led 1 uit en teller 1=0

als teller 2 > 1000 dan led 2 aan
als teller 2 > 2000 dan led 2 uit en teller 2=0

hier zal led 1 elke 0,5 sec van status wijzigen en led 2 elke seconde.
om precies tezijn. niet dat andere mensen gaan denk HU! waarom werkt het niet goed.
500 x 10ms = 5000. dus elke 5sec ipv van 0.5 sec.
leer gewoon omgaan met millis of micros komt op het zelfde neer.

ik heb wel een goeie voorbeeld maar volgens mij is de poster niet meer geïnteresseerd.
werkt door middel van een "Chase" temaken met een Array. en dan kan je Fade en scene time instellen.
of een GoTo functie. die heeft alleen Fadetime.
kan ook zonder fadetime als je dat niet wilt.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy