LED Timer Programming Help


hey guys,
i'm working on led arduino project control 8x8 led matrix display , number of leds turn on , off in patterns. i'm relatively new c++ coding small bit inefficient .

i've had @ led & multiplexing forum thought programming section more appropriate.

i split 2 top rows 8x8 matrix , have 2 led sections running independently i.e. 2 x 8 matrix , 6 x 8 matrix , maybe few sections added later. i've created separate voids deal lighting of these leds. end result hoping each section run "simultaneously".

after bit of research see impossible , make appear simultaneous using timers. have looked through various tutorials(e.g. http://www.arduino.cc/en/tutorial/blinkwithoutdelay) timers , think understand basics on implementation of timer code becomes little funky.

the led sequences finishing 1 iteration before being interrupted sequence , loops.

i can't seem figure out whats wrong timers? think may in voids themselves. if point me in right direction i'd grateful.
 
thanks in advance.

code: [select]
unsigned long lastearframe = 0;
unsigned long lastcheekframe = 0;
unsigned long lastchinframe = 0;
unsigned int earspeed = 300;
unsigned int cheekspeed = 150;
unsigned int chinspeed = 200;
int k, p, n, t, m, m1;
int cheekanimation = 1;
int count = 0;

#include "truerandom.h"
#include "ledcontrol.h" //  need library
ledcontrol lc = ledcontrol(12, 11, 10, 1);

void setup() {
  //set pins outputs ears - 5 5 leds
  serial.begin(115200);
  // max7219 code
  lc.shutdown(0, false);
  lc.setintensity(0, 15);
  lc.cleardisplay(0);
}

void loop() {

unsigned long currenttime = millis();
 
  // check see if time animate ear 
  if(currenttime > (lastearframe+earspeed))
  {
    animateear();
    lastearframe = currenttime;
  }
 
  // check see if time animate cheek 
  if(currenttime > (lastcheekframe+cheekspeed))
  {
    animatecheek();
    lastcheekframe = currenttime;
  }
 
 
  // check see if time animate chin leds 
  if(currenttime > (lastchinframe+chinspeed))
  {
    animatechin();
    lastchinframe = currenttime;
  }
 
}

void animateear()
{
// created
}
void animatecheek() {
  if (count >= 4)
  {
    cheekanimation++;
    count = 0;
  }
  if (cheekanimation > 4)// number should equal number of cases in switch below.
  {
    cheekanimation = 1;
  }
  switch (cheekanimation)
  {
    case 1: oneway();             break;
    case 2: twoway();             break;
    case 3: onewayreverse();         break;
    case 4: twowayreverse();         break;


      //default: oneway();      break;
  }
}
void oneway()
{
  (m = 0; m <= 7; m++) {
    lc.setled(0, 0, m, true);
    lc.setled(0, 1, m, true);
    delay (cheekspeed);
    lc.setled(0, 0, m, false);
    lc.setled(0, 1, m, false);

  }
  count++;
}
void twoway()
{
  (m = 0; m <= 7; m++) {
    lc.setled(0, 0, m, true);
    lc.setled(0, 1, abs(m - 7), true);
    delay (cheekspeed);
    lc.setled(0, 0, m, false);
    lc.setled(0, 1, abs(m - 7), false);
  }
  count++;
}
void onewayreverse()
{

  (m = 0; m <= 13; m++) {
    lc.setled(0, 0, abs(m - 7), true);
    lc.setled(0, 1, abs(m - 7), true);
    delay (cheekspeed);
    lc.setled(0, 0, abs(m - 7), false);
    lc.setled(0, 1, abs(m - 7), false);
  }
  count++;
}
void twowayreverse()
{
  (m = 0; m <= 13; m++) {
    if (m < 7) {
      m1 = m;
    }
    else {
      m1 = 14 - m;
    }

    lc.setled(0, 0, m1, true);
    lc.setled(0, 1, abs(m - 7), true);
    delay (cheekspeed);
    lc.setled(0, 0, m1, false);
    lc.setled(0, 1, abs(m - 7), false);
  }
  count++;
}
void animatechin()
{// cant use set column , set led together. chin , cheek clash.
int randnumber = truerandom.random(2,8);// 2 avoid first 2 rows , 8 because (8-1 = 7) , 7 last row.
 //p += led_bit[k];
 for (k = 7;k >= randnumber; k--){
  lc.setled(0, k, 0, true);
  lc.setled(0, k, 1, true);
  lc.setled(0, k, 2, true);
  lc.setled(0, k, 3, true);
  lc.setled(0, k, 4, true);
  lc.setled(0, k, 5, true);
  lc.setled(0, k, 6, true);
  lc.setled(0, k, 7, true);
  delay(chinspeed);
}
for (k = randnumber; k <= 7; k++) {
 
   // p -= led_bit[k];
 
  lc.setled(0, k, 0, false);
  lc.setled(0, k, 1, false);
  lc.setled(0, k, 2, false);
  lc.setled(0, k, 3, false);
  lc.setled(0, k, 4, false);
  lc.setled(0, k, 5, false);
  lc.setled(0, k, 6, false);
  lc.setled(0, k, 7, false);
  delay(chinspeed);
 }
  //k = 0;
}

here sketch using timer setup want.

code: [select]
/*
  state machine.
 
  piece of code constitutes state machine.
  used start event, keeping eye on event see if time slot has elapsed.
  state machine need avoid using "sleep-mode" function delay().
  note code relies on global variables store state of events.
  if try calling event functions these variables parameters, wont work, the
  parameters considered local variables in scope of functions.
     
  in code 3 events controls 2 blinking leds individual blink intervals, using event function each led.

  code written , explained :
  jasmine2501
  in youtube video :
  https://www.youtube.com/watch?v=3vzgajbrzd8
 
  modified 29-03-15 anders53
 
*/

// constants defines pin numbers
const int blueledpin = 10;             // number of blue led pin
const int greenledpin = 11;            // number of green led pin
const int redledpin = 12;              // number of red led pin
 
// variables change
int blueledstate = high;               // ledstate blue led
int greenledstate = high;              // ledstate green led
int redledstate = high;                // ledstate red led
long previousmillisblue = 0;           // last time blue led updated
long previousmillisgreen = 0;          // last time green led updated
long previousmillisred = 0;            // last time red led updated

// must long integers prevent overflow
long blueledinterval = 1090;          // interval blink blue led (milliseconds)
long greenledinterval = 1100;         // interval blink green led (milliseconds)
long redledinterval = 1110;           // interval blink red led (milliseconds)
unsigned long currentmillis = 0;      // current time (milliseconds)

void setup()
{  // set pins output mode
  pinmode(blueledpin, output);
  pinmode(greenledpin, output);
  pinmode(redledpin, output);
  digitalwrite(blueledpin, blueledstate);
  digitalwrite(greenledpin, greenledstate);
  digitalwrite(redledpin, redledstate);
}

void loop()
{
  currentmillis = millis(); // capture current time
  manageblueled();
  managegreenled();
  manageredled();
}

void manageblueled()  // function : check if it's time change state of blue led yet
{
  if (currentmillis - previousmillisblue > blueledinterval) // state change condition
  {
    previousmillisblue = currentmillis;  //store time of state change
    // next 2 lines event controlled
    blueledstate = (blueledstate == high) ? low : high;
    digitalwrite(blueledpin, blueledstate);
  }
}

void managegreenled() // function : check if it's time change state of green led yet
{
  if (currentmillis - previousmillisgreen > greenledinterval) // state change condition
  {
    previousmillisgreen = currentmillis; //store time of state change
    // next 2 lines event controlled
    greenledstate = (greenledstate == high) ? low : high;
    digitalwrite(greenledpin, greenledstate);
  }
}

void manageredled()  // function : check if it's time change state of red led yet
{
  if (currentmillis - previousmillisred > redledinterval) // state change condition
  {
    previousmillisred = currentmillis;  //store time of state change
    // next 2 lines event controlled
    redledstate = (redledstate == high) ? low : high;
    digitalwrite(redledpin, redledstate);
  }
}



Arduino Forum > Using Arduino > Programming Questions > LED Timer Programming Help


arduino

Comments