Final-Project-Report

1. project name: a day as an Alzheimer’s patient, my name: is Amelia Ji, my partner’s name: is Yunyi Yang, and my instructor’s name: is Margret Minsky

2.  the concept of my project is for the users to experience one day of the Alzheimer’s patient so they can understand the patient’s difficulties. my previous investigation let me know much about the definition of interaction. according to my definition, interaction means more than two participants (including two) involved in one project and jointly making efforts for that project with or without intention. because of that, I designed my project so that users will use the up-down and left-right buttons on the computer to control the movement of the circle on the screen to trigger specific effects. so the participants’ number satisfies my definition of interaction. they are the user and the computer. also, they are involved in one project which is my project of exploring an Alzheimer’s patient’s daily routine. they all devote themselves to that project. the computer is running and the user pushes the buttons. in this sense, my project is consistent with my definition of interaction. according to WHO, there are over 15.2 million people with Alzheimer’s making this disease deserve serious attention. however, most people still regard this disease as a bad memory and of no importance. this directly leads to my creating this project. because I want my users to experience the feeling of being an Alzheimer’s patient, so I designed them to not know which way is the right way to go as the patient would not have known too. also, I designed them to return to the same position once they entered the wrong room because I want them to experience the frustration felt by most patients.  what’s more, we made the lights light up if they entered the right room because that signal that they have retrieved their memory. during the users’ test, most people think the maze was a bit too difficult and the light stripe was not so beautiful. They don’t know exactly what to do at first. because of those suggestions, we put the maze on the screen so that it becomes easier for the user to play. also, we use cotton to cover up the light stripe to make it more beautiful and dreamlike. finally, we added several words on the screen so that they can guide the users to play our project. these modifications all prove to be effective. 

3. the most important parts of our projects are the code and the building of the toy house. the coding part, we first wrote the processing part. I first draw a sketch of the toy house and then use the “key released” function in the processing and write about a fictional circle whose position is constantly refreshing every time we released the up button, the ball will go up 10, etc. then I draw several lines where every time the ball touch the line, the ball will stay at the former position. then I set the right route by setting every time the ball enters the wrong room, it will go back to the starting position. then, we began to build our toy house. I first 3D printed the couches and other furniture and I designed the size of the bricks of our house and sent it to laser cutting. after it was cut, I stuck them together. after that, Joy set the Arduino. she set different stages. and I set different lights that will light up according to the different stages. we used the code in Arduino to receive the message from Processing. after that, Joy and I found our project’s background song. and Joy cut them into pieces and sent them to me. I insert them into Processing so that they will play according to which room the circle is in. and the piece will ring every time the user pushes the button. then Joy and I together drew the video inserted at the end of our project and I inserted it into Processing. after that, Joy inserts the guiding words into the Processing. during that process, we purchased some more furniture to decorate our house. and I did the finishing thing including making the light flash in the end and testing everything to make sure they work. in the end, we painted the house and the furniture and stuck them together with a glue gun. we use wood instead of 3 d printing our house because it would be too timely for us to 3 d print such a big thing. we use 3 d print in making our furniture because 3 d printing can make the texture of our furniture wood can not reflect. also, we use cotton to soften the light because we want the light to be not so strong and make the whole house dreamy because the patients are living in a different world than ours. 

4. our original goal is to make the user feel like the patient with Alzheimer’s. we kind of achieved that. by saying kind of, I mean the users can feel the sensation of loss when playing our project. but the sense of exploring is lessened because they need to see both the computer screen and the toy house. also, I intend to make the light go as the ball goes. but it was too complicated so we made the whole room light up at once. my audience interacts with this project fine. I would put some monitors so that the audience wouldn’t have to look at two different places. also, I may ask the professor about how to make the light lights up as the ball goes without writing the code light by light. the thing I learned most in my project is that you should always keep the audience in mind. how they will interact with your project is what matters most. also, I learned that we should have a concept in mind so that everything we do is devoted to the concept. if we don’t have the concept in mind, we won’t know what to do. the other thing I learned is that it is important to have conversations, no matter with professors or with la or with your partners. I think the problem of Alzheimer’s disease is a problem all of us should take close attention to as everyone will get old someday and it is important for us to care about the elderly both for our own sake and because we are human being who cares about others. it is our responsibility as the young to take care of the elderly. that is why my project matters. 

5. here is the video

the following is the Arduino and Processing code I don’t know why it is in such a big chunk. I did it twice but every time, it was like this. I can slack you the code if you need it. but please don’t take points out because it’s messy. so sorry for the inconvenience. 

#include "SerialRecord.h"

// Change this number to the number of values you want to receive
SerialRecord reader(1);

//FOR neopixel----//
int pos = 0;
#include 
//LED PIN
#define LED_PIN 9
// Information about the LED strip itself
#define NUM_LEDS 154
#define CHIPSET NEOPIXEL  //WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];  // Define the array of leds
//set brightness
#define BRIGHTNESS 3
//---------------------//
boolean on, blinking;
void setup() {
  Serial.begin(9600);
  delay(1000);
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
  // celebration3();
  reader.read();

  Serial.println(reader[0]);
  if (reader[0] == 0) {
    for (int i = 13; i > 12 && i < 44; i++) { leds[i] = CRGB::White; FastLED.show(); } } if (reader[0] == 1) { for (int i = 10; i > 9 && i < 13; i++) { leds[i] = CRGB::White; FastLED.show(); } for (int i = 44; i > 43 && i < 52; i++) { leds[i] = CRGB::White; FastLED.show(); } } if (reader[0] == 2) { leds[0] = CRGB::White; for (int i = 70; i > 69 && i < 85; i++) { leds[i] = CRGB::White; } for (int i = 149; i > 148 && i < 155; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 3) { leds[0] = CRGB::White; for (int i = 7; i > 6 && i < 9; i++) { leds[i] = CRGB::White; } for (int i = 53; i > 52 && i < 59; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 4) { leds[0] = CRGB::White; for (int i = 60; i > 59 && i < 65; i++) { leds[i] = CRGB::White; FastLED.show(); } for (int i = 1; i > 0 && i < 6; i++) { leds[i] = CRGB::White; FastLED.show(); } //FastLED.show(); } if (reader[0] == 5) { leds[0] = CRGB::White; for (int i = 114; i > 113 && i < 146; i++) { leds[i] = CRGB::White; } FastLED.show(); } if (reader[0] == 6) { leds[0] = CRGB::White; // for (int i = 146; i > 145 && i < 149; i++) { // leds[i] = CRGB::White; // } // for (int i = 85; i > 84 && i < 113; i++) {
    //     leds[i] = CRGB::White;
    //   }
    //   FastLED.show();
    // }
    if (reader[0] == 20) {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB::Black;
      }
      FastLED.show();
    }
    if (reader[0] == 6) {
      // start blinking state
      blinking = true;
    }
    if (reader[0] == 88) {
      // stops blinking state
      blinking = false;
    }
    if (blinking && millis() % 1000 < 25) {
      if (on == true) {
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::Black;
        }
        on = false;
      } else {
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::White;
        }
        on = true;
      }
      FastLED.show();
    } else {
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = CRGB::Black;
      }
      FastLED.show();
    }
    delay(10);
  }
}
 
//color fillVal = color(126);

import processing.serial.*;
import osteele.processing.SerialRecord.*;
import processing.sound.*;
import processing.video.*;

Movie mov;

SoundFile soundfile1;
SoundFile soundfile2;
SoundFile soundfile3;
SoundFile soundfile4;
SoundFile soundfile5;
SoundFile soundfile6;
SoundFile soundfile7;

Serial serialPort;
SerialRecord serialRecord;

int rad = 20;        // Width of the shape
float xpos, ypos;    // Starting position of shape
float mx;
float my;
int speed = 10;
int radius = 2;
int edge = 0;
int inner = edge + radius;
boolean b = false;
float prexpos;
float preypos;
//0 = bedroom, 1 = toliet, 2 = kitchen, 3 = dinning room, 4 = balcony, 5 = living room, 6 = study
int state = 0;


void setup()
{
  size(1100, 800);
  background(0);
  // Load a soundfile
  soundfile1 = new SoundFile(this, "soundfile1.mp3");
  soundfile2 = new SoundFile(this, "soundfile2.mp3");
  soundfile3 = new SoundFile(this, "soundfile3.mp3");
  soundfile4 = new SoundFile(this, "soundfile4.mp3");
  soundfile5 = new SoundFile(this, "soundfile5.mp3");
  soundfile6 = new SoundFile(this, "soundfile6.mp3");
  soundfile7 = new SoundFile(this, "soundfile7.mp3");

  mov = new Movie(this, "movie.mp4");
  //mov.play();
  noStroke();
  frameRate(30);
  ellipseMode(RADIUS);
  // Set the starting position of the shape
  xpos = 300;
  ypos = 700;

  String serialPortName = SerialUtils.findArduinoPort();
  serialPort = new Serial(this, serialPortName, 9600);

  // In order to send a different number of values, modify the number `2` on the
  // next line to the number values to send. In this case, the corresponding
  // number in the Arduino sketch should be modified as well.
  serialRecord = new SerialRecord(this, serialPort, 1);
}


void draw() {
  if (state == 6) {
    if (mov.available()) {
      mov.read();
    }
    image(mov, 0, 0, width, height);
  } else {
    background(0);
    fill(255);
    circle(xpos, ypos, rad);
    //keyPressed();
    prexpos = xpos;
    preypos = ypos;
   
    stroke(255);
    line(0, 270, 50, 270);
    
    stroke(255);
    line(150, 270, 540, 270);
    
    stroke(255);
    line(640, 270, 740, 270);
    
    stroke(255);
    line(370, 600, 430, 600);
    
    stroke(255);
    line(480, 600, 650, 600);
    
    stroke(255);
    line(700, 600, 910, 600);
    
    stroke(255);
    line(1000, 600, 1100, 600);
    
    stroke(255);
    line(370, 270, 370, 350);
    
    stroke(255);
    line(370, 450, 370, 730);
    
    stroke(255);
    line(550, 600, 550, 730);
    
    stroke(255);
    line(740, 0, 740, 90);
    
     stroke(255);
    line(740, 180, 740, 450);
    
    stroke(255);
    line(740, 550, 740, 730);
    
    
    
    
  }
   if (xpos<370 && xpos>0 && ypos>350 && ypos<730){
     textSize(50);
    fill(255);
    text("You are an alzheimer patient,",width/4,height/2);
    text("you had just woken up",350,500);
  }
  
  if (xpos<550 && xpos>370 && ypos>600 && ypos<800) {
     textSize(50);
    fill(255);
    text("And you realize you need to go to the bathroom",100,height/2);
  }
  
  if (xpos<740 && xpos>370 && ypos>270 && ypos<600){
     textSize(50);
    fill(255);
    text("After go to the bathroom, you cook for yourself",100 ,height/2);
  }
  
  
   if (xpos<740 && xpos>550 && ypos>600 && ypos<800){
     textSize(50);
    fill(255);
    text("You grab some tools", 300,height/2);
  }
  
  if (xpos<1100 && xpos>740 && ypos>600 && ypos<800){
     textSize(50);
    fill(255);
    text("And you go to the balcony to take care of the plants",0,height/2);
  }
  
  if (xpos<1100 && xpos>740 && ypos>0 && ypos<600){ textSize(50); fill(255); text("And you stay in the living room to watch televison",100,height/2); } if (ypos == 701 && xpos ==301){ textSize(50); fill(255); text("You go to the wrong room, and forget what to do,",90,600); text("so you go back to the bedroom",170,700); } //if (xpos == 550 && ypos>730 && ypos<800){ // textSize(50); // fill(255); // text("You go to the grocery, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } //if (ypos == 270 && xpos>540 && xpos<640){ // textSize(50); // fill(255); // text("You go to the study, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } // if (xpos == 370 && ypos>350 && ypos<450){ // textSize(50); // fill(255); // text("You go to the kitchen, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } // if (xpos == 740 && ypos>450 && ypos<550){ // textSize(50); // fill(255); // text("You go to the living room, and forget what to do,",100,height/2); // text("so you go back to the bedroom",150,height/2); // } } void keyPressed() { println(state); ////if ((b == true) && (key == CODED)) { // if (key == CODED) { // if (keyCode == UP) { // ypos = ypos - speed; // } else if (keyCode == DOWN) { // ypos = ypos + speed; // } // if (keyCode == LEFT) { // xpos = xpos - speed; // } else if (keyCode == RIGHT) { // xpos = xpos + speed; // } // xpos = constrain(xpos, inner, width - inner); // ypos = constrain(ypos, inner, height - inner); // fill(76); // //} // //b = false; //} } void keyReleased() { //b = true; if (key == CODED) { if (keyCode == UP) { ypos = ypos - speed; } else if (keyCode == DOWN) { ypos = ypos + speed; } if (keyCode == LEFT) { xpos = xpos - speed; } else if (keyCode == RIGHT) { xpos = xpos + speed; } xpos = constrain(xpos, inner, width - inner); ypos = constrain(ypos, inner, height - inner); fill(76); //} //b = false; } if (xpos>0 && xpos<1100 && ypos==0) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>0 && ypos<90) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>180 && ypos<450) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>640 && xpos<740) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>150 && xpos<540) { xpos = prexpos; ypos = preypos; } else if (xpos==370 && ypos>270 && ypos<350) { xpos = prexpos; ypos = preypos; } else if (ypos==270 && xpos>0 && xpos<50) { xpos = prexpos; ypos = preypos; } else if (xpos==0 && ypos>0 && ypos<800) { xpos = prexpos; ypos = preypos; } else if (ypos==800 && xpos>0 && xpos<1100) { xpos = prexpos; ypos = preypos; } else if (xpos==370 && ypos>450 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>370 && xpos<430) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>480 && xpos<650) { xpos = prexpos; ypos = preypos; } else if (xpos==550 && ypos>600 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>700 && xpos<740) { xpos = prexpos; ypos = preypos; } else if (xpos==740 && ypos>550 && ypos<730) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>740 && xpos<910) { xpos = prexpos; ypos = preypos; } else if (ypos==600 && xpos>1000 && xpos<1100) { xpos = prexpos; ypos = preypos; } else if (xpos==1100 && ypos>0 && ypos<800) { xpos = prexpos; ypos = preypos; } else if (ypos == 270 && xpos>50 && xpos<150) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 550 && ypos>730 && ypos<800) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (ypos == 270 && xpos>540 && xpos<640) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 740 && ypos>450 && ypos<550) { xpos = 301; ypos = 701; state = 20; serialRecord.values[0] = state; serialRecord.send(); } else if (xpos == 370 && ypos>350 && ypos<450) {
    xpos = 301;
    ypos = 701;
    state = 20;
    serialRecord.values[0] = state;
    serialRecord.send();
  }
  if (xpos<370 && xpos>0 && ypos>350 && ypos<730) {
    state = 0;
    serialRecord.values[0] = state;
    serialRecord.send();
    
    
    if (soundfile1.isPlaying() == false) {
      soundfile1.play();
      soundfile2.stop();
      soundfile3.stop();
      soundfile4.stop();
      soundfile5.stop();
      soundfile6.stop();
      }
     
  }

  if (xpos<550 && xpos>370 && ypos>600 && ypos<800) {
    state = 1;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile2.isPlaying() == false) {
      soundfile2.play();
    }
    soundfile1.stop();
  }

  if (xpos<740 && xpos>370 && ypos>270 && ypos<600) {
    state = 2;
    serialRecord.values[0] = state;
    serialRecord.send();
    println(serialRecord.values[0]);
    if (soundfile3.isPlaying() == false) {
      soundfile3.play();
    }
    soundfile2.stop();
  }

  if (xpos<740 && xpos>550 && ypos>600 && ypos<800) {
    state = 3;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile4.isPlaying() == false) {
      soundfile4.play();
    }
    soundfile3.stop();
  }

  if (xpos<1100 && xpos>740 && ypos>600 && ypos<800) {
    state = 4;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile5.isPlaying() == false) {
      soundfile5.play();
    }
    soundfile4.stop();
  }

  if (xpos<1100 && xpos>740 && ypos>0 && ypos<600) {
    state = 5;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile6.isPlaying() == false) {
      soundfile6.play();
    }
    soundfile5.stop();
  }


  if (xpos<740 && xpos>0 && ypos>0 && ypos<270) {
    state = 6;
    serialRecord.values[0] = state;
    serialRecord.send();
    if (soundfile7.isPlaying() == false) {
      soundfile7.play();
      soundfile6.stop();
      mov.play();
      float md = mov.duration();
      float mt = mov.time();
      if (mt == md){
        serialRecord.values[0] = 88;
        serialRecord.send();
    }
  }
}

} 

Amelia’s Tenth Documentation Blog

1. in this project, we are going to use a physical sensor to control media on processing to change. in my project, I use the potentiometer to control the location of the media in processing. when I turn the nob, the picture’s position will change. we hope to learn how to control the media through Arduino.

2. the process went as planned. I first opened the example to send and receive the variables on processing and Arduino. then, I change the code so that instead of sending the position of the ball, I’m sending the position of the picture I put in the file of the processing. after changing the code, I connect the Arduino to the computer and test it. it worked. what didn’t go as planned is that the first time I connected the Arduino, I connect the middle one to the ground so that there was a shortcut there and my potentiometer went very hot. 

3. what I learned is how to control the media through Arduino. I also remembered deeply the middle of the potentiometer is used for the pin only.

4. the following is my code and the video.

/**
 * Example sketch for the SerialRecord library for Processing.
 *
 * Receives two integers from the serial port, and uses them to control the x
 * and y position of a circle on the canvas.
 */

import processing.serial.*;
import osteele.processing.SerialRecord.*;
PImage photo;

Serial serialPort;
SerialRecord serialRecord;

void setup() {
  size(500, 500);

  String serialPortName = SerialUtils.findArduinoPort();
  serialPort = new Serial(this, serialPortName, 9600);
  photo = loadImage("syt.jpeg");
  // If the Arduino sketch sends a different number of values, modify the number
  // `2` on the next line to match the number of values that it sends.
  serialRecord = new SerialRecord(this, serialPort, 2);
}

void draw() {
  background(0);
  int value1 = serialRecord.values[0];
  int value2 = serialRecord.values[1];
  
  float x = map(value1, 0, 1024, 0, width);
  float y = map(value2, 0, 1024, 0, height);
  image(photo, x, y);
  serialRecord.read();

} 
/*
  SendMultipleValues

  Reads an analog input on pin 0, and sends a record that contains two values:

  1. Value of `millis()`, modulo 1024.
  2. The analog value that is read from pin 0.

  If you attach a potentiometer to pin 0, you can control this value by moving
  the pot.

  This sketch pairs well with the RecieveMultipleValues example from the
  Processing SerialRecord library
  <https://osteele.github.io/Processing_SerialRecord/>.

  Things to try:
  - Connect a second potentiometer to the Arduino, and send the values from both
    potentiometers, instead of send a value that is based on `millis()`.
  - Send the value from another sensor, such as temperature or proximity.

  by Oliver Steele, 2020-2022

  This example code is in the public domain.
*/

#include "SerialRecord.h"

// Change this number to send a different number of values
SerialRecord writer(2);

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);

  writer[0] = millis() % 1024;
  writer[1] = sensorValue;
  writer.send();

  // This delay slows down the loop, so that it runs less frequently. This can
  // make it easier to debug the sketch, because new values are printed at a
  // slower rate.
  delay(10);
}