LCD Octopus Animation (to Oahu by The 6ths)
November 20, 2011
Summary
This was a project that I did in Physical Computing during my first semester at Parsons. I used a 2-line by 16-character New Haven LCD Display and an Arduino. Luckily, I found this great website that provides a hexadecimal generator for creating custom character designs for LCD displays. The song in the animation is Oahu by The 6ths.
Animation (Wait for it… waaait for it… :))
Custom Character Designs
Arduino Code
[sourcecode]
#include <NewSoftSerial.h>
int rxPin = 4;
int txPin = 5;
NewSoftSerial LCD (rxPin, txPin);
void setup(){
Serial.begin(9600);
delay(50);
LCD.begin(9600);
LCD.print( 0xFE, BYTE );
LCD.print( 0x41, BYTE ); // turn LCD on
LCD.print( 0xFE, BYTE ); // set conrast
LCD.print( 0x51, BYTE );
LCD.print( 30, BYTE );
LCD.print( 0xFE, BYTE ); // set brightness
LCD.print( 0x53, BYTE );
LCD.print( 6, BYTE );
loadCustomCharacters();
}
void loop(){
// LCD.print(0xFE, BYTE); //clear screen
// LCD.print(0x51, BYTE); //move curs home
LCD.print(0xFE, BYTE);
LCD.print(0x45, BYTE); //select curs position
LCD.print(0x00, BYTE);
LCD.print(0xFE, BYTE); //move right to adjust for movement
LCD.print(0x56, BYTE);
printStretch();
delay(1000);
LCD.print(0xFE, BYTE); //move back left to prepare for squish
LCD.print(0x55, BYTE);
printSquish();
LCD.print(0xFE, BYTE);
LCD.print(0x56, BYTE);
delay(500);
}
void printStretch(){
LCD.print(0xFE, BYTE);//Set Cursor 00
LCD.print(0x45, BYTE);
LCD.print(0x00, BYTE);
LCD.print(6,BYTE);
LCD.print(0xFE, BYTE);//Set Cursor 01
LCD.print(0x45, BYTE);
LCD.print(0x01, BYTE);
LCD.print(4, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x02, BYTE);
LCD.print(0, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x40, BYTE);
LCD.print(7, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x41, BYTE);
LCD.print(5, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x42, BYTE);
LCD.print(1, BYTE);
}
void printSquish(){
LCD.print(0xFE, BYTE);//Set Cursor 00
LCD.print(0x45, BYTE);
LCD.print(0x00, BYTE);
LCD.print(2,BYTE);
LCD.print(0xFE, BYTE);//Set Cursor 01
LCD.print(0x45, BYTE);
LCD.print(0x01, BYTE);
LCD.print(0, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x40, BYTE);
LCD.print(3, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x41, BYTE);
LCD.print(1, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x02, BYTE);
LCD.print(0x20, BYTE);
LCD.print(0xFE, BYTE); //Set Cursor 40
LCD.print(0x45, BYTE);
LCD.print(0x42, BYTE);
LCD.print(0x20, BYTE);
}
void loadCustomCharacters(){
headLeft();
headRight();
stretchTL();
stretchTR();
stretchBL();
stretchBR();
squishLeft();
squishRight();
}
//START CUSTOM CHARS
void headLeft(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x1e,BYTE);
LCD.print(0x17,BYTE);
LCD.print(0x1f,BYTE);
}
void headRight(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(1,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x17,BYTE);
LCD.print(0x1e,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
}
void squishLeft(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(2,BYTE);
LCD.print(0x2,BYTE);
LCD.print(0x19,BYTE);
LCD.print(0x5,BYTE);
LCD.print(0x13,BYTE);
LCD.print(0xe,BYTE);
LCD.print(0x6,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0xf,BYTE);
}
void squishRight(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(3,BYTE);
LCD.print(0xf,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x6,BYTE);
LCD.print(0xe,BYTE);
LCD.print(0x13,BYTE);
LCD.print(0x5,BYTE);
LCD.print(0x19,BYTE);
LCD.print(0x2,BYTE);
}
void stretchTL(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(4,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x1e,BYTE);
LCD.print(0x6,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x7,BYTE);
}
void stretchTR(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(5,BYTE);
LCD.print(0x7,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x6,BYTE);
LCD.print(0x1e,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
}
void stretchBL(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(6,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x8,BYTE);
LCD.print(0x7,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x0,BYTE);
}
void stretchBR(){
LCD.print(0xFE,BYTE);
LCD.print(0x54,BYTE);
LCD.print(7,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x1f,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x7,BYTE);
LCD.print(0x8,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
LCD.print(0x0,BYTE);
}
[/sourcecode]