dotmatrixdesign: Twitter LED Scroller Build Log

davidnin1 [ at ] gmail.com
Dec 04
Permalink

Then I write a little (okay, a LOT of) Processing code:

import processing.serial.*;


class twit {
  String description;
  int[] bytes = new int[len*5];
  int pxlength;
 
  twit () { 
    description = “”;
    pxlength = 0;
  }

  void update () {
    nextpos = 0;
    for(int c = 0; c       description = description.toLowerCase();
      bytes = addLetter(description.charAt(c), bytes, nextpos+1);
    }
    pxlength = nextpos;
  }
 
  void drawpx (int xref, int yref) {
    for(int x = 0; x        if((bytes[x] & 1) == 1) {point(x+xref, yref+0);}
       if((bytes[x] & 2) == 2) {point(x+xref, yref+1);}
       if((bytes[x] & 4) == 4) {point(x+xref, yref+2);}
       if((bytes[x] & 8) == 8) {point(x+xref, yref+3);}
       if((bytes[x] & 16) == 16) {point(x+xref, yref+4);}
    }
  }
}


int bits=5;
int len=200;

int i = 0, j = 0;
int sqrsize = 5;
int centerx, centery;
float avg;
float bias = .1;
int xpos, ypos;
float h = random(0,255);
int rowint[] = new int[len];
String lines[] = new String[20];
String new_lines[] = new String[20];
twit tweets[] = new twit[20];
int black = 0;
int nextpos = 0;

int next_tw_refresh = 30*60;
int current_twitter = 0;
int next_line = 0;
int rate = 15;

Serial myPort;


void setup()
{
  background(255);
  colorMode(RGB, 255);
  ellipseMode(CORNERS);
  strokeWeight(1);
  noSmooth();
  frameRate(30);
 
  centerx = width/2;
  centery = height/2;

   
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
 
  for(i = 0; i     tweets[i] = new twit();
  }
 
  update_twits();
 
  size(len*sqrsize, lines.length*sqrsize+1);  // Size should be the first statement 
}

void draw()
{

  background(255);
 
  stroke(255,0,0);
  line(125,0,125,400);

  stroke(0);
  for(int count = 0; count     tweets[count].drawpx(0,count*(sqrsize+1));
  }
 
   if(frameCount > next_tw_refresh) {
     println(“Refreshing messages…”);
     next_tw_refresh = frameCount + 3000; //30 fps x 60 seconds
     print(frameCount);
     update_twits();
   }
  
   if(frameCount > next_line_time) {
      myPort.write(tweets[current_twitter].bytes[nextline]);
      nextline++;
      if(nextline >= tweets[current_twitter].pxlength) {current_twitter++;}
       if(current_twitter >= 20) {current_twitter = 0;}
   }
}

void update_twits() {
  new_lines = loadStrings(“http://linuxbox.dotmatrixdesign.net/~david/twit.php”);
  if(new_lines[0] != lines[0]) {
    lines = new_lines;
    current_twitter = 0;
    for (int i=0; i       tweets[i].description = lines[i];
      tweets[i].update();
    }
    println(“new Twitters downloaded”);
  }
}


void write_to_arduino (twit tosend) {
     myPort.write(‘w’);
     /*for(i = 0; i         myPort.write(byte(tosend.bytes[i]));
        print(tosend.bytes[i]);
        print(” “);
        delay(15);
     }*/
     myPort.write(byte(tosend.bytes));
     print(byte(tosend.bytes));
    println(“sent”);
       
}//end write



int[] addLetter(char letter, int bytes[], int startpos) {
  int col[] = new int[8];
  String colstr[] = new String[8];
  int letter_length;
  String zeros = “000”;
 
  switch (letter) {
    case ‘a’:
      colstr[0] = “11110”;     
      colstr[1] = “00101”;
      colstr[2] = “11110”;
      letter_length = 3;
      break;
    case ‘b’:
      colstr[0] = “11111”;     
      colstr[1] = “10101”;
      colstr[2] = “01010”;
      letter_length = 3;
      break;
    case ‘c’:
      colstr[0] = “01110”;     
      colstr[1] = “10001”;
      colstr[2] = “10001”;
      letter_length = 3;
      break;
    case ‘d’:
      colstr[0] = “11111”;     
      colstr[1] = “10001”;
      colstr[2] = “01110”;
      letter_length = 3;
      break;
    case ‘e’:
      colstr[0] = “11111”;     
      colstr[1] = “10101”;
      colstr[2] = “10101”;
      letter_length = 3;
      break;
    case ‘f’:
      colstr[0] = “11111”;     
      colstr[1] = “00101”;
      colstr[2] = “00101”;
      letter_length = 3;
      break;
    case ‘g’:
      colstr[0] = “01110”;     
      colstr[1] = “10001”;
      colstr[2] = “10101”;
      colstr[3] = “11101”;
      letter_length = 4;
      break;
    case ‘h’:
      colstr[0] = “11111”;     
      colstr[1] = “00100”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
    case ‘i’:
      colstr[0] = “10001”;     
      colstr[1] = “11111”;
      colstr[2] = “10001”;
      letter_length = 3;
      break;
    case ‘j’:
      colstr[0] = “11100”;     
      colstr[1] = “10000”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
    case ‘k’:
      colstr[0] = “11111”;     
      colstr[1] = “00100”;
      colstr[2] = “01010”;
      colstr[3] = “10001”;
      letter_length = 4;
      break;
    case ‘l’:
      colstr[0] = “11111”;     
      colstr[1] = “10000”;
      colstr[2] = “10000”;
      letter_length = 3;
      break;
    case ‘m’:
      colstr[0] = “11110”;     
      colstr[1] = “00001”;
      colstr[2] = “11110”;
      colstr[3] = “00001”;
      colstr[4] = “11110”;
      letter_length = 5;
      break;
    case ‘n’:
      colstr[0] = “11111”;     
      colstr[1] = “00010”;
      colstr[2] = “00100”;
      colstr[3] = “11111”;
      letter_length = 4;
      break;
    case ‘o’:
      colstr[0] = “11111”;     
      colstr[1] = “10001”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
    case ‘p’:
      colstr[0] = “11111”;     
      colstr[1] = “00101”;
      colstr[2] = “00111”;
      letter_length = 3;
      break;
    case ‘q’:
      colstr[0] = “11111”;     
      colstr[1] = “10001”;
      colstr[2] = “11111”;
      colstr[3] = “01000”;    
      letter_length = 4;
      break;
    case ‘r’:
      colstr[0] = “11111”;     
      colstr[1] = “00101”;
      colstr[2] = “11010”;
      letter_length = 3;
      break;
    case ‘s’:
      colstr[0] = “10111”;     
      colstr[1] = “10101”;
      colstr[2] = “11101”;
      letter_length = 3;
      break;
    case ‘t’:
      colstr[0] = “00001”;     
      colstr[1] = “11111”;
      colstr[2] = “00001”;
      letter_length = 3;
      break;
    case ‘u’:
      colstr[0] = “11111”;     
      colstr[1] = “10000”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
    case ‘v’:
      colstr[0] = “00111”;     
      colstr[1] = “11000”;
      colstr[2] = “00111”;
      letter_length = 3;
      break;
    case ‘w’:
      colstr[0] = “01111”;     
      colstr[1] = “10000”;
      colstr[2] = “01111”;
      colstr[3] = “10000”;
      colstr[4] = “01111”;
      letter_length = 5;
      break;
    case ‘x’:
      colstr[0] = “11011”;     
      colstr[1] = “00100”;
      colstr[2] = “11011”;
      letter_length = 3;
      break;
    case ‘y’:
      colstr[0] = “00111”;     
      colstr[1] = “11100”;
      colstr[2] = “00111”;
      letter_length = 3;
      break;
    case ‘z’:
      colstr[0] = “11001”;     
      colstr[1] = “10101”;
      colstr[2] = “10011”;
      colstr[3] = “10001”;
      letter_length = 4;
      break;
 
 
      case ‘0’:
      colstr[0] = “01110”;     
      colstr[1] = “10001”;
      colstr[2] = “01110”;           
      letter_length = 3;
      break;
     case ‘1’:
      colstr[0] = “00010”;     
      colstr[1] = “11111”;
      letter_length = 2;
      break;
     case ‘2’:
      colstr[0] = “11010”;     
      colstr[1] = “10101”;
      colstr[2] = “10010”;     
      letter_length = 3;
      break;
     case ‘3’:
      colstr[0] = “10101”;     
      colstr[1] = “10101”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
     case ‘4’:
      colstr[0] = “00111”;     
      colstr[1] = “00100”;
      colstr[2] = “11111”;           
      letter_length = 3;
      break;
     case ‘5’:
      colstr[0] = “10111”;     
      colstr[1] = “10101”;
      colstr[2] = “01001”;           
      letter_length = 3;
      break;
     case ‘6’:
      colstr[0] = “11111”;     
      colstr[1] = “10101”;
      colstr[2] = “11101”;           
      letter_length = 3;
      break;
     case ‘7’:
      colstr[0] = “11001”;     
      colstr[1] = “00101”;
      colstr[2] = “00011”;
      letter_length = 3;
      break;
     case ‘8’:
      colstr[0] = “11111”;     
      colstr[1] = “10101”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
     case ‘9’:
      colstr[0] = “00111”;     
      colstr[1] = “00101”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
 
 
    case ’ ‘:
      colstr[0] = “00000”;     
      colstr[1] = “00000”;
      letter_length = 2;
      break;
    case ‘!’:
      colstr[0] = “10111”;     
      letter_length = 1;
      break;
    case ‘.’:
    case ‘,’:
      colstr[0] = “10000”;     
      letter_length = 1;
      break;
    case ‘:’:
      colstr[0] = “01010”;     
      letter_length = 1;
      break;
    case ‘/’:
      colstr[0] = “11000”;     
      colstr[1] = “00100”;     
      colstr[2] = “00011”;     
      letter_length = 3;
      break;     
    case ‘\’:
      colstr[0] = “00011”;     
      colstr[1] = “00100”;     
      colstr[2] = “11000”;     
      letter_length = 3;
      break;     
    case ‘+’:
      colstr[0] = “00100”;     
      colstr[1] = “01110”;     
      colstr[2] = “00100”;     
      letter_length = 3;
      break;     
    case ‘-‘:
      colstr[0] = “00100”;     
      colstr[1] = “00100”;     
      colstr[2] = “00100”;     
      letter_length = 3;
      break;     
    case ‘@’:
      colstr[0] = “11111”;     
      colstr[1] = “10001”;     
      colstr[2] = “11101”;     
      colstr[3] = “11101”;     
      letter_length = 4;
      break;     
    case ‘?’:
      colstr[0] = “00001”;     
      colstr[1] = “10101”;     
      colstr[2] = “00111”;          
      letter_length = 3;
      break; 
    case ‘'’:
      colstr[0] = “00011”;     
      letter_length = 1;
      break;
   case ‘*’:
      colstr[0] = “00010”;     
      colstr[1] = “00111”;     
      colstr[2] = “00010”;     
      letter_length = 3;
      break;  
   case ‘(‘:
      colstr[0] = “01110”;     
      colstr[1] = “10001”;     
      letter_length = 2;
      break;
   case ‘)’:
      colstr[0] = “10001”;     
      colstr[1] = “01110”;     
      letter_length = 2;
      break;      
     
    default:
      colstr[0] = “11111”;     
      colstr[1] = “11111”;
      colstr[2] = “11111”;
      letter_length = 3;
      break;
  }
 
  for(int ch = 0; ch     colstr[ch] = zeros.concat(colstr[ch]);
    bytes[startpos+ch] = unbinary(colstr[ch]);
  }
 
  nextpos = startpos + letter_length;
 
  return(bytes);
}