lucy, the good karma night lamp.
Lucy, the magic-6-cube evolved into Lucy, the good karma night lamp. She wants to make people happy since the moment they wake up. So she turned into a night lamp that sleeps next to you and lights up your life in the darkness. When you wake up, you wake her up, and ask her if you’ll have a good day today. She then asks you to tilt her for your answer… and VOILA! You get your good karma with deep thoughts like “WORD”, “HELL YEAH”, and “BET ON IT”.
/* LUCY, THE GOOD KARMA NIGHT LAMP Requires LoL Shield library, at least V0.2Beta http://code.google.com/p/lolshield/downloads/list And the Font.cpp from LoL_Shield-100915.zip on ikkei's page: http://web.mac.com/kxm_ikkei/Site/LoL.html Based on original TEXT SAMPLE CODE for LOL Shield for Arduino Copyright 2009/2010 Benjamin Sonntag <benjamin@sonntag.fr> http://benjamin.sonntag.fr/ (This version edited by Monica Arias) */ #include "Charliplexing.h" #include "Font.h" #include "WProgram.h" // Technically the number of columns of LEDs minus one #define SCREEN_WIDTH 13 // Scroll delay: lower values result in faster scrolling #define SCROLL_DELAY 80 /* How long to wait after the last letter before going back to the beginning and repeating */ #define REPEAT_DELAY 500 char ask[]="ASK N TILT"; // SMILEY FACE byte line = 0; //Row counter char buffer[10]; int value; // BUTTON int tiltPin = A5; // the number of the tilt sensor int leftPin = A0; int ledPin = A2; int tiltState = 0; // variable for reading the tilt status int leftState; // variable for reading the left pushbutton status int textLength, totalPixels; char text[10]; int r=0; // ------------------------------------------------------------ // ------------------------------------------------------------ void setup() { Serial.begin(9600); LedSign::Init(); pinMode(ledPin, OUTPUT); pinMode(tiltPin, INPUT); pinMode(leftPin, INPUT); } // ------------------------------------------------------------ // ------------------------------------------------------------ void loop() { tiltState = digitalRead(tiltPin); leftState = digitalRead(leftPin); // LEFT BUTTON if (leftState == HIGH) { digitalWrite(ledPin, LOW); smiley(); predictions(); } else { digitalWrite(ledPin, HIGH); sleeping(); } } // ------------------------------------------------------------ // ------------------------------------------------------------ // FUNCTION TILT SWITCH void predictions(){ if (tiltState == HIGH) { r = int(random(4)); if(r==0){ text[0] = 'H'; text[1] = 'E'; text[2] = 'L'; text[3] = 'L'; text[4] = ' '; text[5] = 'Y'; text[6] = 'E'; text[7] = 'A'; text[8] = 'H'; text[9] = '!'; } else if(r==1) { text[0] = 'B'; text[1] = 'E'; text[2] = 'T'; text[3] = ' '; text[4] = 'O'; text[5] = 'N'; text[6] = ' '; text[7] = 'I'; text[8] = 'T'; text[9] = '!'; } else if(r==2) { text[0] = 'W'; text[1] = 'O'; text[2] = 'R'; text[3] = 'D'; text[4] = ' '; text[5] = ' '; text[6] = ' '; text[7] = ' '; text[8] = ' '; text[9] = ' '; } else if(r==3) { text[0] = 'B'; text[1] = 'E'; text[2] = 'L'; text[3] = 'I'; text[4] = 'E'; text[5] = 'V'; text[6] = 'E'; text[7] = ' '; text[8] = 'I'; text[9] = 'T'; } getLength(text, &textLength, &totalPixels); int x=0; for(int j=SCREEN_WIDTH; j>-totalPixels-SCREEN_WIDTH; j--) { x=j; LedSign::Clear(); for(int i=0; i<textLength; i++) { x += Font::Draw(text[i],x,0); if (x>=SCREEN_WIDTH) break; } delay(SCROLL_DELAY); } delay(REPEAT_DELAY); } } // FUNCTION void smiley(){ delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); // TILT delay(400); DisplayBitMap(0); DisplayBitMap(14); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(46); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(174); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(932); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); } // FUNCTION void sleeping(){ delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(480); DisplayBitMap(1008); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); } // FUNCTION void DisplayBitMap(int lineint) { //int data[9] = {95, 247, 123, 511, 255, 1, 5, 31, 15}; //for(line = 0; line < 9; line++) { for (byte led=0; led<14; ++led) { if (lineint & (1<<led)) { LedSign::Set(led, line, 1); } else { LedSign::Set(led, line, 0); } } line++; if(line >= 9) line = 0; } // FUNCTION void getLength(char* charArray, int* lengthPtr, int* pixelPtr) { /* Finds the length of a string in terms of characters and pixels and assigns them to the variable at addresses lengthPtr and pixelPtr, respectively. */ int charCount = 0, pixelCount = 0; char * charPtr = charArray; // Count chars until newline or null character reached while (*charPtr != '\0' && *charPtr != '\n') { charPtr++; charCount++; /* Increment pixelCount by the number of pixels the current character takes up horizontally. */ pixelCount += Font::Draw(*charPtr,-SCREEN_WIDTH,0); } *pixelPtr = pixelCount; *lengthPtr = charCount; }
For the final presentation I uploaded a demo code to show how she would work. Here’s the “fake” code.
#include "Charliplexing.h" #include "Font.h" #include "WProgram.h" // Technically the number of columns of LEDs minus one #define SCREEN_WIDTH 13 // Scroll delay: lower values result in faster scrolling #define SCROLL_DELAY 80 /* How long to wait after the last letter before going back to the beginning and repeating */ #define REPEAT_DELAY 500 // SMILEY FACE byte line = 0; //Row counter char buffer[10]; int value; int ledPin = A2; // BUTTON int inPin = A0; // the number of the input pin int state = LOW; // the current state of the output pin int reading; // the current reading from the input pin int previous = HIGH; // the previous reading from the input pin // the follow variables are long's because the time, measured in miliseconds, // will quickly become a bigger number than can be stored in an int. long time = 0; // the last time the output pin was toggled long debounce = 200; // the debounce time, increase if the output flickers int textLength, totalPixels; char text[10]; int r=0; void setup() { Serial.begin(9600); LedSign::Init(); pinMode(ledPin, OUTPUT); pinMode(inPin, INPUT); } void loop() { reading = digitalRead(inPin); if (reading == HIGH && previous == LOW && millis() - time > debounce) { if (state == HIGH) state = LOW; else state = HIGH; time = millis(); } digitalWrite(ledPin, HIGH); sleeping(); delay(100); digitalWrite(ledPin, LOW); smiley(); predictions(); delay(1000); previous = reading; } // FUNCTION void smiley(){ delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(4092); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(2040); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(1560); DisplayBitMap(3900); DisplayBitMap(1560); DisplayBitMap(0); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); // TILT delay(400); DisplayBitMap(0); DisplayBitMap(14); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(4); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(46); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(36); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(174); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(164); DisplayBitMap(932); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(7342); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2212); DisplayBitMap(2980); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(0); } // FUNCTION TILT SWITCH void predictions(){ r = int(random(4)); if(r==0){ text[0] = 'H'; text[1] = 'E'; text[2] = 'L'; text[3] = 'L'; text[4] = ' '; text[5] = 'Y'; text[6] = 'E'; text[7] = 'A'; text[8] = 'H'; text[9] = '!'; } else if(r==1) { text[0] = 'B'; text[1] = 'E'; text[2] = 'T'; text[3] = ' '; text[4] = 'O'; text[5] = 'N'; text[6] = ' '; text[7] = 'I'; text[8] = 'T'; text[9] = '!'; } else if(r==2) { text[0] = 'W'; text[1] = 'O'; text[2] = 'R'; text[3] = 'D'; text[4] = ' '; text[5] = ' '; text[6] = ' '; text[7] = ' '; text[8] = ' '; text[9] = ' '; } else if(r==3) { text[0] = 'B'; text[1] = 'E'; text[2] = 'L'; text[3] = 'I'; text[4] = 'E'; text[5] = 'V'; text[6] = 'E'; text[7] = ' '; text[8] = 'I'; text[9] = 'T'; } getLength(text, &textLength, &totalPixels); int x=0; for(int j=SCREEN_WIDTH; j>-totalPixels-SCREEN_WIDTH; j--) { x=j; LedSign::Clear(); for(int i=0; i<textLength; i++) { x += Font::Draw(text[i],x,0); if (x>=SCREEN_WIDTH) break; } delay(SCROLL_DELAY); } delay(REPEAT_DELAY); } // FUNCTION void sleeping(){ delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(480); DisplayBitMap(1008); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(480); DisplayBitMap(1008); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(480); DisplayBitMap(1008); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(480); DisplayBitMap(1008); DisplayBitMap(1008); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); delay(400); DisplayBitMap(0); DisplayBitMap(4386); DisplayBitMap(3612); DisplayBitMap(0); DisplayBitMap(192); DisplayBitMap(480); DisplayBitMap(480); DisplayBitMap(192); DisplayBitMap(0); } // FUNCTION void DisplayBitMap(int lineint) { //int data[9] = {95, 247, 123, 511, 255, 1, 5, 31, 15}; //for(line = 0; line < 9; line++) { for (byte led=0; led<14; ++led) { if (lineint & (1<<led)) { LedSign::Set(led, line, 1); } else { LedSign::Set(led, line, 0); } } line++; if(line >= 9) line = 0; } // FUNCTION void getLength(char* charArray, int* lengthPtr, int* pixelPtr) { /* Finds the length of a string in terms of characters and pixels and assigns them to the variable at addresses lengthPtr and pixelPtr, respectively. */ int charCount = 0, pixelCount = 0; char * charPtr = charArray; // Count chars until newline or null character reached while (*charPtr != '\0' && *charPtr != '\n') { charPtr++; charCount++; /* Increment pixelCount by the number of pixels the current character takes up horizontally. */ pixelCount += Font::Draw(*charPtr,-SCREEN_WIDTH,0); } *pixelPtr = pixelCount; *lengthPtr = charCount; }
Reply