Hulp nodig bij code

Hallo,

Op dit moment heb ik een Arduino Uno boordje waarop ik een afstandsmeter heb. Deze werkt en laat een ledje (laten we zeggen led1) branden wanneer de waarde van deze afstandsmeter kleiner/of gelijk aan 6 is.

Nu wil ik een ledje (ledje2) laten branden wanneer de waarde van de afstandsmeter kleiner/of gelijk is aan 6, maar ook moet deze waarde zo zijn voor minimaal 3 seconden.

Dit betekent, wanneer ik binnen een afstand van 6 cm kom, led1 gaan branden. Wanneer ik hier meer dan 3 seconden aanwezig ben, led2 gaat branden. Wanneer ik dus maar 2 seconden in de buurt ben, gaat alleen led1 branden.

Kan iemand me hiermee helpen?

als led1 aan is een timer starten zie ook blink without delay.

Als je alleen 'n timer start los je 't probleem niet op: wil je na 3sec kijken of 't object dichterbij is dan 6? Misschien is 't object in de tussentijd wel uit beeld geweest; je moet, als 't object dichterbij is dan 6, continue meten of 't object nog steeds dichterbij is dan 6; voordat je 'n meting doet, kijk je of er drie seconden voorbij zijn, zoja: tweede ledje aan, anders doe je weer 'n meting. Is 't object buiten beeld, dan stop je de metingen.

vriendelijke groet,

Jos

JosAH: ...Is 't object buiten beeld, dan stop je de metingen.

Oeps.

Natuurlijk stop je de metingen nooit. Die blijf je onder alle omstandigheden doen. De timer moet wel onder bepaalde omstandigheden gestopt en gereset worden. Zie mijn handtekening hieronder.

MAS3: Oeps.

Natuurlijk stop je de metingen nooit. Die blijf je onder alle omstandigheden doen. De timer moet wel onder bepaalde omstandigheden gestopt en gereset worden.

Yep, je hebt helemaal gelijk; ik heb 't weer eens zeer onduidelijk verwoord: het enige dat je reset is de tijd dat je moet wachten totdat 't object weer (minstens) 3 seconden in beeld is geweest. Als 't object buiten beeld is geweest, kunnen (moeten?) beide ledjes uitgezet worden (als ze beide al aanstonden).

vriendelijke groet,

Jos

zoiets in pseudo:

Als afstand < 6 DAN
   Als timer == 0 DAN    // hij loopt nog niet
      timer = millis()
      LED1 = AAN
   EINDE ALS
   //
   // check periode langer dan 3 sec
   // 
    ALS millis() - timer > 3 seconden DAN
      LED2 = AAN
    ANDERS
      LED2 = UIT
    EINDE ALS
ANDERS
    //
   // we zijn nog buiten het bereik dus alle leds uit
   //
   timer = 0
   LED1 = UIT
   LED2 = UIT
EINDE ALS

Allereerst ontzettend bedankt voor alle reacties!
Ik heb het zelf al opgelost :slight_smile:

void afstand_enzo() {
  long duration, distance;

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration / 58.2;
  unsigned long currentMillis = millis();

  if (distance <= 6 ) {
    digitalWrite(3, HIGH);

    if ((currentMillis - laatsteTijd) >= 1000 ) {
      digitalWrite(2, HIGH);
    }
  }
  else {
    digitalWrite(2, LOW);
    laatsteTijd = millis();
    digitalWrite(3, LOW);
  }

Hierin zijn digitalWrite 3 & 2 respectievelijk mijn led1 en led2 die ik in mijn voorbeeld gebruikte.
Deze code heb ik gebruikt van het blinkwithoutdelay-principe.

Het werkt, maar hierbij rijst er meteen een tweede vraag:

Nu heb ik een RGBLedje gevonden welke ik door het kleurenspectrum wil laten ‘cyclen’
Ik heb hiervoor de volgende code gevonden:

#define GREEN 3
 #define BLUE 5
 #define RED 6
 #define delayTime 20

 void setup() {

   pinMode(GREEN, OUTPUT);
   pinMode(BLUE, OUTPUT);
   pinMode(RED, OUTPUT);
   digitalWrite(GREEN, HIGH);
   digitalWrite(BLUE, HIGH);
   digitalWrite(RED, HIGH);
 }

 int redVal;
 int blueVal;
 int greenVal;
  
 void loop() {
  
   int redVal = 255;
   int blueVal = 0;
   int greenVal = 0;
   for( int i = 0 ; i < 255 ; i += 1 ){
     greenVal += 1;
     redVal -= 1;
     analogWrite( GREEN, 255 - greenVal );
     analogWrite( RED, 255 - redVal );

     delay( delayTime );
   }
  
   redVal = 0;
   blueVal = 0;
   greenVal = 255;
   for( int i = 0 ; i < 255 ; i += 1 ){
     blueVal += 1;
     greenVal -= 1;
     analogWrite( BLUE, 255 - blueVal );
     analogWrite( GREEN, 255 - greenVal );

     delay( delayTime );
   }
  
   redVal = 0;
   blueVal = 255;
   greenVal = 0;
   for( int i = 0 ; i < 255 ; i += 1 ){
     redVal += 1;
     blueVal -= 1;
     analogWrite( RED, 255 - redVal );
     analogWrite( BLUE, 255 - blueVal );

     delay( delayTime );
   }
 }

Deze code werkt perfect, alleen is mijn probleem nu, dat ik mijn eerste opzet niet kan laten draaien wanneer deze code erbij staat. Ik denk dat de for structuur het blokkeert. Pas wanneer het RGB’tje heel zijn cyclus heeft afgerond, kan ik weer bij de rest van de code.

Is er een manier waarop ik mijn code voor de afstandsmeter door laat lopen, terwijl mijn RGB’tje daarnaast gewoon zijn cyclus doorloopt?

Gebruik maken van de technieken in "blink without delay"

Ik zou niet weten hoe ik die techniek nu zou moeten toepassen?

Je doet nu een handeling net zo lang tot die 256 maal herhaald is. Je kunt ook op een andere wijze tot 256 tellen, je gaf zelf an aan de for loop te verdenken. Dus kijk eens of je het ook zonder dat kunt doen.

vergeet de for next en de delay.
in de loop een timer met if current-starttijd >= wacttijd){
starttijd = current
rgbledje();
}

void rgbledje()
kleur++;
if kleur >=256 {kleur=0
}
led(kleurtjes…)
is cryptisch maar het is nu 2-3 in cardiff

Zou je misschien een voorbeeld kunnen maken gebaseerd op mijn gevonden code? Dan krijg ik misschien een betere schets, waarna ik het zelf verder wil proberen.