Applause Alarm Clock

Using lights, a proximity diffuse, and canned applause, this alarm clock is a stubbornly encouraging way to wake up.

coming in at about 16″ x 6″ x 5.5″, this bad boy has presence and a punch

the top of the box opens for access to the internal electrical components. A gap is left along its hinge, leaving room for wires to power sources and the external motion sensor.

theres something very Ark of the Covenant about servicing this device through its top hatch

Process

I spent a bit of time fitting the piece of acrylic into a wooden “U” shape. In the beginning of this project, I wanted to be able to switch out what the message displayed would be. This fitting process to a long time, and ultimately I had to cut that idea short and commit to figuring out the “APPLAUSE” text the best way I could.

In my first attempt at creating the text, I handdrew the lettering on a piece of fitted tracing paper. However, I wasn’t happy with how the light revealed all of the pen strokes. Knowing that a most onlooker attention would be drawn to the letters, I discarded this draft.

After sleeping on it, I dug around the things I had accumulated during college and was reminded of an old Christmas gift my sister gave me. Pulling letters from a novelty marquee, I couldn’t believe I hadn’t thought of this sooner.

Discussion

I think in my own reflection, I have mixed feelings about how this project turned out. I definitely experienced the warning around budgeting time for nonlinear progress in the project. By the time I thought I would be halfway done, it became evident that I had 80% more to go. Still, I impressed myself that I was able to make a project that was this functional, as I’ve struggled in the past with projects that had less components. Still, my ideal vision for this project would probably require one or two more work sessions to polish the form for a full mount to the ceiling. Additionally, I would want to spend some more time creating acrylic slides.

I do like the rough quality to my current iteration. I had one of my favorite artists, Tom Sachs, in mind as I was working. Sachs’ process is transparent, in that materiality isn’t hidden and pencil marks aren’t erased. A challenge I gave myself was to grab all of the materials I was using from what was left behind by past tenants in my apartment. This limitation yielded interesting final aesthetic, with old layers of paint on my wood collaged back into a new life.

Reading other’s feedback was great. I especially liked the suggestion that “having an internal timer where the applause turns into booing if you don’t get up after a certain amount of time could be funny.” Such a missed initial opportunity! If I revisit this project, I will definitely find a way to map the time to a shift from applause to booing. It’s interesting to see some of my initial reflection surface in others’ suggestions as well. Someone wrote “I loved the end result/aesthetic of the product! Simple yet with a great concept. It would be cool if people could customize sounds + text later on if the idea is built.” I am ecstatic that the simple and honest aesthetic vision came through to others. That was an element I was getting a lot of pushback on from my peers in design. It wasn’t the kind of project intended to fall neatly into functional nor novelty.  The suggestion to customize sounds is also a great blindspot to recognize. I remember when presenting live someone suggested incorporating an LED screen to adjust the wakeup time. I think this would be a great place to scroll through sounds to vary morning to morning. I am curious what alternatives there are to uploading custom sounds via SD card. 

Schematic

Code

/*
 * Applause Alarm Clock
 * Connor McGaffin (cmcgaffi)
 * 
 * Description: The code below controls an alarm clock in the form of an live-show applause sign. 
 * At a designated time, a real time clock module triggers two LED panels to illuminate frosted acrylic with 
 * "APPLAUSE" written across it in black. This is accompanied by a looping canned track of studio
 * audience applause, which can be turned off in tandem with the lights by input on a motion sensor intended 
 * to be installed outside of one's bedroom. 
 * 
 * Pin mapping:
 * 
 * pin   | mode   | description
 * ------|--------|------------
 * 7      input     pir pin  
 * 8      output    led panel
 * 9      output    led panel
 * 10     output    dfplayer tx
 * 11     input     dfplayer rx
 * SCL    output    rtc serial clock
 * SDA    input     rtc serial data
 * 
 * CREDIT: i couldn't have done this without
 * DFRobotDFPlayerMini Library - written by Angelo quiao
 * https://github.com/DFRobot/DFRobotDFPlayerMini
 * DS3231 Library - written by A. Wickert, E. Ayars, J. C. Wippler
 * https://github.com/NorthernWidget/DS3231
 * 
 */

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <DS3231.h>
#include <Wire.h>

DS3231 rtc(SDA, SCL);
Time t;

int Hor;
int Min;
int Sec;

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

const int LEDPIN1 = 9;
const int LEDPIN2 = 8;
const int PIRPIN = 7;
int val = 0;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);  
  Serial.println();
  pinMode(LEDPIN1, OUTPUT);
  pinMode(LEDPIN2, OUTPUT);
  pinMode(PIRPIN, INPUT);
  Wire.begin();
  rtc.begin ();
  rtc.setTime(00,00,0); //set time
  if (!myDFPlayer.begin(mySoftwareSerial)) {      // use softwareSerial to communicate with mp3.
    while(true);
  }
  myDFPlayer.volume(20);                          // volume set out of 30
}

void loop()
{
  t = rtc.getTime();
  Hor = t.hour;
  Min = t.min;
  Sec = t.sec;
  val = digitalRead(PIRPIN);                       // read sensor input 
  
  if( Hor == 8 &&  (Min == 30 || Min == 31)){      // if the current time matches the alarm time 
     if (val == LOW) {                             //if sensor input is LOW
        static unsigned long timer = millis();
        if (millis() - timer > 25000) {
          timer = millis();
          myDFPlayer.play(1);                      // Play the first mp3 again every 25 seconds (length of file)   
          }
        digitalWrite(LEDPIN1, HIGH);               // LED is on   
        digitalWrite(LEDPIN2, HIGH);
      } else {                                     // if sensor input is HIGH
        digitalWrite(LEDPIN1, LOW);                // LED turns off
        digitalWrite(LEDPIN2, LOW);                      
        myDFPlayer.stop();                         // stops playing applause
        delay(60000);                              // runs out clock on rest of alarmed minute
    }    
  }
}

// vvv MP3 PLAYER SERIAL STATUS CODE vvv //

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }

}