Arduino trap
Verlichting op de traptreden.

Als onderaan de trap, de PIR-sensor je ziet, gaan de ledstrips snel aan naar boven. Als het PIR-sensor je dan boven aan de trap je dan zie, fade de ledstrips van beneden naar boven langzaam uit.

en het zelfde verhaal voor boven naar beneden.

Als het te lang duurt, gaat de ledstrips ook na 30 seconde uit.

ik heb de onderstaande PIR-sensors gebruikt:

int vStairSteps = 14;                                                    // aantal treden
int O_nr[15] = {00, 44, 46, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};     // output nummers in een array zette
int iDown = 22;                                                          // Nummer input PIR onderaan de trap
int iUp = 24;                                                            // Nummer input PIR bovenaan de trap
int ValFade[15];                                                         // huidige Fade waarden per tree onthouden
int vUpGestart = 0;
int vDownGestart = 0;
int BreakCnt = 0 ;
//-------------------------------------------------------------------------------------------------------------------------------
void setup() {
  for (int i = 1 ; i <= 15; i++) {                                       // alle PWM pinnen op output zetten
    pinMode(O_nr[i], OUTPUT);
  }
  pinMode(iDown, INPUT);                                                 // PIR inputjes op ingang zetten
  pinMode(iUp, INPUT);

  digitalWrite(iDown, LOW);
  digitalWrite(iUp, LOW);

  Serial.begin(9600);                                                  // serieel verbinding straten voor eventueel debuggen
}
//-------------------------------------------------------------------------------------------------------------------------------
void loop() {

  int vDown = 0;
  int vUp = 0;


  vDown = digitalRead(iDown);
  vUp = digitalRead(iUp);

  //Serial.print(vDown);
  //Serial.println(vUp);

  if ( vUp == 1 & vUpGestart == 0 & vDownGestart == 0)
  {
    vUpGestart = 1 ;
    trap_op_aan( 1, 150);
  }

  if ( vDown ==  1 & vDownGestart == 0 & vUpGestart == 0)
  {
    vDownGestart = 1 ;
    trap_neer_aan( 1, 150);
  }

  if (vDown == 1 & vUpGestart == 1)
  {
    delay(2000);
    trap_op_uit(10, 5, 20);
    do {
      delay(100);
    } while (digitalRead(iDown) > 0 || digitalRead(iUp) > 0 );
    vUpGestart = 0 ;
    BreakCnt = 0;
  }

  if (vUp == 1 & vDownGestart == 1)
  {
    delay(2000);
    trap_neer_uit(10, 5, 20);
    do {
      delay(100);
    } while (digitalRead(iDown) > 0 || digitalRead(iUp) > 0 );
    vDownGestart = 0 ;
    BreakCnt = 0;
  }

  if (vUpGestart == 1)
  {
    delay(100);
    BreakCnt = BreakCnt + 1;
    if (BreakCnt > 300)
    {
      trap_op_uit(10, 5, 20);
      vUpGestart = 0 ;
      vDownGestart = 0 ;
      BreakCnt = 0;
    }
  }

  if (vDownGestart == 1)
  {
    delay(100);
    BreakCnt = BreakCnt + 1;
    if (BreakCnt > 300)
    {
      trap_neer_uit(10, 5, 20);
      vUpGestart = 0 ;
      vDownGestart = 0 ;
      BreakCnt = 0;
    }
  }
}
//-------------------------------------------------------------------------------------------------------------------------------
//vStart = een drempel tussen de verschillende treden..  als deze op 0 staat zullen alle treden tegelijk uitfaden... 
//staat deze op 50 ,zal elke tree apart uitfaden
//vStep = stap grote van het uit fade
//vSpeed =  wachtlus
//-------------------------------------------------------------------------------------------------------------------------------
void trap_op_uit(int vStart, int vStep, int vSpeed)
{
  int i = 1;                                                                  // tel op, zolang nog niet alle treeden uit zijn
  do {
    for (int j = 1; j < vStairSteps + 1; j ++)                                // starten bij tree 1
    {
      if ( i > (j * vStart) )                                                 // waarde teller groter als drmpel * huidige tree
      {
        if (ValFade[j] > 0 )                                                  // Led al uit? nee dan verlagen
        {
          ValFade[j] = ValFade[j] - vStep;
          analogWrite(O_nr[j], ValFade[j]);                                   // Uitgang aansturen
        }
      }
    }
    i++;
    delay(vSpeed);
  } while ( ValFade[vStairSteps] > 0);                                        // laatste tree Uit?
}
//-------------------------------------------------------------------------------------------------------------------------------
//vStart = een drempel tussen de verschillende treden..  als deze op 0 staat zullen alle treden tegelijk uitfaden... 
//staat deze op 50 ,zal elke tree apart uitfaden
//vStep = stap grote van het uit fade
//vSpeed =  wachtlus
//-------------------------------------------------------------------------------------------------------------------------------
void trap_neer_uit(int vStart, int vStep, int vSpeed)
{
  int i = vStairSteps * vStart;
  do {
    for (int j = vStairSteps; j > 0; j--)                                     // starten bij tree 14
    {
      if ( i < (j * vStart) )
      {
        if (ValFade[j] > 0 )
        {
          ValFade[j] = ValFade[j] - vStep;
          analogWrite(O_nr[j], ValFade[j]);
        }
      }
    }
    i--;
    delay(vSpeed);
  } while ( ValFade[1] > 0);                                                  // laatste tree Uit?
}
//-------------------------------------------------------------------------------------------------------------------------------
void trap_op_aan (int vStep, byte speed)
{
  for (int i = 1 ; i < vStairSteps + 1 ; i++ ) {                              // lus welke al de treeden afgaat (van onder(1) naar boven(14)
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += vStep) {          // lus welke de PWM output van de tree aanzet
      ValFade[i] = fadeValue;
      analogWrite(O_nr[i], ValFade[i]);
      delayMicroseconds(speed);
    }
  }
}
//-------------------------------------------------------------------------------------------------------------------------------
void trap_neer_aan (int vStep, byte speed)
{
  for (int i = vStairSteps ; i > 0 ; i-- ) {                                  // lus welke al de treeden afgaat (van boven(14) naar onder(1)
    for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += vStep) {          // lus welke de PWM output van de tree aanzet
      ValFade[i] = fadeValue;
      analogWrite(O_nr[i], ValFade[i]);
      delayMicroseconds(speed);
    }
  }
}


En ik heb een TIP120 gebruikt (14) voor het aansturen van de ledstrips onder de treden.

Alles gemaakt met een Arduino Mega ADK, omdat deze 15 PWM uitgangen heeft.

Programma:
Swets Hobby Homepage
Arjan Swets
Arjan Swets
Arjan Swets on LinkedIn
Swets Hobby Homepage
Arjan Swets
Arjan Swets