I am, by no means, a software engineer. My code is crude at best, but it works 
/*
* Project Eros
* CC-BY-SA Matthew Eargle
* AirborneSurfer Productions
* for element14 Presents
*
* airbornesurfer.com
* element14.com/presents
*/
#include <Servo.h>
Servo needle; // create servo object "needle" to move the needle
// declare global variables
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int meterPosition = 0;
int needlePosition = 0;
int readingMin = 1023;
int readingMax = 0;
int loveMatic = 1;
int heart2 = 2;
int hotStuff = 3;
int fullHearts = 4;
int meter9 = 5;
int meter8 = 6;
int meter7 = 7;
int meter6 = 8;
int meter5 = 9;
int meter4 = 10;
int meter3 = 11;
int meter2 = 12;
int meter1 = 13;
int needlePin = 14;
int brokenHeart = 16;
int coldFish = 17;
int heart1 = 18;
int heart3 = 19;
//int handlePin = 1;
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
needle.write(70);
// set pinmodes for input and output
pinMode(needlePin, OUTPUT);
pinMode(hotStuff, OUTPUT);
pinMode(loveMatic, OUTPUT);
pinMode(heart3, OUTPUT);
pinMode(brokenHeart, OUTPUT);
pinMode(meter1, OUTPUT);
pinMode(meter2, OUTPUT);
pinMode(meter3, OUTPUT);
pinMode(meter4, OUTPUT);
pinMode(meter5, OUTPUT);
pinMode(meter6, OUTPUT);
pinMode(meter7, OUTPUT);
pinMode(meter8, OUTPUT);
pinMode(meter9, OUTPUT);
pinMode(fullHearts, OUTPUT);
pinMode(coldFish, OUTPUT);
pinMode(heart1, OUTPUT);
pinMode(heart2, OUTPUT);
// attach servo to Arduino
needle.attach(needlePin);
}
void loop() {
// read the sensor and show timer
while (millis() < 10000) {
if (millis() >= 9000 && millis() < 10000) {
digitalWrite(meter9, LOW);
digitalWrite(meter8, LOW);
digitalWrite(meter7, LOW);
digitalWrite(meter6, LOW);
digitalWrite(meter5, LOW);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
}
else if (millis() >= 8000 && millis() < 9000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, LOW);
digitalWrite(meter7, LOW);
digitalWrite(meter6, LOW);
digitalWrite(meter5, LOW);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
}
else if (millis() >= 7000 && millis() < 8000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, LOW);
digitalWrite(meter6, LOW);
digitalWrite(meter5, LOW);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(111);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(111);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(111);
}
else if (millis() >= 6000 && millis() < 7000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, LOW);
digitalWrite(meter5, LOW);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 5000 && millis() < 6000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, LOW);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 4000 && millis() < 5000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, HIGH);
digitalWrite(meter4, LOW);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 3000 && millis() < 4000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, HIGH);
digitalWrite(meter4, HIGH);
digitalWrite(meter3, LOW);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 2000 && millis() < 3000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, HIGH);
digitalWrite(meter4, HIGH);
digitalWrite(meter3, HIGH);
digitalWrite(meter2, LOW);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 1000 && millis() < 2000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, HIGH);
digitalWrite(meter4, HIGH);
digitalWrite(meter3, HIGH);
digitalWrite(meter2, HIGH);
digitalWrite(meter1, LOW);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
else if (millis() >= 0 && millis() < 1000) {
digitalWrite(meter9, HIGH);
digitalWrite(meter8, HIGH);
digitalWrite(meter7, HIGH);
digitalWrite(meter6, HIGH);
digitalWrite(meter5, HIGH);
digitalWrite(meter4, HIGH);
digitalWrite(meter3, HIGH);
digitalWrite(meter2, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(heart1, LOW);
digitalWrite(heart2, LOW);
digitalWrite(heart3, HIGH);
delay(333);
digitalWrite(heart1, LOW);
digitalWrite(heart2, HIGH);
digitalWrite(heart3, LOW);
delay(333);
digitalWrite(heart1, HIGH);
digitalWrite(heart2, LOW);
digitalWrite(heart3, LOW);
delay(333);
}
// take readings from the handles and find the average (adapted from "smoothing" example code)
// subtract the last reading:
total = total - readings[readIndex];
// read from the sensor:
readings[readIndex] = analogRead(A1);
// add the reading to the total:
total = total + readings[readIndex];
// advance to the next position in the array:
readIndex = readIndex + 1;
// if we're at the end of the array...
if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;
}
// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits
Serial.println(average);
delay(1); // delay in between reads for stability
}
Serial.println("done!");
int reading = average;
needlePosition = map(reading, 400, 1023, 120, 0); // scale meter value to use it with the servo (value between 0 and 180)
meterPosition = map(reading, 400, 1023, 0, 10); // scale meter value for light meter (value between 0 and 10)
meterPosition = constrain(meterPosition, 0, 10);
Serial.println(meterPosition);
needle.write(120);
delay(200);
finish();
}
void finish() {
switch (meterPosition) {
case 0:
while(true) {
digitalWrite(brokenHeart, HIGH);
digitalWrite(coldFish, LOW);
delay(200);
digitalWrite(brokenHeart, LOW);
digitalWrite(coldFish, HIGH);
needle.write(140); // sets the servo position according to the scaled value
delay(200);
}
case 1:
while(true) {
digitalWrite(brokenHeart, HIGH);
digitalWrite(coldFish, LOW);
delay(200);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, HIGH);
needle.write(needlePosition); // sets the servo position according to the scaled value
delay(200);
}
case 2:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
while(true) {
digitalWrite(coldFish, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(coldFish, LOW);
delay(200);
}
case 3:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
while(true) {
digitalWrite(coldFish, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(coldFish, LOW);
delay(200);
}
case 4:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
while(true) {
digitalWrite(coldFish, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(coldFish, LOW);
delay(200);
}
case 5:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
while(true) {
needle.write(needlePosition);
}
case 6:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/6);
delay(200);
digitalWrite(meter6, HIGH);
while(true) {
digitalWrite(hotStuff, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(hotStuff, LOW);
delay(200);
}
case 7:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/6);
delay(200);
digitalWrite(meter6, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/7);
delay(200);
digitalWrite(meter7, HIGH);
while(true) {
digitalWrite(hotStuff, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(hotStuff, LOW);
delay(200);
}
case 8:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/6);
delay(200);
digitalWrite(meter6, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/7);
delay(200);
digitalWrite(meter7, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/8);
delay(200);
digitalWrite(meter8, HIGH);
while(true) {
digitalWrite(hotStuff, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(hotStuff, LOW);
delay(200);
}
case 9:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/6);
delay(200);
digitalWrite(meter6, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/7);
delay(200);
digitalWrite(meter7, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/8);
delay(200);
digitalWrite(meter8, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/9);
delay(200);
digitalWrite(meter9, HIGH);
while(true) {
digitalWrite(hotStuff, HIGH);
needle.write(needlePosition);
delay(200);
digitalWrite(hotStuff, LOW);
delay(200);
}
case 10:
digitalWrite(brokenHeart, HIGH);
digitalWrite(meter1, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/2);
delay(200);
digitalWrite(meter2, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/3);
delay(200);
digitalWrite(meter3, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/4);
delay(200);
digitalWrite(meter4, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/5);
delay(200);
digitalWrite(meter5, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/6);
delay(200);
digitalWrite(meter6, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/7);
delay(200);
digitalWrite(meter7, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/8);
delay(200);
digitalWrite(meter8, HIGH);
digitalWrite(coldFish, LOW);
needle.write((needlePosition+120)/9);
delay(200);
digitalWrite(meter9, HIGH);
while(true) {
digitalWrite(hotStuff, HIGH);
digitalWrite(4, LOW);
needle.write(needlePosition);
delay(200);
digitalWrite(hotStuff, LOW);
digitalWrite(4, HIGH);
delay(200);
}
}
}