5x5 LED Matrix Limited to 5 characters


how can enable string_map handle more 5 characters. ultimate goal put in complete sentence spaces. appreciated.   

//5x5 scrolling led matrix
//16 jun 2013
//font matrix @ http://arduino.cc/forum/index.php/topic,7384.0.html

int cola = 7;
int colb = 6;
int colc = 5;
int cold = 4;
int cole = 3;

int row1 = 12;
int row2 = 11;
int row3 = 10;
int row4 = 9;
int row5 = 8;

//int row6 = 2;
//int row7 = 1;
//int row8 = 0;

int cols[5] = {cola, colb, colc, cold, cole};
int rows[5] = {row1, row2, row3, row4, row5};

//character fonts 5x5
byte a[5] = {0x04, 0x0a, 0x11, 0x1f, 0x11};
byte b[5] = {0x1e, 0x11, 0x1e, 0x11, 0x1e}; 
byte c[5] = {0x1e, 0x11, 0x10, 0x11, 0x1e}; 
byte d[5] = {0x1e, 0x11, 0x11, 0x11, 0x1e}; 
byte e[5] = {0x1f, 0x10, 0x1e, 0x10, 0x1f};
byte f[5] = {0x1f, 0x10, 0x1f, 0x10, 0x10};
byte h[5] = {0x11, 0x11, 0x1f, 0x11, 0x11};
byte i[5] = {0x1f, 0x04, 0x04, 0x04, 0x1f};
byte j[5] = {0x1f, 0x04, 0x04, 0x14, 0x1c};
byte k[5] = {0x11, 0x12, 0x1c, 0x12, 0x11};
byte l[5] = {0x10, 0x10, 0x10, 0x10, 0x1f};
byte m[5] = {0x1b, 0x15, 0x15, 0x11, 0x11};
byte n[5] = {0x11, 0x19, 0x15, 0x13, 0x11};
byte o[5] = {0x0e, 0x11, 0x11, 0x11, 0x0e};
byte p[5] = {0x1f, 0x11, 0x1f, 0x10, 0x10};
byte q[5] = {0x0e, 0x11, 0x15, 0x12, 0x0d};
byte r[5] = {0x1e, 0x11, 0x1e, 0x11, 0x11};
byte s[5] = {0x0f, 0x10, 0x0e, 0x01, 0x1e};
byte t[5] = {0x1f, 0x04, 0x04, 0x04, 0x04};
byte u[5] = {0x11, 0x11, 0x11, 0x11, 0x0e};
byte v[5] = {0x11, 0x11, 0x11, 0x0a, 0x04};
byte y[5] = {0x11, 0x0a, 0x04, 0x04, 0x04};
byte space[5] = {0x00, 0x00, 0x00, 0x00, 0x00};

boolean frame_buffer_new[5][5];
boolean string_map[5][5*6];
unsigned long string_map_max_col;

unsigned int tcnt2;
unsigned int timer_counter = 0;
unsigned long current_col = 0;

void setup()
{
  pinmode(cola, output); pinmode(colb, output); pinmode(colc, output); pinmode(cold, output); pinmode(cole, output);
  pinmode(row1, output); pinmode(row2, output); pinmode(row3, output); pinmode(row4, output); pinmode(row5, output); //pinmode(row6, output); pinmode(row7, output); pinmode(row8, output);

  //set timer stuff
  timsk2 &= ~(1<<toie2);
  tccr2a &= ~(1<<wgm21) | (1<<wgm20);
  tccr2b &= ~(1<<wgm22);
  assr &= ~(1<<as2);
  timsk2 &= ~(1<<ocie2a);
  tccr2b |= (1<<cs22) | (1<<cs20);
  tccr2b &= ~(1<<cs21);
  tcnt2 = 6;
  tcnt2 = tcnt2;
  timsk2 |= (1<<toie2);

  serial.begin(9600);
  serial.println("isr initialized");

  string_map_max_col = 5 * 6;
  create_string_map("robyn");

  //update frame_buffer_new first frame
  for(int j=0;j<5;j++)
  {
    frame_buffer_new[0][j] = string_map[0][j];
    frame_buffer_new[1][j] = string_map[1][j];
    frame_buffer_new[2][j] = string_map[2][j];
    frame_buffer_new[3][j] = string_map[3][j];
    frame_buffer_new[4][j] = string_map[4][j];
  }
  display_off();
  serial.println("string map + first frame created ...");
  //print string_map
  for(int i=0;i<5;i++)
  {
    for(int j=0;j<string_map_max_col;j++)
    {
      serial.print(string_map[j]);
      serial.print(".");
    }
    serial.println();
  }
}

//install isr
isr(timer2_ovf_vect)
{
  timer_counter++;
  if(timer_counter==110) //500 = 1 sec
  {
    //reset timer_counter
    timer_counter=0;
    //disable timer
    timsk2 |= (0<<toie2);
    //update frame
    serial.println("frame update event ...");
    current_col++;
    for(int j=0;j<5;j++)
    {
      frame_buffer_new[0][j] = string_map[0][(current_col+j)%string_map_max_col];
      frame_buffer_new[1][j] = string_map[1][(current_col+j)%string_map_max_col];
      frame_buffer_new[2][j] = string_map[2][(current_col+j)%string_map_max_col];
      frame_buffer_new[3][j] = string_map[3][(current_col+j)%string_map_max_col];
      frame_buffer_new[4][j] = string_map[4][(current_col+j)%string_map_max_col];
    }
    display_and_hold_frame();
    serial.println(current_col%string_map_max_col);
    /*serial.println("updated frame buffer");
    for(int i=0;i<5;i++)
    {
      for(int j=0;j<5;j++)
      {
        serial.print(frame_buffer_new[j]);
        serial.print(".");
      }
      serial.println();
    }*/
  }
  else
  {
    display_and_hold_frame();
  }
  tcnt2 = tcnt2;
  //enable timer
  timsk2 |= (1<<toie2);
}

void loop()
{
  //do nothing .. isr take care of it
}

void display_off()
{
  for(int i=0;i<5;i++){digitalwrite(rows, low);digitalwrite(cols, high);}
}

void display_and_hold_frame()
{
  for(int i=0;i<5;i++){set_col(i);display_off();}
}

void set_col(int i)
{
  //set col on => low
  digitalwrite(cols, low);
  if(frame_buffer_new[0]) {digitalwrite(rows[0],high);}
  if(frame_buffer_new[1]) {digitalwrite(rows[1],high);}
  if(frame_buffer_new[2]) {digitalwrite(rows[2],high);}
  if(frame_buffer_new[3]) {digitalwrite(rows[3],high);}
  if(frame_buffer_new[4]) {digitalwrite(rows[4],high);}
}

void create_string_map(string str)
{
  byte *current_letter;
  int length = str.length();

  for(int counter=0;counter<length;counter++)
  {
    switch(str.charat(counter))
    {
       case 'a': current_letter = a; break; case 'b': current_letter = b; break;
       case 'c': current_letter = c; break; case 'd': current_letter = d; break;
       case 'e': current_letter = e; break; case 'f': current_letter = f; break;
       case 'h': current_letter = h; break; case 'i': current_letter = i; break;
       case 'j': current_letter = j; break; case 'k': current_letter = k; break;
       case 'l': current_letter = l; break; case 'm': current_letter = m; break;
       case 'n': current_letter = n; break; case 'o': current_letter = o; break;
       case 'p': current_letter = p; break; case 'q': current_letter = q; break;
       case 'r': current_letter = r; break; case 's': current_letter = s; break;
       case 't': current_letter = t; break; case 'u': current_letter = u; break;
       case 'v': current_letter = v; break; case 'y': current_letter = y; break;
    }

    for(int j=0;j<5;j++)
    {
      string_map[j][(counter*6)+0] = (current_letter[j]&bit(4))?true:false;
      string_map[j][(counter*6)+1] = (current_letter[j]&bit(3))?true:false;
      string_map[j][(counter*6)+2] = (current_letter[j]&bit(2))?true:false;
      string_map[j][(counter*6)+3] = (current_letter[j]&bit(1))?true:false;
      string_map[j][(counter*6)+4] = (current_letter[j]&bit(0))?true:false;
      string_map[j][(counter*6)+5] = false; //filler column
    }
  }
}

try this:
code: [select]

//5x5 scrolling led matrix
//16 jun 2013
//font matrix @ http://arduino.cc/forum/index.php/topic,7384.0.html

const char message[] = "robyn";
const int charactercount = sizeof message - 1; // don't count terminating null

int cola = 7;
int colb = 6;
int colc = 5;
int cold = 4;
int cole = 3;

int row1 = 12;
int row2 = 11;
int row3 = 10;
int row4 = 9;
int row5 = 8;

//int row6 = 2;
//int row7 = 1;
//int row8 = 0;

int cols[5] = {cola, colb, colc, cold, cole};
int rows[5] = {row1, row2, row3, row4, row5};

//character fonts 5x5
byte a[5] = {0x04, 0x0a, 0x11, 0x1f, 0x11};
byte b[5] = {0x1e, 0x11, 0x1e, 0x11, 0x1e}; 
byte c[5] = {0x1e, 0x11, 0x10, 0x11, 0x1e}; 
byte d[5] = {0x1e, 0x11, 0x11, 0x11, 0x1e}; 
byte e[5] = {0x1f, 0x10, 0x1e, 0x10, 0x1f};
byte f[5] = {0x1f, 0x10, 0x1f, 0x10, 0x10};
byte h[5] = {0x11, 0x11, 0x1f, 0x11, 0x11};
byte i[5] = {0x1f, 0x04, 0x04, 0x04, 0x1f};
byte j[5] = {0x1f, 0x04, 0x04, 0x14, 0x1c};
byte k[5] = {0x11, 0x12, 0x1c, 0x12, 0x11};
byte l[5] = {0x10, 0x10, 0x10, 0x10, 0x1f};
byte m[5] = {0x1b, 0x15, 0x15, 0x11, 0x11};
byte n[5] = {0x11, 0x19, 0x15, 0x13, 0x11};
byte o[5] = {0x0e, 0x11, 0x11, 0x11, 0x0e};
byte p[5] = {0x1f, 0x11, 0x1f, 0x10, 0x10};
byte q[5] = {0x0e, 0x11, 0x15, 0x12, 0x0d};
byte r[5] = {0x1e, 0x11, 0x1e, 0x11, 0x11};
byte s[5] = {0x0f, 0x10, 0x0e, 0x01, 0x1e};
byte t[5] = {0x1f, 0x04, 0x04, 0x04, 0x04};
byte u[5] = {0x11, 0x11, 0x11, 0x11, 0x0e};
byte v[5] = {0x11, 0x11, 0x11, 0x0a, 0x04};
byte y[5] = {0x11, 0x0a, 0x04, 0x04, 0x04};
byte space[5] = {0x00, 0x00, 0x00, 0x00, 0x00};

boolean frame_buffer_new[5][5];
boolean string_map[5][5*charactercount];
unsigned long string_map_max_col;

unsigned int tcnt2;
unsigned int timer_counter = 0;
unsigned long current_col = 0;

void setup()
{
  pinmode(cola, output); pinmode(colb, output); pinmode(colc, output); pinmode(cold, output); pinmode(cole, output);
  pinmode(row1, output); pinmode(row2, output); pinmode(row3, output); pinmode(row4, output); pinmode(row5, output); //pinmode(row6, output); pinmode(row7, output); pinmode(row8, output);

  //set timer stuff
  timsk2 &= ~(1<<toie2);
  tccr2a &= ~(1<<wgm21) | (1<<wgm20);
  tccr2b &= ~(1<<wgm22);
  assr &= ~(1<<as2);
  timsk2 &= ~(1<<ocie2a);
  tccr2b |= (1<<cs22) | (1<<cs20);
  tccr2b &= ~(1<<cs21);
  tcnt2 = 6;
  tcnt2 = tcnt2;
  timsk2 |= (1<<toie2);

  serial.begin(9600);
  serial.println("isr initialized");

  string_map_max_col = 5 * charactercount;
  create_string_map(message);

  //update frame_buffer_new first frame
  for(int j=0;j<5;j++)
  {
    frame_buffer_new[0][j] = string_map[0][j];
    frame_buffer_new[1][j] = string_map[1][j];
    frame_buffer_new[2][j] = string_map[2][j];
    frame_buffer_new[3][j] = string_map[3][j];
    frame_buffer_new[4][j] = string_map[4][j];
  }
  display_off();
  serial.println("string map + first frame created ...");
  //print string_map
  for(int i=0;i<5;i++)
  {
    for(int j=0;j<string_map_max_col;j++)
    {
      serial.print(string_map[i][j]);
      serial.print(".");
    }
    serial.println();
  }
}

//install isr
isr(timer2_ovf_vect)
{
  timer_counter++;
  if(timer_counter==110) //500 = 1 sec
  {
    //reset timer_counter
    timer_counter=0;
    //disable timer
    timsk2 |= (0<<toie2);
    //update frame
    serial.println("frame update event ...");
    current_col++;
    for(int j=0;j<5;j++)
    {
      frame_buffer_new[0][j] = string_map[0][(current_col+j)%string_map_max_col];
      frame_buffer_new[1][j] = string_map[1][(current_col+j)%string_map_max_col];
      frame_buffer_new[2][j] = string_map[2][(current_col+j)%string_map_max_col];
      frame_buffer_new[3][j] = string_map[3][(current_col+j)%string_map_max_col];
      frame_buffer_new[4][j] = string_map[4][(current_col+j)%string_map_max_col];
    }
    display_and_hold_frame();
    serial.println(current_col%string_map_max_col);
    /*serial.println("updated frame buffer");
    for(int i=0;i<5;i++)
    {
      for(int j=0;j<5;j++)
      {
        serial.print(frame_buffer_new[i][j]);
        serial.print(".");
      }
      serial.println();
    }*/
  }
  else
  {
    display_and_hold_frame();
  }
  tcnt2 = tcnt2;
  //enable timer
  timsk2 |= (1<<toie2);
}

void loop()
{
  //do nothing .. isr take care of it
}

void display_off()
{
  for(int i=0;i<5;i++){digitalwrite(rows[i], low);digitalwrite(cols[i], high);}
}

void display_and_hold_frame()
{
  for(int i=0;i<5;i++){set_col(i);display_off();}
}

void set_col(int i)
{
  //set col on => low
  digitalwrite(cols[i], low);
  if(frame_buffer_new[0][i]) {digitalwrite(rows[0],high);}
  if(frame_buffer_new[1][i]) {digitalwrite(rows[1],high);}
  if(frame_buffer_new[2][i]) {digitalwrite(rows[2],high);}
  if(frame_buffer_new[3][i]) {digitalwrite(rows[3],high);}
  if(frame_buffer_new[4][i]) {digitalwrite(rows[4],high);}
}

void create_string_map(string str)
{
  byte *current_letter;
  int length = str.length();

  for(int counter=0;counter<length;counter++)
  {
    switch(str.charat(counter))
    {
       case 'a': current_letter = a; break; case 'b': current_letter = b; break;
       case 'c': current_letter = c; break; case 'd': current_letter = d; break;
       case 'e': current_letter = e; break; case 'f': current_letter = f; break;
       case 'h': current_letter = h; break; case 'i': current_letter = i; break;
       case 'j': current_letter = j; break; case 'k': current_letter = k; break;
       case 'l': current_letter = l; break; case 'm': current_letter = m; break;
       case 'n': current_letter = n; break; case 'o': current_letter = o; break;
       case 'p': current_letter = p; break; case 'q': current_letter = q; break;
       case 'r': current_letter = r; break; case 's': current_letter = s; break;
       case 't': current_letter = t; break; case 'u': current_letter = u; break;
       case 'v': current_letter = v; break; case 'y': current_letter = y; break;
    }

    for(int j=0;j<5;j++)
    {
      string_map[j][(counter*6)+0] = (current_letter[j]&bit(4))?true:false;
      string_map[j][(counter*6)+1] = (current_letter[j]&bit(3))?true:false;
      string_map[j][(counter*6)+2] = (current_letter[j]&bit(2))?true:false;
      string_map[j][(counter*6)+3] = (current_letter[j]&bit(1))?true:false;
      string_map[j][(counter*6)+4] = (current_letter[j]&bit(0))?true:false;
      string_map[j][(counter*6)+5] = false; //filler column
    }
  }
}


Arduino Forum > Using Arduino > LEDs and Multiplexing > 5x5 LED Matrix Limited to 5 characters


arduino

Comments

Popular posts from this blog

Convierte tu Raspberry en un NAS. Firmware fvdw-sl 15.3 - Raspberry Pi Forums

How to format a Get Request

avrdude: verification error, first mismatch at byte 0x0000 0x0c != 0x62