Introduction: Shake & Wake

Picture of 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

Picture of 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

Picture of 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.

Comments

About This Instructable

505views

11favorites

License:

More by arno.demeulenaere.54: Possibilities of Soldering for PrototypingSeed CardsToy Box Transformation
Add instructable to: