Introduction: Bed Wetter

About: I make things sometimes

As the school year goes on and I have to keep getting up early, I find myself accidentally falling asleep after turning off my alarm more and more. To solve this, I created a device that will dump water on me if I'm not out of bed 5 minutes after my alarm goes off.

Supplies

Required:

  • Any Arduino microcontroller (I used a Particle Argon)
  • A servo
  • A motion sensor
  • x Jumper wires
  • Some material to build the structure (cardboard, wood, etc.)
  • Water bottle (that you will cut a hole into)
  • Button
  • 220 ohm resistor (or similar)

Step 1: Set Up the Microcontroller

Attach the 3.3V pin to the positive rail, and the ground pin to the ground rail

Step 2: Set Up the Button

Attach the button to the D6 pin and ground

Step 3: Set Up the Servo

Attach the ground to the ground rail, the positive to the 5V a.k.a VUSB pin, and the input to A5

Step 4: Set Up the Motion Sensor

Attach the positive to the 3.3V positive rail, ground to the ground rail, and input to D5

Step 5: Configure and Flash the Code

Flash the following code to your Argon and adjust the config variables accordingly:

int servoPin = A5;
int motionSensor = D5;
int button = D6;

// Config variables. only touch these!!! don't touch anything else
// -------------------------------------------------------------

// UTC time zone
int alarmHour = 17;
int alarmMinute = 45;

// in seconds
int delayBeforeSpray = 10;

// ------------------------------------------------------------

bool servoStarted = false;
bool disarmed = false;

int servoMin = 10;
int servoMax = 170;

Servo servo;

int alarmUnixTimestamp = 0;

int disarmTime = 0;

void setup() {
    recalculateAlarm();
    Serial.begin(9600);
    servo.attach(servoPin);
    pinMode(button, INPUT_PULLUP);
    pinMode(motionSensor, INPUT);
    Serial.println(alarmUnixTimestamp);
}

void recalculateAlarm() {
    alarmUnixTimestamp = Time.now() + ((alarmHour - Time.hour()) * 60 * 60) + ((alarmMinute - Time.minute()) * 60) - Time.second();
    Serial.println("Alarm set to " + Time.format(alarmUnixTimestamp, TIME_FORMAT_DEFAULT));
}

void disarm() {
    disarmed = true;
    disarmTime = Time.now();
}

void rearm() {
    disarmed = false;
}

void open() {
    servo.write(servoMax);
}

void close() {
    servo.write(servoMin);
}

void loop() {
    if (Time.now() >= alarmUnixTimestamp + delayBeforeSpray && !disarmed) {
        servoStarted = true;
        Serial.println("sprayed");
    }

    int buttonStatus = digitalRead(button);
    if (buttonStatus == LOW && servoStarted && !disarmed) {
        disarm();
        servoStarted = false;
        Serial.println("disarmed (button)");
    }

    int motionStatus = digitalRead(motionSensor);
    if (motionStatus == HIGH && !servoStarted && !disarmed) {
        disarm();
        Serial.println("disarmed (motion sensor)");
    }
    
    if (Time.now() >= disarmTime + 30 && disarmed) {
        rearm();
        alarmMinute += 1;
        recalculateAlarm();
        Serial.println("rearmed");
    }
}

Step 6: Attach a Cap to the Servo

Cut out a surface the size of a water bottle cap and attach it to the servo. The surface can be a material of your choice

Step 7: Attach to a Bottle

Attach your motor and a bottle without a cap to a tall surface so that the surface you cut earlier acts as a cap

Step 8: Build the Ramp

Attach a ramp that the water will fall onto

Step 9: Finish the Structure

Add walls to help support the structure. Make sure to cut holes in so that the microcontroller can get power and the motion sensor can see.