Introduction: Shake & Wake

A lot of couples encounter this problem, they have to wake up at a different time. With a normal alarm clock they both wake up when the alarm goes of. Shake & Wake is the solution for this problem. Using a wireless RF signal the clock sends a signal to the pillow. In the pillow there is a little vibrating motor that wakes you, and only you.

Concept video

Step 1: What Do We Need

Components:

-A alarm clock (doesn't have to work it's only for the casing)

-2 arduinos

-a potentiometer

-an RTC module

-a switch

-an LCD screen

-2 resistors

-an RF sender and receiver

-a vibration motor

-a thyristor

-a lot of wire

-solder

Tools:

-soldering iron

-pliers

Step 2: Soldering

Solder everything in place like in the scheme. Make sure everything fits inside the alarm clock casing.

Step 3: Coding

First you have to upload the time to the RTC (alarm clock arduino):

#include
"Wire.h"

#define DS1307_I2C_ADDRESS 0x68

byte decToBcd(byte val)

{

return ( (val/10*16) + (val%10) );

}

void setDateDs1307(

byte second, // 0-59

byte minute, // 0-59

byte hour, // 1-23

byte dayOfWeek, // 1-7 1=Mon, 7=Sun

byte dayOfMonth, // 1-28/29/30/31

byte month, // 1-12

byte year // 0-99

)

{

Wire.beginTransmission(DS1307_I2C_ADDRESS);

Wire.write(0);

Wire.write(decToBcd(second));

Wire.write(decToBcd(minute));

Wire.write(decToBcd(hour));

Wire.write(decToBcd(dayOfWeek));

Wire.write(decToBcd(dayOfMonth));

Wire.write(decToBcd(month));

Wire.write(decToBcd(year));

Wire.endTransmission();

}

void setup()

{

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

Wire.begin();

pinMode(13, OUTPUT);

// Change these values to what you want to set your clock to.

// It is best to add 30 seconds to a minute to allow time for your computer to compile and upload the current time.

// Only run this script once, as running it again will overwrite the time set in the RTC chip!

// Hours are in 24 hour format

// Day of week starts with Monday = 1 up to Sunday = 7

// Year is in YY format, so only use the last 2 digits of the year

//

// Once you have run the program, the LED on pin 13 will flash to say it has finished, DO NOT UNPLUG OR RESET.

// Simply follow the tutorial and upload the LCD code to avoid overwriting the correct time with this time again.

//

second = 0;

minute = 13;

hour = 15;

dayOfWeek = 1;

dayOfMonth = 11;

month = 1;

year = 16;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

//*/

}

void loop()

{

digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)

delay(1000); // wait for a second

digitalWrite(13, LOW); // turn the LED off by making the voltage LOW

delay(1000);

}

Then you have to upload the time you want to wake up (alarm clock arduino):

#include "Wire.h"

#include

#include

#define DS1307_I2C_ADDRESS 0x68

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte bcdToDec(byte val)

{

return ( (val/16*10) + (val%16) );

}

void getDateDs1307(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year)

{

Wire.beginTransmission(DS1307_I2C_ADDRESS);

Wire.write(0);

Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

*second = bcdToDec(Wire.read() & 0x7f);

*minute = bcdToDec(Wire.read());

*hour = bcdToDec(Wire.read() & 0x3f);

*dayOfWeek = bcdToDec(Wire.read());

*dayOfMonth = bcdToDec(Wire.read());

*month = bcdToDec(Wire.read());

*year = bcdToDec(Wire.read());

}

void setup()

{

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

Wire.begin();

// AMEND IF YOUR USING A DIFFERENT LCD SCREEN //

lcd.begin(16, 2);

pinMode(7, OUTPUT);

}

void loop()

{

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

String s, m, d, mth, h;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

if (second < 10) { s = "0" + String(second); } else { s = String(second); }

if (minute < 10) { m = "0" + String(minute); } else { m = String(minute); }

h = String(hour);

if (dayOfMonth < 10) { d = "0" + String(dayOfMonth); } else { d = String(dayOfMonth); }

if (month < 10) { mth = "0" + String(month); } else { mth = String(month); }

char* days[] = { "NA", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };

lcd.clear();

// JUMP TO CENTER ON A 16X2 SCREEN //

lcd.setCursor(4,0);

// CHANGE THE FOLLOWING TO SET THE DATE IN TO YOUR PREFERED ORDER //

lcd.print(h + ":" + m + ":" + s);

// NEXT LINE, 1 SPACE IN FROM THE LEFT //

lcd.setCursor(1,1);

// PREFIX THE 20 AS THE RTC CHIP ONLY USES 2 DIGITS FOR THE YEAR //

lcd.print(String(days[dayOfWeek]) + " " + d + "/" + mth + "/20" + year);

delay(1000); // Wait 1 second

if (hour == 15 && minute == 18) digitalWrite(7, HIGH);

if (minute != 18) digitalWrite(7, LOW);

}

The last step is to upload the code to the receiver (pilow arduino):

#define rfReceivePin A0 //RF Receiver pin = Analog pin 0

#define ledPin 13 //Onboard LED = digital pin 13

unsigned int data = 0; // variable used to store received data

const unsigned int upperThreshold = 70; //upper threshold value

const unsigned int lowerThreshold = 50; //lower threshold value

void setup(){

pinMode(ledPin, OUTPUT);

Serial.begin(9600);

}

void loop(){

data=analogRead(rfReceivePin); //listen for data on Analog pin 0

if(data>upperThreshold){

digitalWrite(ledPin, LOW); //If a LOW signal is received, turn LED OFF

Serial.println(data);

}

if(data

digitalWrite(ledPin, HIGH); //If a HIGH signal is received, turn LED ON

Serial.println(data);

}

}

Step 4: Install the Alarm Clock

If everything is working you can place the alarm clock next to your bed, make sure everything stays charged. You could also make a charging station with magnetic contacts.

Home Hacks Challenge

Participated in the
Home Hacks Challenge