Final project: WeRest

Made by Xuyang Jin, Wei Liang and Xiaoran Zhang · UNLISTED (SHOWN IN POOLS)

WeRest aims to increase connections for people who are working from home and to remind you to take a break with peers supervised, and further ensure a healthy work pace and life routine. This device used 'close' action as an indicator that the user is taking a rest and the distance to indict short breaks. We design single and paired modes for different scenarios. Finally, the design logic is realized by our code and prototype.

Created: December 19th, 2020

0
0

Intention

Intention:

More people are experiencing work-from-home scenarios and have fewer connections than working in the open-space office or classroom. Long-time sitting and staring at the screen without consciousness causes issues for those who work from home. We are thinking of connected devices called WeRest to remind you to take a break with peers supervised to ensure sufficient relaxation and connections. WeRest will create a virtual study room for you and your peers to spend time working together with a silent ‘school bell’ reminding you to relax together.

Approach: 

We are going to design an ambient device with intuitive glanceability. The device will keep ‘calm’ when the user is working, and when the user needs to have a rest, there will be ambient lights indicating the change of status. Through this approach, the user will not be disturbed by the device when working, and can receive signals when it is time to leave from the screen.

0

Context

1.Herman Miller’s Live OS system and Aeron Chair: Movement sensing and communicates with the desk. This is a precedent that we can reference: for our object, we can use specific types of sensor to detect users' states of working/rest(such as movements or distance to table) and get users connected to each other to keep updated by the status change of each other.(Source: https://www.hermanmiller.com/products/smart-office/live-platform/)

2. Ninja Bottle: Remote Ambient Communication. This precedent is a reference for us to add ambient lights or signals as a way for remote communication. Also from different modes of light we were able to relate different signals to different status/status change. (Source: https://www.tomorrow-lab.com/work/ninjabottle)

3. Empathy Box: Stay real time connection. Through Empathy Box, we are able to relate real-time status connection to a way of users’ specific behaviours: for example close up the laptop/ a book to indicate the change of status. (Source: https://www.sophiabrueckner.com/empathybox.html)

0

Conceptual design:

We would like to use the ’close’ action as an indicator when you are off work and the distance between you and our device as an indicator when you are taking a short break example if you go to the restroom and you keep your laptop open. We aimed to design a small device with distance sensors in the front to test whether you are sitting at the table and working, and a neoPixel ring on the top as an ambient alert. When it blinks, it is a reminder to take a rest. While you are taking a rest, the breathing light will create a peaceful environment for you and you can meditate with it. The loading lights indicate that your peer is waiting for you, you need to take action. There is a force sensitive resistor on the tail to sense the force as you close the laptop lid or your book, which will be the signal of resting. This device is embedded with a 5 voltage battery. It can be portable without a USB needed and can work with you no matter you are working on your laptop or reading books.

0

Storyboard:

The user can either use the device in an individual mode or a paired mode by sending a connecting request to another user.

As you work on your own, the device will turn on to work mode when you open up the lid of your laptop, and switch to break mode when you close the lid. It will remind you by flashing the blue light after 1-hour working.

0

After the blinking blue light reminder, close the lid to accept the rest mode invitation, your peer will receive loading light as mode-switch signal if you are in paired mode. When you both close the laptop lid and relax, the breathing light for rest mode will let you meditate along with. When you go back to work, open up the laptop lid and your peer will receive a mode-switch signal so he can work with you together. You will have a calm device with no lighting signal to distract your attention, while you are working at the same time together.  

0

Process

For the very beginning, we conceptualized our prototype’s real-time interaction based on the same time zone, and we supposed that both users would keep up with the same schedule. But when we began to test the device, we found that scenario is actually very limited - most users want more flexibility of their schedule. So for our iteration we expand the context to users who keep different schedules and are possibly from different time zones because of remote work. Therefore, we are able to develop two modes: individual mode and paired mode to enable the choice of users to join one another or not based on their personal plan/schedule.

During the prototype development process, we were initially going to use the 1 x HC-SR501 unltrasound Sensor to detect users’ movement of sitting or leaving but the sensor is too sensitive to detect the stationary status even though the user stayed sitting in front of the desk. So afterwards we finally decided to use the HC-SR04 Ultrasonic Sonar Distance Sensor to detect the distance between user and desk instead to determine the status of users.

0

Product

Detail what you created. What methods or techniques did you use? What tools and technologies were involved? Include images, code or video.

0

Here is the image of our prototype, component, and how we connect the circuit.

0

Key components per module:

1 x 0.5” Force Sensitive Resistor $6.95

1 x WS2812 5050 RGB LED Neopixel Ring $9.95

1 x HC-SR04 Ultrasonic Sonar Distance Sensors $3.95

1 x Particle Argon Wifi Kit $36.19

The total cost of electronic components is less than $60. It is a cost-effective device compared to the products listed above on the current market.

The circuit diagram is listed below. The HC-SR04 will need an external 5V power source to function normally. The FSR sensor will need to connect with a 10k resistor in series.

0
// This #include statement was automatically added by the Particle IDE.
#include <neopixel.h>

// IMPORTANT: Set pixel COUNT, PIN and TYPE
#define PIXEL_PIN D4
#define PIXEL_COUNT 16
#define PIXEL_TYPE WS2812


/**************************************************************/
/********************   Initialization     ********************/ 
/**************************************************************/

/*
	Ultrasonic Sensor Pins:
	VCC: 5V 
	Trig : Trigger (INPUT) - Digital Pin 2
	Echo: Echo (OUTPUT) - Digital Pin 3
	GND: Ground
*/

Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

int trigPin = D2;    // Trigger Pin
int echoPin = D3;    // Echo Pin

long duration, cm, inches;

/*
	Pull-down Resistor
	VCC: 3.3V
	Analog Pin: A3
	GND: Ground
	Remember to add a 10K Ohm pull-down resistor too.
*/

int fsrPin = A3;

// Create a variable to hold the FSR reading
int fsrReading = 0;

/*
	Neopixel: WS2812
	VCC: 3.3V
*/

// color codes
uint32_t red = strip.Color(255, 0, 0);
uint32_t blue = strip.Color(0, 0, 255);
uint32_t green = strip.Color(0, 255, 0);
uint32_t yellow = strip.Color(255, 255, 0);
uint32_t white = strip.Color(255, 255, 255);
uint32_t pink = strip.Color(255, 192, 203);


// other neopixel variables
int MinBrightness = 10;       //value 0-255
int MaxBrightness = 100;      //value 0-255

int numLoops1 = 10;
int numLoops2 = 5;            //add new integer and value for more color's loop if needed.

int fadeInWait = 30;          //lighting up speed, steps.
int fadeOutWait = 30;         //dimming speed, steps.

// other variables: timers and status
String currStatus = "work";
int workTimer = 0;
int restTimer = 0;
int breakTimer = 0;

/**************************************************************/
/*************************   Setup    *************************/ 
/**************************************************************/

void setup() 
{
    //Suscription of announcement of another device
    Particle.subscribe(  "hammered/backtowork" , handleBacktoWork );
    Particle.subscribe(  "hammered/break" , handleBreak );
    Particle.subscribe(  "hammered/rest" , handleRest );
	//Define inputs and outputs
	pinMode(trigPin, OUTPUT);
	pinMode(echoPin, INPUT);
	
	//initialization of neopixel
	strip.begin();
    strip.show(); // Initialize all pixels to 'off'
}

/**************************************************************/
/**********************     main loop    **********************/ 
/**************************************************************/

void loop() 
{
    // due to instability of HC-SR04 we use a loop of 10 time detections
    // if there are 2 times detected long distance (no person at the desk)
    // then it is break or rest status
    int counter = 0;
    for(int i = 0; i <= 10; i++) {
        // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
	    // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
	    digitalWrite(trigPin, LOW);
	    delayMicroseconds(5);
	    digitalWrite(trigPin, HIGH);
	    delayMicroseconds(10);
	    digitalWrite(trigPin, LOW);

	    // Read the signal from the sensor: a HIGH pulse whose
	    // duration is the time (in microseconds) from the sending
	    // of the ping to the reception of its echo off of an object.
	    pinMode(echoPin, INPUT);
	    duration = pulseIn(echoPin, HIGH);

	    // Convert the time into a distance
	    cm = (duration/2) / 29.1;     // Divide by 29.1 or multiply by 0.0343
	    inches = (duration/2) / 74;   // Divide by 74 or multiply by 0.0135
	    Particle.publish("inches", String(inches)); // This will publish the distance that the Ultrasonic Sensor reads every second
	    delay(1000);
	    if (inches >= 50) {
	        counter ++;
	    }
    }
    
    // Use analogRead to read the FSR reading
    // This gives us a value from 0 to 4095
    fsrReading = analogRead(fsrPin);
    
	if (counter >= 2) {
	    if (fsrReading <= 1500) {
	        currStatus = "break";
	        annouceBreak();
	        workTimer = 0;
	        breakTimer ++;
	        rgbBreathe(blue, 3, 20); // breathing light blue for break
	    } else {
	        currStatus == "rest";
	        annouceRest();
	        workTimer = 0;
	        breakTimer = 0;
	        restTimer ++;
	        rgbBreathe(green, 3, 20); // breathing light green for rest
	    }
	} else {
	    currStatus = "work";
	    colorAll(0, 5000);
	    //annouceWork();
	    if (restTimer >= 2) {
	        currStatus = "backtowork";
	        annouceBacktoWork();
	    }
	    restTimer = 0;
	    breakTimer = 0;
	    workTimer ++;
	    
	}
	// red solid light to show you have worked long enough
	if (workTimer >= 4) {
	    colorAll(red, 5000);
	}
	// green solid light to show you have rested long enough
	if (restTimer >= 2) {
	    colorAll(green, 5000);
	}
	// green solid light to show you have broke long enough
	if (breakTimer >= 2) {
	    colorAll(blue, 5000);
	}
}

/**************************************************************/
/**********************   Publishing     **********************/ 
/**************************************************************/


// publish functions
void annouceBacktoWork() {
    Particle.publish( "agreeable/backtowork" );
}

void annouceBreak() {
    Particle.publish( "agreeable/break" );
}

void annouceRest() {
    Particle.publish( "agreeable/rest" );
}


// handlers

// when I'm working long enough but the other one started rest
// wipe pink
void handleRest(const char *event, const char *data) {
    if (currStatus == "work" && workTimer >=4) {
        colorWipe(pink, 500);
    }
}

// when I'm working long enough but the other one started break
// wipe pink
void handleBreak(const char *event, const char *data) {
    if (currStatus == "work" && workTimer >=4) {
        colorWipe(pink, 500);
    }
}

// when I'm in rest or break but the other one started working again
// wipe yellow
void handleBacktoWork(const char *event, const char *data) {
    if (currStatus == "rest" || currStatus == "break") {
        colorWipe(yellow, 500);
    }
}


/**************************************************************/
/***********************     Functions     ********************/ 
/**************************************************************/

// Neopixel functions
// Set all pixels in the strip to a solid color, then wait (ms)
void colorAll(uint32_t c, uint8_t wait) {
    uint16_t i;

    for(i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, c);
    }
    strip.show();
    delay(wait);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

// breathing
void rgbBreathe(uint32_t c, uint8_t x, uint8_t y) {
  for (int j = 0; j < x; j++) {
    for (uint8_t b = MinBrightness; b < MaxBrightness; b++) {
      strip.setBrightness(b * 255 / 255);
      for (uint16_t i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, c);
      }
      strip.show();
      delay(fadeInWait);
    }
    strip.setBrightness(MaxBrightness * 255 / 255);
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(y);
    }
    for (uint8_t b = MaxBrightness; b > MinBrightness; b--) {
      strip.setBrightness(b * 255 / 255);
      for (uint16_t i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, c);
      }
      strip.show();
      delay(fadeOutWait);
    }
  }
}
Click to Expand
0


0
close action as an indicator of taking a rest
金徐杨 - https://youtu.be/IIZ_FgaLIEY
0
paired mode
金徐杨 - https://youtu.be/29I0uX_aYDo
0

Reflection

By increasing the connection between you and your peers, we would like to add more interesting interactions. For example, such as a push button to actively remind your peers on their device to rest or work with you. Or to light up your peer’s pixels to share emotions.

Another thing is that we really hope to wrap everything up in a small device to be portable.

x
Share this Project

This project is only listed in this pool. Be considerate and think twice before sharing.


Courses

About

WeRest aims to increase connections for people who are working from home and to remind you to take a break with peers supervised, and further ensure a healthy work pace and life routine. This device used 'close' action as an indicator that the user is taking a rest and the distance to indict short breaks. We design single and paired modes for different scenarios. Finally, the design logic is realized by our code and prototype.