Introduction: Resit- Can It Make You Move?

Our idea consists of an artefact that will encourage users to move every 30 minutes. According to scientists, sitting for several hours in a row has a damaging effect to our health and overall body structure. Long hours of sitting at home or in the office can lead to shoulder aches, increase the risk of heart diseases and result in high bloodpressure. Adding exercise to our busy everyday lives can decrease our health issues. However, this does not necessarily mean that you must spend hours in the gym or take a jog in the park, even small movements can make a difference. Just reaching out for something, light stretching every now and then, or getting up and do a certain task, can make a difference. The purpose of our project is therefore to add small movements during the sitting hours, without the need for the user to actively think about moving, the artefact will do the job.

Step 1: Materials/Tools Used for the Artefacts

Below is a list of tools/materials used in order to build the artefacts

  • Arduino Uno microcontroller x 2
  • electric wires
  • Headers (female and male)
  • Breadboards
  • Resistors
  • Memory foam
  • Soft/Fluffy material (Polyester)
  • Fabric (blue and yellow)
  • Vibrator sensor (Adafruit)
  • iPhone vibrator
  • Conductive threads and fabric
  • Plywood
  • Translucent material
  • Laser cutter
  • Soldering iron
  • Pliers
  • Clippers
  • LED lights (blue and yellow)
  • Bluetooth modules
  • USB cables
  • Sewing thread and needle
  • Glue
  • Tape
  • Sand paper
  • Blades/Cutters
  • LIPO batteries
  • Push button switch (Arduino)

Step 2: Previous Functionality

Original functionality

The artefact (fluffy ubiquitous button) has two LED lamps that will light up and vibrate every 30 minutes, during the sitting hours of the user. It will be connected to two charging stations that are separately connected to power otlets. Its intended environment is at home where the artefact is placed at a distance from the user. To make sure the artefact is working all the time, it comes with a Lipo battery. When the artefact starts to vibrate and light up the user will have to get up and press the artefact down. If it lights yellow the user will have to bring the artefact to the yellow station and the same process goes for the blue light.

The artefact also comes with extra features such as flickering and pulsating lighting. If e.g. the user does not get up to move the artefact at once the yellow/blue light will start flickering and after a few seconds it will even start to vibrate to draw attention.

An extra function is that it can vibrate when a user press the fluffy button down. This increases the emotional attachment to the artefact, as it can remind you of a pet or a teddy bear. Moreover, the user can press the button comfortably and without much effort as it is covered with soft/fluffy material and at the same time sensitive to pressure.

Step 3: Final Functionality

The artefact will instead be connected to an interactive cushion (see step 8). This is an alternative to the two charging stations as it does not leave the user to choose not to get up. The stations and distances are decided from the start. The interactive cushion should be placed on a chair where a user sits during long hours of work and the artefact (fluffy ubiquitous button) will be placed on a shelf. In our original idea the artefact could be placed at a chosen distance from the user and be replaced every 30 minutes between the two stations. Now, instead the artefact is placed at a distance higher up on a shelf. Whenever the interactive cushion senses that a person has been sitting for 30 minutes it will start vibrating to make the user get up and move. At the same time the artefact will light up and also vibrate to draw attention to the user. This way the user will have to get up and press the fluffy button down to stop the flickering and vibration on both the cushion and the artefact. When the light and vibration stops the user can go back and sit. The timer will restart whenever the user sits on it.

Step 4: The Wireless Connection

Original connection

The wireless connection consists of a bluetooth module attached to each charging station together with a rechargable LIPO battery so the artefact is charged all the time. The charging stations are made so they can sense when a person comes towards them with the wooden box (also containing a battery and a bluetooth module). Furthermore, the LED lights (blue and yellow) will start pulsating but when the box is placed onto a station it will pulsate with less light, indicating that is placed on the station.

Changes

The artefact (fluffy ubiquitous button) will instead be connected to an interactive cushion using bluetooth modules. Wires, microcontroller adapter and one bluetooth module are attached to one breadboard connected to the cushion. Another breadboard with wires and blueteooth module are connected to function with the fluffy ubiquitous button. The communication and interaction is through bluetooth between the two artefacts. The interactive cushion will vibrate every 30 minutes via a program code written in Arduino IDE and at the same time the artefact will start to flicker and vibrate (the same as before).

Regarding the LEDs, instead of two different LEDs (blue and yellow) the artefact lights up with two blue LEDs. This change was made due to the fact that since we no longer have two different stations, having two different lights would not make any sense. We now have only one station for the fluffy ubiquitous button that is placed on a shelf. Although it will have the same pulsating feature as well, when it does not vibrate or flicker it will pulsate very slowly. It will also pulsate whenever it stays on the shelf and does not do anything and when the user press it to stop the flickering and vibration. When a person gets up the cushion senses it and the timer restarts. The resit will send flickering light for like a second to indicate that the timer has restarted.

The switch we made is used to restart the whole interaction by just pressing the button if it does not start automatically.

Step 5: Building the Artefacts

The fluffy ubiquitous button with wooden box

As a start we took some memory foam and cut it into a rounded shape. Then a vibration sensor was attached with glue and tape at the bottom of the shape, along with conductive threads and small pieces of conductive fabric. In order to make the interaction with the artefact comfortable we coated it with some soft/fluffy material on top. The soft material was sewed by hand (using thread and needle). This resulted in a fluffy ubiquitous button which was then placed and attached on a squareshaped box of wood. To make it stable we attached rectangular pieces of wood inside the box with paper glue so it would stay in place.

The wooden box was made using a laser cutter. Size and measurement for the box was done together with illustrator. After the box was created and puzzled together we added transluscent material. We also added a small rectangular shape attached on one side of the wooden box. Then we cut two holes on this transluscent piece to fit and attach the two LED lamps (blue and yellow). The purpose of the box was to place the arduino Uno microcontroller inside it, together with the breadboard, soldered wires and resistors. To make the vibration work we had to solder the board with all the wires using the provided circuit digram. The same was done for the LED board. A cut into one of the sides of the box was created as well so the arduino Uno could be connected to a USB cable. We also had to glue the arduino uno into the wooden box so it would stay in place and not move when going with it from one station to the other.

Step 6: Changes Made During the Building Process

We first had a wooden box with transparent patterns but it was not so robust and would easily break if pressure was added so this was changed to a wooden box without patterns. We also attached several pieces of translucent material around the box as we thought the light from the LEDs would be more visible. This was not sufficient so then we let the LEDs stick out as two eyes on one of the transluscent pieces. They had to stick out in order for the lights to be visible when attached to the artefact. This was because the light from the LED lamps were not so intense as a start. Later, we found out that we could just increase the resistances (to 1 kohm) for the different LEDs to increase the lighting. For this, we had to first resolder the LEDs on a board in order to have the right resistances for a higher light intensity. Since the LEDs were sticking out too much we had to make sure to cover them with the translucent material at the top as it would look better and also be more aesthetically appealing. This also does not draw attention from the real artefact. We want people to focus on the artefact not only the LEDs. We also created a switch for the RESIT, which can easily be used to restart the whole process.

Step 7: Charging Stations (replaced by the Interactive Cushion)

The two charging stations were made using hard wood that were cut into square flat pieces. A total of four pieces were cut. Two pairs of pieces were attached onto each other with gun glue. These stations were coated with some soft fabric indicating the colour (blue and yellow) of each station. We also expanded the charging station plates with som extra board of wood to fit the LIPO battery, bluetooth module and USB cable in place. In order for the whole system to work we wrote a program code using the Arduino IDE.

Step 8: Interactive Cushion With Pillow Case (Alternative to the Two Charging Stations)

The interactive cushion with pillow case was made using the same technique as for the fluffy button. The interaction is through vibration. This cushion senses whenever the person sits on it and vibrates every 30 minutes to make sure the user sees it and to make the user stand up. To draw even more attention it will light up and vibrate. The timer restarts whenever a person sits back on the chair.

Firstly, a random size of the memory foam was cut in a rectangular shape to fit the chair where a user sits. The conductive fabric, threads and the vibrator were attached and coated with yellow fabric (as a shield). The vibrator was retrieved taking apart an iPhone. As a final touch it was coated with fluffy grey material to cover it and protect it and also make it comfortable for the user to sit on. This is connected to the artefact via bluetooth, arduino microcontroller and a timer coded in Arduino IDE.

We attached a pocket (made of the same fabric as the cushion) next to the pillowcase where we could fit the bluetooth module and breadboard with wires inside it, to make it look more aesthetically appealing.

Step 9: Setting Up the Code

Before the cushion and Resit code is added, first load the Bluesmirf passthrough (see step 10)onto the RESIT arduino and do the following:

1) Enter COMMAND MODE by typing $$$ in the Serial Monitor with 'No line ending' selected

2) Set line ending to 'Newline' and type D,

3) Type SM,3 to set the Bluetooth module in auto-connect mode

4) Type SA,0 to set no security on the Bluetooth module

5) After making sure that the cushion bluetooth is powered on, Type in 'I,10' to scan for available bluetooth devices

6) When the cushion bluetooth device is found in scan, Type in 'C,' to connect to it.

Now load the BlueSmirf code onto the cushion arudino connected to the bluetooth module and do the following:

1) Enter COMMAND MODE by typing $$$ in the Serial Monitor with 'No line ending' selected

2) Set line ending to 'Newline' and type D,

3) Type SM,0 to set the Bluetooth module in slave mode

4) Type SA,0 to set no security on the Bluetooth module

5) Now power on the cushion first and then power on the RESIT and wait for the bluetooth modules to connect.

Step 10: Bluesmirf Passthrough Code

/*
  Example Bluetooth Serial Passthrough Sketch
 by: Jim Lindblom
 SparkFun Electronics
 date: February 26, 2013
 license: Public domain
 
 This example sketch converts an RN-42 bluetooth module to
 communicate at 9600 bps (from 115200), and passes any serial
 data between Serial Monitor and bluetooth module.
 */
#include   
int bluetoothTx = 2;  // TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3;  // RX-I pin of bluetooth mate, Arduino D3
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
void setup()
{
  Serial.begin(9600);  // Begin the serial monitor at 9600bps
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$");  // Enter command mode
  delay(100);  // Short delay, wait for the Mate to send back CMD
  bluetooth.println("U,9600,N");  // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetooth.begin(9600);  // Start bluetooth serial at 9600
}
lt;pre> bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps bluetooth.print("$"); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetooth.begin(9600); // Start bluetooth serial at 9600 }

quot;); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetooth.begin(9600); // Start bluetooth serial at 9600 }

void loop()
{
  if(bluetooth.available())  // If the bluetooth sent any characters
  {
    // Send any characters the bluetooth prints to the serial monitor
    Serial.print((char)bluetooth.read());  
  }
  if(Serial.available())  // If stuff was typed in the serial monitor
  {
    // Send any characters the Serial monitor prints to the bluetooth
    bluetooth.print((char)Serial.read());
  }
  // and loop forever and ever!
}

Step 11: Program Code for the RESIT

#include 
#define SIT_THRESHOLD 30
#define STAND_RESET_THRESHOLD 4
const int vibratorModule = 12;
const int switchModule  = 6;
const int LED1 = 3;
const int LED2 = 5;
const int bluetoothTx = 2;  // TX-O pin of bluetooth mate, Arduino D2
const int bluetoothRx = 4;  // RX-I pin of bluetooth mate, Arduino D4
char cushionStatus = 0;
int switchStatus = LOW;
int sitCounter = 0;
int standCounter = 0;
bool shouldAlertUser = false;
bool didUserPressSwitch = false;
// Constants
const int fadeTime      = 15;         // Adjust value to speed up or slow down fade
const int brightnessThreshold         = 180;  // Adjust value to determine how much the LEDs should brighten
const int noOfTimesToFlash = 3;      // Adjust to increase / decrease how many times the LED should flash
bool fadeup = true;
bool isSitting = false;
unsigned long lastFadeTime = 0;        // will store last time LED was updated
int ledWhiteValue = 0;
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);
void setup()
{
  pinMode(vibratorModule, OUTPUT);
  pinMode(switchModule, INPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  Serial.begin(9600);  // Begin the serial monitor at 9600bps
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$
  bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$");  // Enter command mode
  delay(100);  // Short delay, wait for the Mate to send back CMD
  bluetooth.println("U,9600,N");  // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetooth.begin(9600);  // Start bluetooth serial at 9600
  ledFlashDual();
}
lt;pre> bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps bluetooth.print("$"); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetooth.begin(9600); // Start bluetooth serial at 9600 ledFlashDual(); }

quot;); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetooth.begin(9600); // Start bluetooth serial at 9600 ledFlashDual(); }

void loop()
{
  switchStatus = digitalRead(switchModule);
  alertUser();
  if (isSitting) {
    ledFade();
  }
  if (switchStatus == HIGH) {
    didUserPressSwitch = true;
    sitCounter = 0;
    ledWhiteValue = 1;
    bluetooth.println(switchStatus);
  }
  if (bluetooth.available()) {
    //    Serial.print((char)bluetooth.read());
    cushionStatus = (char)bluetooth.read();
    switch (cushionStatus) {
      case '0': {
          Serial.println("Standing");
          standCounter++;
          isSitting = false;
          ledMinimum();
          if (standCounter > STAND_RESET_THRESHOLD && sitCounter != 0) {
            sitCounter = 0;
            Serial.println("Sit Counter Reset");
            ledFlashDual();
            ledWhiteValue = 1;
          }
        }
        break;
      case '1': {
          Serial.println("Sitting");
          sitCounter++;
          isSitting = true;
          if (standCounter > 0) {
            standCounter = 0;
            Serial.println("Stand Counter set to Zero");
          }
          if (sitCounter > SIT_THRESHOLD) {
            shouldAlertUser = true;
            didUserPressSwitch = false;
            Serial.println("Come Press ME");
          }
        }
        break;
      default:
        break;
    }
  }
  if (Serial.available()) {
    bluetooth.print((char)Serial.read());
  }
  delay(10);
}
void alertUser() {
  if (shouldAlertUser && !didUserPressSwitch) {
    digitalWrite(vibratorModule, HIGH);
    ledFlashDual();
  }
  else if (didUserPressSwitch) {
    digitalWrite(vibratorModule, LOW);
  }
}
void ledFade() {
  if ((millis() - lastFadeTime) > fadeTime) {
    if (fadeup) {
      analogWrite(LED1, ledWhiteValue);
      analogWrite(LED2, ledWhiteValue);
      if (ledWhiteValue >= brightnessThreshold) {
        ledWhiteValue = brightnessThreshold;
        fadeup = false;
      }
      ledWhiteValue++;
    }
    else {
      analogWrite(LED1, ledWhiteValue);
      analogWrite(LED2, ledWhiteValue);
      if (ledWhiteValue <= 1) {
        ledWhiteValue = 1;
        analogWrite(LED1, 0);
        analogWrite(LED2, 0);
        fadeup = true;
      }
      ledWhiteValue--;
    }
    lastFadeTime = millis();
  }
}
void ledFlashDual()
{
  analogWrite(LED1, 250);
  analogWrite(LED2, 250);
  delay(50);
  analogWrite(LED1, 0);
  analogWrite(LED2, 0);
  delay(50);
}
void ledMinimum() {
  analogWrite(LED1, 1);
  analogWrite(LED2, 1);
}

Step 12: Program Code for the Cushion

#include <softwareserial.h style="background-color: initial;">  </softwareserial.h>
#define MAX_INPUT  50
const int switchModule = 4;
int bluetoothTx = 2;  // TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3;  // RX-I pin of bluetooth mate, Arduino D3
int switchReading = 0;
long int counter = 0;
SoftwareSerial bluetoothSlave(bluetoothTx, bluetoothRx);
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("<pre>void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("$
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("$");  // Enter command mode
  delay(100);  // Short delay, wait for the Mate to send back CMD
  bluetoothSlave.println("U,9600,N");  // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetoothSlave.begin(9600);  // Start bluetooth serial at 9600
}
lt;pre>void setup() { // put your setup code here, to run once: pinMode(switchModule, INPUT); Serial.begin(9600); bluetoothSlave.begin(115200); // The Bluetooth Mate defaults to 115200bps bluetoothSlave.print("
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("$
void setup() {
  // put your setup code here, to run once:
  pinMode(switchModule, INPUT);
  Serial.begin(9600);
   bluetoothSlave.begin(115200);  // The Bluetooth Mate defaults to 115200bps
  bluetoothSlave.print("$");  // Enter command mode
  delay(100);  // Short delay, wait for the Mate to send back CMD
  bluetoothSlave.println("U,9600,N");  // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetoothSlave.begin(9600);  // Start bluetooth serial at 9600
}
quot;); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetoothSlave.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetoothSlave.begin(9600); // Start bluetooth serial at 9600 }

lt;pre>void setup() { // put your setup code here, to run once: pinMode(switchModule, INPUT); Serial.begin(9600); bluetoothSlave.begin(115200); // The Bluetooth Mate defaults to 115200bps bluetoothSlave.print("$"); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetoothSlave.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetoothSlave.begin(9600); // Start bluetooth serial at 9600 }

quot;); // Enter command mode delay(100); // Short delay, wait for the Mate to send back CMD bluetoothSlave.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity // 115200 can be too fast at times for NewSoftSerial to relay the data reliably bluetoothSlave.begin(9600); // Start bluetooth serial at 9600 }

void loop() {
  // put your main code here, to run repeatedly:
  switchReading = digitalRead(switchModule);
  Serial.println((int)switchReading);
  if(counter%5==0){
    bluetoothSlave.println(switchReading);
  }
  counter++;
  delay(200);
}

Step 13: Possible Improvements of the Artefact

  • Add a sensor that is able to detect if the user is sitting for more than 30 minutes.
  • Add sound interaction to enhance the interactivity. This will make it even easier for the artefact to draw attention as the vibration might not be heard due to loud sounds from the surrounding area. However, the sounds coming from the artefact should not be annoying.
  • Expand it so it can be used in social environments, at different workplaces or with friends and family. When one person moves it can motivate other people to do the same.