Snippets

Jason Matusiak HolidayHotline

Created by Jason Matusiak

File HolidayHotline.ino Added

  • Ignore whitespace
  • Hide word diff
+//North Pole Hotline 
+//some good Arduino example code: http://www.hauntforum.com/showpost.php?p=849581&postcount=24
+#include <SoftwareSerial.h>
+
+const int SET_VOLUME = 0x15;
+
+//pins D0 and D1 are reserved for hard serial RX/TX (respectively)
+
+const int ringer = 2;
+
+const int R1 = 4; 
+const int R2 = 5;   
+const int R3 = 6;   
+const int R4 = 7;
+
+const int C1 = 8; 
+const int C2 = 9;   
+const int C3 = 10;   
+const int C4 = 11;
+
+const int LED = 13;
+
+const int BUSY = 16; //16, (A2) busy signal from MP3 player when playing a track
+
+const int dialTone = 0x01;
+const int busyTone = 0x25;
+
+SoftwareSerial mp3Serial = SoftwareSerial (A0, A1); // binds a serial port instance to pins 14 & 15 for RX/TX respectively [A0 and A1]
+
+
+void setup() {
+    pinMode(ringer, INPUT_PULLUP); // sets the digital pin 2 as input
+    pinMode(BUSY, INPUT_PULLUP); // sets the digital pin 2 as input
+    
+    pinMode(R1, OUTPUT);      // sets the digital pin 4 as an output
+    digitalWrite(R1, HIGH);
+    pinMode(R2, OUTPUT);      // sets the digital pin 5 as an output
+    digitalWrite(R2, HIGH);
+    pinMode(R3, OUTPUT);      // sets the digital pin 6 as an output
+    digitalWrite(R3, HIGH);
+    pinMode(R4, OUTPUT);      // sets the digital pin 7 as an output
+    digitalWrite(R4, HIGH);
+    
+    pinMode(LED, OUTPUT);
+    digitalWrite(LED, LOW);
+    
+    pinMode(C1, INPUT_PULLUP);      // sets the digital pin 8 as input
+    pinMode(C2, INPUT_PULLUP);      // sets the digital pin 9 as input
+    pinMode(C3, INPUT_PULLUP);      // sets the digital pin 10 as input
+    pinMode(C4, INPUT_PULLUP);      // sets the digital pin 11 as input
+    
+    //Setting up the software serial port
+    pinMode(A0, INPUT);
+    pinMode(A1, OUTPUT);
+    
+    //setup serial port of 9600baud
+    Serial.begin(9600, SERIAL_8N1);     // opens serial port, sets data rate to 9600 bps with 8-N-1
+    
+    mp3Serial.begin(9600);
+    
+    //delay( 3000 ); // power-up safety delay
+    Serial.write("Starting app\n");
+    
+    setup_mp3Player();
+}
+
+
+int pollKeypad()
+{
+    int keypadPressed = 0xFF;
+
+    for(int i = 0; i < 4; i++)
+    {
+        digitalWrite(R1, HIGH);
+        digitalWrite(R2, HIGH);
+        digitalWrite(R3, HIGH);
+        digitalWrite(R4, HIGH);
+    
+        if(i == 0)
+        {
+            digitalWrite(R1, LOW);
+          
+            if (!digitalRead(C1))
+            {
+                keypadPressed = 0x11;
+                Serial.write("1\n");
+                delay(300);
+                while(!digitalRead(C1)){}
+            }
+            else if (!digitalRead(C2))
+            {
+                keypadPressed = 0x12;
+                Serial.write("2\n");
+                delay(300);
+                while(!digitalRead(C2)){}
+            }
+            else if (!digitalRead(C3))
+            {
+                keypadPressed = 0x13;
+                Serial.write("3\n");
+                delay(300);
+                while(!digitalRead(C3)){}
+            }
+        }
+        else if (i == 1)
+        {
+            digitalWrite(R2, LOW);
+          
+            if (!digitalRead(C1))
+            {
+                keypadPressed = 0x14;
+                Serial.write("4\n");
+                delay(300);
+                while(!digitalRead(C1)){}
+            }
+            else if (!digitalRead(C2))
+            {
+                keypadPressed = 0x15;
+                Serial.write("5\n");
+                delay(300);
+                while(!digitalRead(C2)){}
+            }
+            else if (!digitalRead(C3))
+            {
+                keypadPressed = 0x16;
+                Serial.write("6\n");
+                delay(300);
+                while(!digitalRead(C3)){}
+            }
+        }
+        else if (i == 2)
+        {
+            digitalWrite(R3, LOW);
+          
+            if (!digitalRead(C1))
+            {
+                keypadPressed = 0x17;
+                Serial.write("7\n");
+                delay(300);
+                while(!digitalRead(C1)){}
+            }
+            else if (!digitalRead(C2))
+            {
+                keypadPressed = 0x18;
+                Serial.write("8\n");
+                delay(300);
+                while(!digitalRead(C2)){}
+            }
+            else if (!digitalRead(C3))
+            {
+                keypadPressed = 0x19;
+                Serial.write("9\n");
+                delay(300);
+                while(!digitalRead(C3)){}
+            }
+        }
+        else if (i == 3)
+        {
+            digitalWrite(R4, LOW);
+          
+            if (!digitalRead(C1))
+            {
+                keypadPressed = 0x20;
+                Serial.write("*\n");
+                delay(300);
+                while(!digitalRead(C1)){}
+            }
+            else if (!digitalRead(C2))
+            {
+                keypadPressed = 0x10;
+                Serial.write("0\n");
+                delay(300);
+                while(!digitalRead(C2)){}
+            }
+            else if (!digitalRead(C3))
+            {
+                keypadPressed = 0x21;
+                Serial.write("#\n");
+                delay(300);
+                while(!digitalRead(C3)){}
+            }
+            else if (!digitalRead(C4))
+            {
+                keypadPressed = 0x22;
+                Serial.write("RD\n");
+                delay(300);
+                while(!digitalRead(C4)){}
+            }
+        }
+   
+        digitalWrite(R1, HIGH);
+        digitalWrite(R2, HIGH);
+        digitalWrite(R3, HIGH);
+        digitalWrite(R4, HIGH);
+      
+        if(keypadPressed != 0xFF)
+        {
+            delay(45);
+            break;
+        }
+    }
+    return keypadPressed;
+}
+
+
+void loop()
+{
+      int buttonPressed = 0xFF;
+      
+      //while the phone is hung up
+      while(!digitalRead(ringer))
+      {
+            delay(45);
+      }
+  
+      //At this point, someone has picked up the phone
+      digitalWrite(LED, HIGH);
+      playDialTone();
+  
+    //while the phone is off the hook
+    while(digitalRead(ringer))
+    {
+        buttonPressed = pollKeypad();
+        if(buttonPressed != 0xFF)
+        {
+            stopAudio();
+            playAudioClip(buttonPressed);
+      
+            //while an audio track is playing AND the ringer is off the hook
+            while(digitalRead(BUSY) && digitalRead(ringer))
+            {
+                delay(45);
+            }
+      
+            //if the ringer is hung up but we are still playing audio hang
+            //it up else, it means the audio is done, so play the busy tone
+            if(digitalRead(BUSY))
+            {
+                stopAudio();
+            }
+            else
+            {
+                playBusyTone();
+            }
+            //while the ringer is off the hook, just wait
+            while(digitalRead(ringer))
+            {
+                delay(45);
+            }
+            //the ringer has been hung up
+            stopAudio();
+        }
+    }
+    //just in case, stop the audio
+    stopAudio();
+    digitalWrite(LED, LOW);
+}
+
+
+void setup_mp3Player()
+{
+    int volumeLevel = 0;
+    int singleMode = 0;
+    
+    //Set index to index 1
+    mp3Serial.write(0xF1);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    Serial.print("return code from 0xF1 of ");
+    Serial.println(mp3Serial.read());
+    
+    //toggle MP3 player until option to repeat single track is setup (as opposed to all tracks)
+    mp3Serial.write(0xE0);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    singleMode = mp3Serial.read();  
+    if(singleMode != 0x00)
+    {
+        mp3Serial.write(0xE0);
+        delay(100);
+        while(mp3Serial.available() == 0){}
+        singleMode = mp3Serial.read();
+    }
+  
+    // Queries number of tracks on SD card and returns number, which is printed to serial monitor
+    mp3Serial.write(0xE3); 
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    Serial.print("Total of ");
+    Serial.print(mp3Serial.read());
+    Serial.println(" tracks found on SD Card");
+    
+    // Send Vol+ command to get current volume return message.
+    mp3Serial.write(0xE9); 
+    delay(100);
+    while(mp3Serial.available() == 0){}
+  
+    volumeLevel = mp3Serial.read();
+    Serial.println("The volume started at: ");
+    Serial.println(volumeLevel);
+    
+    // NOTE: the hex value is automatically converted to ASCII by serial, so 0x1E will read as "30"
+    if(volumeLevel == SET_VOLUME) 
+    { 
+        // if the return message is the SET_VOLUME, it's at the perferred value
+        Serial.println("Preferred volume set.");
+    } 
+    else if(volumeLevel < SET_VOLUME)
+    {
+        // If the volume is lower than preferred, start the volume increase loop
+        for(int v = volumeLevel; v <= SET_VOLUME; v = v + 1) 
+        {
+            mp3Serial.write(0xE9);
+            delay(100);
+            while(mp3Serial.available() == 0){} 
+            volumeLevel = mp3Serial.read();
+        }
+        Serial.println("Volume adjusted up to preferred level.");
+    }
+    else
+    {
+        // If the volume is higher than preferred, start the volume decrease loop
+        for(int v = volumeLevel; v >= SET_VOLUME; v = v - 1) 
+        {
+            mp3Serial.write(0xE8);
+            delay(100);
+            while(mp3Serial.available() == 0){} 
+            mp3Serial.read();
+        }
+        Serial.println("Volume adjusted down to preferred level.");
+    }
+}
+
+
+// This function stops all audio
+void stopAudio() 
+{
+    //Send stop command
+    mp3Serial.write(0xFA);
+    delay(100); 
+    Serial.println("Stopping audio");
+    while(mp3Serial.available() == 0){}
+}
+
+
+// This function plays the dial tone
+void playDialTone() 
+{
+    //Set MP3 to continue to play when track is done
+    mp3Serial.write(0xE2);
+    delay(100); 
+    while(mp3Serial.available() == 0){}
+    if(mp3Serial.read() == 0x00)
+    {
+        mp3Serial.write(0xE2);
+        delay(100);
+        while(mp3Serial.available() == 0){}
+        mp3Serial.read();
+    }  
+
+    //Send command to play dial tone track
+    mp3Serial.write(dialTone);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    mp3Serial.read();
+    Serial.print("Now playing dial tone track ");
+    Serial.println(dialTone);
+}
+
+
+// This function plays the busy signal
+void playBusyTone() 
+{
+    //Set MP3 to continue to play when track is done
+    mp3Serial.write(0xE2);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    if(mp3Serial.read() == 0x00)
+    {
+        mp3Serial.write(0xE2);
+        delay(100);
+        while(mp3Serial.available() == 0){}
+        mp3Serial.read();
+    }  
+
+    //Send command to play busy track
+    mp3Serial.write(busyTone);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    mp3Serial.read();
+    Serial.print("Now playing busy tone track ");
+    Serial.println(busyTone);
+}
+
+
+//play audio clip
+void playAudioClip(int fileNum) 
+{
+    int incomingSerial;
+
+    //Set MP3 to not play on repeat mode
+    mp3Serial.write(0xE2);
+    delay(100);
+    while(mp3Serial.available() == 0){delay(10);}
+
+    incomingSerial = mp3Serial.read();
+    while(incomingSerial != 0x00)
+    {
+        mp3Serial.write(0xE2);
+        delay(100);
+        while(mp3Serial.available() == 0){delay(10);}
+
+        incomingSerial = mp3Serial.read();
+    }  
+    
+    //Send command to play the track
+    mp3Serial.write(fileNum);
+    delay(100);
+    while(mp3Serial.available() == 0){}
+    mp3Serial.read();
+    Serial.print("Now playing track ");
+    Serial.println(fileNum);
+}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.