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]