Applause Alarm Clock
Using lights, a proximity diffuse, and canned applause, this alarm clock is a stubbornly encouraging way to wake up.
Process
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; } }