Mittwoch, 23. Oktober 2013

Heli Blinkerle

Nachdem der Hughes 500 ganz gut fliegt MUSS nun natürlich eine Beleuchtung rein. Deshalb hab ich mal mein Arduino Diecimila geschnappt und flux ein kleines Program geschrieben, welches beliebig viele LEDs in unterschiedlichen Intervallen blinken lässt. Der Testaufbau besteht noch aus normalen LEDs. Im Heli werden dann 1W LEDs mit einer kleinen LED Treiberplatine an 2S Lipo betrieben ... more to come.

Hier mal ein kurzer Preview ...

und der Source:

// Author: fliegerle.com, V0.9
//
// Small sketch whichs let's LEDs make blink blink blink ...
// How it works: Just create a light object with "Create" and put an "Init" into Setup() and a "Check" in Loop(). 
// After on_1 ms the light is turned off, then after off_1 turned on again. You can define up to
// 2 periods. Each light gets its own counter, so you don't need to compute divisors or counters. I'm using JeeLib 
// for the MilliTimer.

#include <JeeLib.h>

struct Light
{
  Light() : m_event(0), 
            m_status(255), 
            m_period(0)           
  {};
  
  void Create( byte led_pin, int on_1=0, int off_1=0, int on_2=0, int off_2=0 )
  {
    m_period_switch[0]  = on_1; 
    m_period_switch[1]  = ( off_1 == 0 ) ? on_1 : off_1;
    m_period_switch[2]  = ( on_2 == 0 ) ? on_1 : on_2;
    m_period_switch[3]  = ( off_2 == 0 ) ? off_1 : off_2;
    m_led_pin = led_pin;
    m_status  = 255;
  }
  
  void Init()
  {
    m_event = 1; 
    m_period = m_period_switch[0];   
    m_counter = 0;
    pinMode( m_led_pin, OUTPUT );
    Off();
  }
  void Check()
  {
    if( m_status == 255 )
    {
      Init();
    }
    if ( m_period_switch[0] == 0 )
    {
      On();
      return;
    }
    
    if ( m_timer.poll(m_period) )
    {
      switch( m_event )
      {
        case 1:
        {
          digitalWrite( m_led_pin, 1 );
          m_event = 0;
          m_period = m_period_switch[2*m_counter+1];
          m_counter++;
          if ( m_counter>1 )
          {
            m_counter=0;
          }
          break;
        }
        case 0:
        { 
          digitalWrite( m_led_pin, 0 );
          m_event = 1;
          m_period = m_period_switch[2*m_counter];
          break;
        }
        default:;
      }
    }
  }
  void Off()
  {
    if ( m_status!=0 )
    {
      m_status = 0;
      digitalWrite( m_led_pin, m_status );
    }
  }
  void On()
  {
    if ( m_status!=1 )
    {
      m_status = 1;
      digitalWrite( m_led_pin, m_status );
    }
  }
  
  MilliTimer m_timer;
  byte m_event;
  int m_period;
  int m_period_switch[4];
  byte m_counter;
  byte m_led_pin;
  byte m_status;
  
};


const int max_leds = 5;
Light test_led[max_leds];

void setup()

  for ( int i=0; i<max_leds; i++ )
  {
    switch( i )
    {
     case 0: test_led[i].Create( 13,  50, 1000 );          break; // ON for 50ms, OFF for 1000ms
     case 1: test_led[i].Create( 3,   50, 100, 50, 3000 ); break; // double blink
     case 2: test_led[i].Create( 4, 1500, 100 );           break; // long on, then off
     case 3: test_led[i].Create( 5,   50, 100, 150, 200 ); break; // now to something completely different
     case 4: test_led[i].Create( 6 );                      break; // permanently ON
     default:;
    }   
    test_led[i].Init();
  }
}

void loop() 
{
  for ( int i=0; i<max_leds; i++ )
  {
    test_led[i].Check();
  }
}

Keine Kommentare:

Kommentar veröffentlichen