Hardware components | ||||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 |
Site photography
1 / 5 • around the button
Audio Recording
PLANS & SECTIONS
1 / 2
TEXTURE
Introduction to the idea
In Progress
1 / 10
Concept Video
Wurster Lasercut File
Warning: embedding parts within the project story has been deprecated. To edit, remove or add more parts, go to the "Hardware" tab. To remove this list from the story, click on it to trigger the context menu, then click the trash can button (this won't delete it from the "Hardware" tab). | ||||||
![]() |
|
|||||
|
||||||
|
Video Capture #1
Video Capture #1
Unexpected or Unique Things
1 / 6
Video Capture #2
Video Capture #2
The device
Code for the project
Code for the project
Warning: Embedding code files within the project story has been deprecated. To edit this file or add more files, go to the "Software" tab. To remove this file from the story, click on it to trigger the context menu, then click the trash can button (this won't delete it from the "Software" tab).
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <LinkedList.h>
#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>
LiquidCrystal lcd(25,24,27,26,29,28);
int sandman[] = {1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1};
SdFat sd;
SFEMP3Shield MP3player;
const int FLOORTIME = 3000;
const int NUMFLOORS = 9;
const int PLAY = 1;
const int READ = 0;
int lightLevel[NUMFLOORS];
int high[NUMFLOORS];
int low[NUMFLOORS];
int floorsVisited = 0;
int currentFloor = 0;
int previousFloor = 0;
int lastTime = 0;
boolean stopped = 0;
const int PUSHED = LOW;
int startButton = 22;
int stopButton =23;
int mode = 2;
LinkedList<int> floorList = LinkedList<int>();
LinkedList<int> timeList = LinkedList<int>();
void setup()
{
// LED initialization
Serial.begin(9600);
for (int i = 0; i<NUMFLOORS;i++){
pinMode(i+30,OUTPUT); //LEDs start at pin 30 and go sequentially
}
Serial.println("begin");
// Array initialization
for (int i = 0; i < NUMFLOORS;i++) {
lightLevel[i]=0;
high[i]=0;
low[i] = 1023;
}
// SD card and MP3 initialization
sd.begin(SD_SEL, SPI_HALF_SPEED);
MP3player.begin();
uint16_t volume = 0;
MP3player.setVolume(volume);
// LCD initialization
lcd.begin(16, 2);
lcd.clear();
lcd.print("Want to hear our elevator pitch?");
//button initialization
pinMode(startButton, INPUT);
pinMode(stopButton, INPUT);
}
void loop()
{
//read buttons
int startState = digitalRead(startButton);
int stopState = digitalRead(stopButton);
if (startState == PUSHED && mode==READ) {
// enter PLAY mode
mode=PLAY;
} else if (mode == PLAY && stopState!=PUSHED){
// stay in PLAY
} else if (mode==PLAY && stopState==PUSHED){
// enter READ mode
mode=READ;
} else {
//stay in READ mode
}
if (mode==PLAY){ // enter play mode when start button is pushed
int j = 0;
while (stopState!=PUSHED){ // exit play mode when stop button pushed.
int rand = pickStart();
playFromList(rand+j % 9);
delay(300);
MP3player.stopTrack();
j++;
}
} else if (mode==READ){
int currentTime = millis();
previousFloor = currentFloor;
readFloors();
Serial.print("Current Floor: ");
Serial.println(currentFloor);
for (int i=0; i<NUMFLOORS;i++){
if (i+1!=currentFloor) {
digitalWrite(i+30,LOW);
} else {
digitalWrite(i+30,HIGH);
}
}
if (previousFloor != currentFloor) {
Serial.println("Floor Changed: ");
Serial.println(floorsVisited);
stopped=false;
lastTime = currentTime;
} else if (currentTime - lastTime > FLOORTIME && !stopped){
floorsVisited++;
stopped = true;
floorList.add(currentFloor);
timeList.add(millis());
}
}
delay(100);
}
void autoTune()
{
// Serial.print("Reading floors: ");
for (int i =0;i< NUMFLOORS; i++){
if (lightLevel[i]< low[i]){
low[i] = lightLevel[i];
}
if (lightLevel[i]> high[i]){
high[i] = lightLevel[i];
}
// Serial.println("Gonna start without adjusting");
// Serial.print(" Floor #");
// Serial.print(i+1);
// Serial.print(": ");
// Serial.print(lightLevel[i]);
lightLevel[i] = map(lightLevel[i], low[i]+30, high[i]-30, 0, 255);
lightLevel[i] = constrain(lightLevel[i], 0, 255); // 255 - lightLevel is nightlight mode
// Serial.print(" Floor #");
// Serial.print(i+1);
// Serial.print(": ");
// Serial.print(lightLevel[i]);
}
Serial.print("\n");
}
void readFloors(){ // this is where we will implement funtionality for reading the values
for (int i =0;i< NUMFLOORS; i++){
lightLevel[i] = analogRead(i+7);
}
autoTune();
int tmp = lightLevel[0];
//argmax i in lightLevel
for (int i =0;i< NUMFLOORS; i++){
tmp = max(tmp,lightLevel[i]);
if (lightLevel[i]==tmp){
currentFloor = i+1; // current floor is analog input + 1
}
}
}
int pickStart() { // returns the rand so that you know where to start
int rand = random(0,floorList.size());
// use random number to add things find time
int time = timeList.get(rand);
int ago = millis()-time; // milliseconds since
// decide what time to display using ago
lcdDisplay(ago);
return rand;
}
// uses a time to decide what message to display
void lcdDisplay(int ago) {
//decide what to display
lcd.clear();
int seconds = ago/1000;
int minutes = seconds/60;
int hours = minutes/60;
if (hours) {
lcd.print(hours);
lcd.print(" hours ago...");
} else if (minutes) {
lcd.print(minutes);
lcd.print(" minutes ago..");
} else {
lcd.print("Just seconds ago!!!");
}
}
// plays a floor's sound using an index in the array of floors
void playFromList(int index){
int note = floorList.get(index);
MP3player.playTrack(note);
}
// Use this for defeating cold start.
void initializeFloorArray(){
int len = 42;
for (int i = 0; i< len;i++){
floorList.add(random(0,9));
timeList.add((42-i)*-10000);
}
// {1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1}
}
FINAL PRODUCT
1 / 4
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <LinkedList.h>
#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>
LiquidCrystal lcd(25,24,27,26,29,28);
int sandman[] = {1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1};
SdFat sd;
SFEMP3Shield MP3player;
const int FLOORTIME = 3000;
const int NUMFLOORS = 9;
const int PLAY = 1;
const int READ = 0;
int lightLevel[NUMFLOORS];
int high[NUMFLOORS];
int low[NUMFLOORS];
int floorsVisited = 0;
int currentFloor = 0;
int previousFloor = 0;
int lastTime = 0;
boolean stopped = 0;
const int PUSHED = LOW;
int startButton = 22;
int stopButton =23;
int mode = 2;
LinkedList<int> floorList = LinkedList<int>();
LinkedList<int> timeList = LinkedList<int>();
void setup()
{
// LED initialization
Serial.begin(9600);
for (int i = 0; i<NUMFLOORS;i++){
pinMode(i+30,OUTPUT); //LEDs start at pin 30 and go sequentially
}
Serial.println("begin");
// Array initialization
for (int i = 0; i < NUMFLOORS;i++) {
lightLevel[i]=0;
high[i]=0;
low[i] = 1023;
}
// SD card and MP3 initialization
sd.begin(SD_SEL, SPI_HALF_SPEED);
MP3player.begin();
uint16_t volume = 0;
MP3player.setVolume(volume);
// LCD initialization
lcd.begin(16, 2);
lcd.clear();
lcd.print("Want to hear our elevator pitch?");
//button initialization
pinMode(startButton, INPUT);
pinMode(stopButton, INPUT);
}
void loop()
{
//read buttons
int startState = digitalRead(startButton);
int stopState = digitalRead(stopButton);
if (startState == PUSHED && mode==READ) {
// enter PLAY mode
mode=PLAY;
} else if (mode == PLAY && stopState!=PUSHED){
// stay in PLAY
} else if (mode==PLAY && stopState==PUSHED){
// enter READ mode
mode=READ;
} else {
//stay in READ mode
}
if (mode==PLAY){ // enter play mode when start button is pushed
int j = 0;
while (stopState!=PUSHED){ // exit play mode when stop button pushed.
int rand = pickStart();
playFromList(rand+j % 9);
delay(300);
MP3player.stopTrack();
j++;
}
} else if (mode==READ){
int currentTime = millis();
previousFloor = currentFloor;
readFloors();
Serial.print("Current Floor: ");
Serial.println(currentFloor);
for (int i=0; i<NUMFLOORS;i++){
if (i+1!=currentFloor) {
digitalWrite(i+30,LOW);
} else {
digitalWrite(i+30,HIGH);
}
}
if (previousFloor != currentFloor) {
Serial.println("Floor Changed: ");
Serial.println(floorsVisited);
stopped=false;
lastTime = currentTime;
} else if (currentTime - lastTime > FLOORTIME && !stopped){
floorsVisited++;
stopped = true;
floorList.add(currentFloor);
timeList.add(millis());
}
}
delay(100);
}
void autoTune()
{
// Serial.print("Reading floors: ");
for (int i =0;i< NUMFLOORS; i++){
if (lightLevel[i]< low[i]){
low[i] = lightLevel[i];
}
if (lightLevel[i]> high[i]){
high[i] = lightLevel[i];
}
// Serial.println("Gonna start without adjusting");
// Serial.print(" Floor #");
// Serial.print(i+1);
// Serial.print(": ");
// Serial.print(lightLevel[i]);
lightLevel[i] = map(lightLevel[i], low[i]+30, high[i]-30, 0, 255);
lightLevel[i] = constrain(lightLevel[i], 0, 255); // 255 - lightLevel is nightlight mode
// Serial.print(" Floor #");
// Serial.print(i+1);
// Serial.print(": ");
// Serial.print(lightLevel[i]);
}
Serial.print("\n");
}
void readFloors(){ // this is where we will implement funtionality for reading the values
for (int i =0;i< NUMFLOORS; i++){
lightLevel[i] = analogRead(i+7);
}
autoTune();
int tmp = lightLevel[0];
//argmax i in lightLevel
for (int i =0;i< NUMFLOORS; i++){
tmp = max(tmp,lightLevel[i]);
if (lightLevel[i]==tmp){
currentFloor = i+1; // current floor is analog input + 1
}
}
}
int pickStart() { // returns the rand so that you know where to start
int rand = random(0,floorList.size());
// use random number to add things find time
int time = timeList.get(rand);
int ago = millis()-time; // milliseconds since
// decide what time to display using ago
lcdDisplay(ago);
return rand;
}
// uses a time to decide what message to display
void lcdDisplay(int ago) {
//decide what to display
lcd.clear();
int seconds = ago/1000;
int minutes = seconds/60;
int hours = minutes/60;
if (hours) {
lcd.print(hours);
lcd.print(" hours ago...");
} else if (minutes) {
lcd.print(minutes);
lcd.print(" minutes ago..");
} else {
lcd.print("Just seconds ago!!!");
}
}
// plays a floor's sound using an index in the array of floors
void playFromList(int index){
int note = floorList.get(index);
MP3player.playTrack(note);
}
// Use this for defeating cold start.
void initializeFloorArray(){
int len = 42;
for (int i = 0; i< len;i++){
floorList.add(random(0,9));
timeList.add((42-i)*-10000);
}
// {1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1,1,3,5,7,6,5,3,1,2,4,6,8,7,1}
}
Comments