Project tutorial
Mapping Melodies

Mapping Melodies

An elevator that plays music

  • 1,577 views
  • 0 comments
  • 0 respects

Components and supplies

Ardgen mega
Arduino Mega 2560 & Genuino Mega 2560
×1
10 White LED's
×1
MP3 Shield
×1

About this project

Site photography

Audio Recording

Audio Recording

PLANS & SECTIONS

TEXTURE

Introduction to the idea

In Progress

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).
Ardgen mega
Arduino Mega 2560 & Genuino Mega 2560
10 White LED's
MP3 Shield

Video Capture #1

Video Capture #1

Unexpected or Unique Things

Video Capture #2

Video Capture #2

The device

Code for the project

photoArray.ino
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

Code

photoArray.inoC/C++
photoArray.ino
#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

Similar projects you might like

Keyboard Melodies

Project tutorial by Ava Baker -21 and Natalie Clark -20

  • 1,843 views
  • 2 comments
  • 8 respects

Autonomous Navigation and 2D Mapping

Project in progress by Avirup Basu

  • 25,914 views
  • 13 comments
  • 27 respects

Robot Tracking and Mapping

Project tutorial by Mr. Ayman

  • 2,846 views
  • 1 comment
  • 5 respects

Door Bell with 48 Melodies (Antique)

Project showcase by Harrix

  • 1,629 views
  • 2 comments
  • 1 respect

Mapping Household Temperature Flow with Cheap Sensors

Project in progress by Andrew Jawitz

  • 46,395 views
  • 15 comments
  • 126 respects

Arduino MEGA Guitar Pedal

Project tutorial by electrosmash

  • 17,539 views
  • 2 comments
  • 105 respects
Add projectSign up / Login