Midterm Project

Loneliness Killa-Ragnor Wu-Rodolfo Cossovich

Our project is called “Loneliness Killa”, a communication aiding artifact that help one user convey primitive emotions and signals to the other user.

CONTEXT AND SIGNIFICANCE

Our previous research in the Group Project inspires my midterm project a lot. For example, one project I did research on, called “The Table” made by Raffaello D’Andrea, Max Dean and Matt Donovan. In this project, this device, which is a table, uses actuators to move itself, so that it could move accordingly to the movement of the people in the room. This project highly inspired me on what a real “Interactive” process should be like. It enlightens me that an interactive project should not only be a single process, but a long, continuous process in which users and the device could continuously act and react to each other’s “behaviors”.  Therefore, we chose to modify our prototype into a more “continuously-interactive” design. Some people might say that the modern technological social platforms like WeChat or Instagram could do something quite similar, but I would say they are different. Our project is unique because it is a private two-way communication aiding device, which provides a closer connection, using the most primitive expressions and the heartrate and body temperature visualization, all of which are something any app like WeChat cannot achieve. In the modern era we are living in, the vast development has caused modern people to have relied too much on social media and text messages, leading to the phenomenon that a lot of modern people still feel lonely even though their life is full of so-called “social activities”–people rarely use their heat to feel each other anymore. This artifact is exactly targeted on people who feel this kind of “lonely”, for them to find some where to rest and articulate their heart.

CONCEPTION AND DESIGN

We first chose neopixel for the visualization, for the pixel could display different kinds of color, which fits into different circumstances with different emotions. Also the neopixel is a gorgeous way of displaying, which could rapidly grasp the users’ attention when using. The buttons we chose, was intentionally designed to be convenient for the users to use. The palm-shaped part is the trigger for the whole device where all the sensors are implemented. We made it into the shape of palm, so that it would be user-friendly enough which allows users to naturally put their palms on it without too many instructions. For the heartrate displaying, we originally planned to use simple LEDs, which later turned out to be too dark to be seen easily, wo we changed it into another pixel. 

FABRICATION AND PRODUCTION

During the fabrication and production process, I made a lot of work. First of all, I drew the script for my project, which set up a rough direction for our production.

The process of studying the pixel is the most important step, I think. I first went through the website provided in the equipment description page and learned how the pixel should be connected into a circuit. Then I downloaded some sample coding documents and studied them thoroughly. After a large amount of work, I got to know how the pixel worked, and how should I design and implement my codes in order to make it glow in some certain patterns I wish it to be.

After some complicated debugging jobs, I successfully made the pixel glow in the pattern “Hi,我在这”, which later becomes the activating animation of the device. Then, I finished another couple of patterns of emotions and characteristics, including “I love you”, happy face, sad face, etc., which all respectively corresponds to one button. For example, the “I love you” shows like this:

 

I think the prototyping process is really important. We spent some time building up a rough prototype, which we brought to the user test.

It was a basic box that contained a two LEDs, two neopixels and four buttons, but already enough to display all of the basic functions it is supposed to possess.

The user test is also important. During the user test, my partner was mainly responsible for the interpretation part, and I was responsible for the setup and the technical support. We received the feedback that there could more explanations and instructions on the device, for example, at least letting the user know what patterns they are sending by putting instruction on each button. We took that advice and upgraded the device later in our final product. We also received the idea that the distance between the two parts of the device should be farther, in order to present the idea of communicating between two people remotely. Both of the two pieces of advice were effective and practical, which we adopted immediately after the test.

CONCLUSIONS

Our project is intended to help modern people who feel lonely and hollow in the busy, quick modern life. The final results of our project align really well with the goal we set up at first. It is fully functional and well-performed, successfully accomplishing all the expectations we wish it to achieve. I think it did really well in conveying warmness and faithfulness among users. However, what we may find deficient about it is that, the device we made at last only achieved half of our definition, for it is only a one-way communication–only one user could control the input, and the other one receives the output, which is such a pity because of the limitation of the materials and time. If we had more time, I think we would first perfect the design of the device, to make it more user-friendly. Also, we would definitely make it into an upgraded, two-way device. We learned from this project that we should not rush too much, and we need to focus on every single detail, otherwise any single mistake may lead to a big failure in the end.

The number of lonely people is on the rise, but the opportunity for thoughtful communication between people is decreasing. We really need more inventions like “Loneliness Killa”, to at least release the feelings of loss and empty to some extent in people’s heart. Sometimes we think talk too much, and feel too little. Warmness, humanity, kindness, faithfulness, communication… these are what our project is trying to reveal, and to provoke.

ANNEX
codes
#include <Adafruit_NeoPixel.h>

#define LED_PIN   6

#define pressure A0

#define button1 13

#define button2 12

#define button3 8

#define button4 7

int pressure_val;

int button1_state = 0;

int button2_state = 0;

int button3_state = 0;

int button4_state = 0;

int prev_pressure_val = 0;




#define LED_COUNT 64




Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);




void setup() {

  strip.begin();          

  strip.show();            

  strip.setBrightness(255);

  Serial.begin(9600);




  pinMode(pressure, INPUT);

  pinMode(button1, INPUT);

  pinMode(button2, INPUT);

  pinMode(button3, INPUT);

  pinMode(button4, INPUT);

}




void loop() {

  pressure_val = analogRead(pressure);

  button1_state = digitalRead(button1);

  button2_state = digitalRead(button2);

  button3_state = digitalRead(button3);

  button4_state = digitalRead(button4);

  Serial.println(pressure_val);




if((prev_pressure_val == 0) && (pressure_val > 200)){

    rainbow1(10);

    delay(500);

    HI(100);

    wo(100);

    zai(100);

    zhe(100);

    prev_pressure_val = 2 ;

  }

  if(pressure_val > 250){

    rainbow1(10);

  }




  if(button1_state == 1){

    //我爱你

    wo(100);

    love(100);

    ni(100);

  }

  else if(button2_state == 1){

    //笑脸

    happy(100);

  }

  else if(button3_state == 1){

    //哭脸

    sad(100);

  }

  else if(button4_state == 1){

    //再见

    byezai(100);

    jian(100);

  }

}




//funtions used in the project

void HI(int wait) {

  int list_HI[34] = {0,1,2,3,4,5,6,7,11,20,12,19,31,30,29,28,27,26,25,24,47,48,46,49,44,43,42,41,40,51,52,53,54,55};

  int firstPixelHue = 20000;

  for(int i=0; i<34; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_HI[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(400);

  strip.clear();  

  strip.show();

}




void I(int wait) {

  int firstPixelHue = 0;  

  for(int i=24; i<40; i++) { // For each pixel in strip...

      for(int c=0; c<16; c += 1) {

        // hue of pixel 'c' is offset by an amount to make one full

        // revolution of the color wheel (range 65536) along the length

        // of the strip (strip.numPixels() steps):

        int      hue   = firstPixelHue + c * 65536L / 10;

        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

        strip.setPixelColor(i, color); // Set pixel 'c' to value 'color'

      }

      strip.show();                // Update strip with new contents

      delay(wait);                 // Pause for a moment

      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames

    }

  delay(100);

  strip.clear();  

  strip.show();

}




void AM(int wait) {

  int list_AM[36] = {7,6,5,4,3,2,1,15,16,30,29,28,27,26,25,24,12,19,39,38,37,36,35,34,33,32,46,49,63,62,61,60,59,58,57,56};

  int firstPixelHue = 0;

  for(int i=0; i<36; i++){

    int      hue   = firstPixelHue + 65536L / 36;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_AM[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

    firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void HERE(int wait){

  int list_HERE[44] = {0,1,2,14,17,31,30,29,32,47,48,63,33,34,46,49,62,45,50,61,4,11,20,27,26,21,10,5,6,7,22,24,36,43,52,59,37,42,53,58,38,41,54,57};

  int firstPixelHue = 0;

  for(int i=0; i<44; i++){

    int      hue   = firstPixelHue + 65536L / 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_HERE[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

    firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void wo(int wait){

  int list_wo[30] = {16,31,13,18,29,34,45,50,61,30,28,27,26,25,24,23,9,21,35,47,46,44,43,42,54,56,38,52,48,62};

  int firstPixelHue = 30000;

  for(int i=0; i<30; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_wo[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void zai(int wait){

  int list_zai[27] = {13,18,29,34,45,50,32,33,28,20,10,6,21,22,23,26,37,42,53,44,43,41,24,39,40,55,56};

  int firstPixelHue = 40000;

  for(int i=0; i<27; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_zai[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void zhe(int wait){

  int list_zhe[27] = {14,17,12,19,20,21,22,8,24,39,40,55,56,47,46,29,34,45,50,61,35,36,42,54,51,52,38};

  int firstPixelHue = 50000;

  for(int i=0; i<27; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_zhe[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void love(int wait){

  int list_love[36] = {2,3,14,13,12,11,16,17,18,19,20,21,30,29,28,27,26,25,33,34,35,36,37,38,47,46,45,44,43,42,49,50,51,52,61,60};

  int firstPixelHue = 50000;

  for(int i=0; i<36; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_love[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void happy(int wait){

  int list_happy[30] = {1,2,3,4,5,6,8,23,24,39,40,55,57,58,59,60,61,62,48,47,32,31,16,15,18,45,21,25,38,42};

  int firstPixelHue = 50000;

  for(int i=0; i<30; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_happy[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void sad(int wait){

  int list_sad[30] = {1,2,3,4,5,6,8,23,24,39,40,55,57,58,59,60,61,62,48,47,32,31,16,15,18,45,22,26,37,41};

  int firstPixelHue = 50000;

  for(int i=0; i<30; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_sad[i], color); // Set pixel 'c' to value 'color'

    strip.show();                // Update strip with new contents

    delay(wait);                 // Pause for a moment

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void byezai(int wait){

  int list_byezai[38] = {15,16,31,32,47,14,13,12,11,10,9,8,14,17,30,33,46,49,50,51,52,53,54,55,40,39,29,28,27,26,19,35,44,5,21,37,42,58};

  int firstPixelHue = 50000;

  for(int i=0; i<38; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue));

    strip.setPixelColor(list_byezai[i], color);

    strip.show();                

    delay(wait);                

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void jian(int wait){

  int list_jian[28] = {16,17,18,19,20,21,31,32,47,48,49,50,51,52,53,34,35,36,37,25,23,38,39,40,55,56,57,58};

  int firstPixelHue = 50000;

  for(int i=0; i<28; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue));

    strip.setPixelColor(list_jian[i], color);

    strip.show();              

    delay(wait);                

  delay(500);

  strip.clear();  

  strip.show();

}




void ni(int wait){

  int list_ni[30] = {16,17,13,3,12,11,10,9,8,31,30,29,19,33,46,49,62,50,45,44,43,42,41,40,39,24,27,21,52,58};

  int firstPixelHue = 50000;

  for(int i=0; i<30; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue));

    strip.setPixelColor(list_ni[i], color);

    strip.show();                

    delay(wait);                

  }

  delay(500);

  strip.clear();  

  strip.show();

}




void rainbow1(int wait) {

  for(long firstPixelHue = 0; firstPixelHue < 2*65536; firstPixelHue += 256) {

    strip.rainbow(firstPixelHue);

    delay(wait);  

  }

  strip.clear();

  strip.show();

}
#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   6




const int heartbeat = 4;

int heartbeat_val;

int old_val = 0;




#define PIXEL_COUNT 64




Adafruit_NeoPixel strip(PIXEL_COUNT, BUTTON_PIN, NEO_GRB + NEO_KHZ800);




void setup() {

  // put your setup code here, to run once:

  pinMode(heartbeat, INPUT);

  pinMode(BUTTON_PIN, OUTPUT);

  Serial.begin(9600);

}




void loop() {

  //put your main code here, to run repeatedly:

  heartbeat_val = digitalRead(4);

  Serial.println(heartbeat_val);

  if((heartbeat_val == 1)&&(old_val == 0)){

    colorWipe(strip.Color(255,   0,   0),300);

  }

  old_val = heartbeat_val;

  delay(10);

}

//

void colorWipe(uint32_t color, int wait) {

  for(int i=0; i<64; i++) { // For each pixel in strip...

    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)

  }

  strip.show();

  delay(wait);

  strip.clear();

  strip.show();

}
#include <Adafruit_NeoPixel.h>

#define LED_PIN    6

#define LED_COUNT 64

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);




const int temp = A0;

int temp_val;




void setup() {

  strip.begin();          

  strip.show();            

  strip.setBrightness(255);

  pinMode(temp, INPUT);

}




void loop() {

  temp_val = analogRead(A0) * (5000 / 1024.0) / 10;

  if(temp_val == 35){

    num35();

  }

  else if(temp_val == 36){

    num36();

  }

  else if(temp_val == 37){

    num37();

  }

  else if(temp_val == 38){

    num38();

  }

  else if(temp_val == 39){

    num39();

  }

  else if(temp_val == 40){

    num40();

  }

  delay(100);
}




void num34() {

  int list_34[30] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,63,62,61,60,59,58,57,56,49,45,35,44,51};

  int firstPixelHue = 8200;

  for(int i=0; i<30; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_34[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num35() {

  int list_35[34] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,63,48,47,32,33,34,35,44,51,60,59,58,57,56,55,40,39};

  int firstPixelHue = 8200;

  for(int i=0; i<34; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_35[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num36() {

  int list_36[37] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,63,48,47,32,33,34,35,36,37,38,39,40,55,56,57,58,59,60,51,44};

  int firstPixelHue = 8200;

  for(int i=0; i<37; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_36[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num37() {

  int list_37[28] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,32,47,48,63,62,61,60,59,58,57,56};

  int firstPixelHue = 8200;

  for(int i=0; i<28; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_37[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num38() {

  int list_38[42] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,32,47,48,63,62,61,60,59,58,57,56,32,33,34,35,36,37,38,39,47,48,44,51,40,55};

  int firstPixelHue = 8200;

  for(int i=0; i<42; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_38[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num39() {

  int list_39[36] = {0,15,16,31,30,29,28,27,26,25,24,23,8,7,3,12,19,32,33,34,35,44,51,60,47,48,63,62,61,59,58,57,56,55,40,39};

  int firstPixelHue = 8200;

  for(int i=0; i<36; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_39[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}




void num40() {

  int list_40[34] = {0,1,2,3,12,19,28,29,30,31,27,26,25,24,32,33,34,35,36,37,38,39,10,55,56,57,58,59,60,61,62,63,48,47};

  int firstPixelHue = 8200;

  for(int i=0; i<34; i++){

    int      hue   = firstPixelHue + 100;

    uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB

    strip.setPixelColor(list_40[i], color); // Set pixel 'c' to value 'color'

  }

  strip.show();

  delay(300);

}
Video Presentation

Leave a Reply

Your email address will not be published. Required fields are marked *