<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Crit 2: Kinetic &#8211; Making Things Interactive, Fall 2020</title>
	<atom:link href="https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;cat=16" rel="self" type="application/rss+xml" />
	<link>https://courses.ideate.cmu.edu/48-339/f2020</link>
	<description>Making Things Interactive</description>
	<lastBuildDate>Thu, 03 Dec 2020 21:48:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.14</generator>
	<item>
		<title>Braille Translator</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1596</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1596#respond</comments>
		
		<dc:creator><![CDATA[Zerui Huo]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 23:09:25 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1596</guid>

					<description><![CDATA[Problem It can be very difficult for people with seeing difficulty to orient themselves. In fact, it is already difficult enough to locate the braille signs, which is supposed to help them. In addition, there are situations where visual clues are necessary, such as deciding which elevator goes up when two arrive at the same &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1596" class="more-link">Continue reading<span class="screen-reader-text"> "Braille Translator"</span></a>]]></description>
										<content:encoded><![CDATA[<h1>Problem</h1>
<p>It can be very difficult for people with seeing difficulty to orient themselves. In fact, it is already difficult enough to locate the braille signs, which is supposed to help them. In addition, there are situations where visual clues are necessary, such as deciding which elevator goes up when two arrive at the same time. Here is a video that mentions such difficulty.</p>
<p><iframe title="How Blind People Find Braille Signs" width="840" height="473" src="https://www.youtube.com/embed/fYLdlO96uaM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>As a result, people with visual difficulty have to memorize routes. It is also very challenging for them to travel through a new district or locate a room in an unfamiliar building.</p>
<h1>Solution</h1>
<p>The key that causes this problem is the lost of visual clues. When we walk into a new building, we can look for signs for directions. When we travel through a new place, we can use google map as a guide.  However, for people with seeing difficulty, the same clues are either impossible to get, like the road sings for example, or very inaccessible like the braille sign that hides behind a door.</p>
<p>To solve this problem, I would like to translate the visual clues into braille on a device that is accessible. In other words, instead of looking for physical sign of braille, the user can read the signs in braille on a device in his or her hand. This device, however, can not only be used as a navigator but also a &#8220;seeing&#8221; tool to read the visuals in a space or environment.</p>
<figure id="attachment_1600" aria-describedby="caption-attachment-1600" style="width: 840px" class="wp-caption alignnone"><img loading="lazy" class="wp-image-1600 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-1024x614.jpg" alt="" width="840" height="504" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-1024x614.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-300x180.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-768x461.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-1536x921.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-2048x1228.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3485-1200x720.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-1600" class="wp-caption-text">The design of the prototype</figcaption></figure>
<p>As shown in the figure above, the device have 12 digits for displaying letters and punctuations. Each digit is made of 6 solenoids and will display alphabet in braille. The rotary encode on the right is for flipping to the next 12 letters in the sentences. There are also a confirm button and a back button. This device can be connected to smart phone and indoor devices through Bluetooth or wi-fi.</p>
<p>Suppose a person with difficulty wants to go to new place, he or she can use app on  his or her smartphone to determine the route. The person can then use the device to navigate while walking. When there are road signs or alerts that need attention, the device will vibrate and display the message. The device will go back to the route when the alert was read and confirm button pressed. The person can also use the back button to check the last direction or instruction.</p>
<p>Of course, the effectiveness of this device depends heavily on how small we can make it to be. With the current material of mini-solenoid, I can make it to have a length of 18 cm and a width of 7.2 cm. This cannot work effective as a navigation tool because it is too big and cumbersome. However, it can still be used while stationary such as in a restaurant, museum, and a room.</p>
<figure id="attachment_1603" aria-describedby="caption-attachment-1603" style="width: 840px" class="wp-caption alignnone"><img loading="lazy" class="wp-image-1603 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-1024x536.jpg" alt="" width="840" height="440" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-1024x536.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-300x157.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-768x402.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-1536x805.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-2048x1073.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3486-1200x629.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-1603" class="wp-caption-text">For future design</figcaption></figure>
<p>If we have the interactive surface technology in the future, this is the design I will give to the device. It wrap around the arm of the user so that the user can hold a white cane in one hand, and read the information using another hand. No more buttons and rotary encoder are needed because everything can be displayed and interacted with through the surface.</p>
<h1>Proof of Logic</h1>
<figure id="attachment_1609" aria-describedby="caption-attachment-1609" style="width: 768px" class="wp-caption alignnone"><img loading="lazy" class="wp-image-1609 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-768x1024.jpg" alt="" width="768" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-768x1024.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-225x300.jpg 225w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-1152x1536.jpg 1152w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-1536x2048.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-1200x1600.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3487-scaled.jpg 1920w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /><figcaption id="caption-attachment-1609" class="wp-caption-text">The components of the demonstration</figcaption></figure>
<p>The demo is made up of a solenoid, a Bluetooth module, 6 LED, 4 buttons, and a vibration motor. The LEDs represent the 6-dot grid of the braille. The corresponding grid is shown below.</p>
<figure id="attachment_1610" aria-describedby="caption-attachment-1610" style="width: 840px" class="wp-caption alignnone"><img loading="lazy" class="wp-image-1610 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-1024x1015.jpg" alt="" width="840" height="833" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-1024x1015.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-300x297.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-150x150.jpg 150w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-768x761.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-1536x1522.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-2048x2029.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3488-1200x1189.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-1610" class="wp-caption-text">LED braille grid</figcaption></figure>
<p>Because the demo-device is relatively complex, it will be explained with video of demonstration.</p>
<p><iframe title="The function of solenoid" width="840" height="473" src="https://www.youtube.com/embed/uQ7tZMhi8pk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>This shows the normal function of the solenoid. In the later demonstration it does not function correctly due to the insufficient current arduino UNO supplies.</p>
<p><iframe title="Flipping to the next or last 12 letters" width="840" height="473" src="https://www.youtube.com/embed/Ozcw0GFp4i0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>The two button pressed in the video represents the rotary encode that allows the user to flip to the next or previous 12 letters.</p>
<p><iframe title="Going through the directions or instructions with confrim button" width="840" height="473" src="https://www.youtube.com/embed/bdb2jFFPCGc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>The buttons pressed in the video are confirm button and back button, which allows the user to display the next or previous message instruction.</p>
<p><iframe title="Alerts are send through Bluetooth" width="840" height="473" src="https://www.youtube.com/embed/amce-jhvXCc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
<p>Finally, in the video alerts are sent from the PC to the device through Bluetooth. The device then vibrate and display the alert with the corresponding braille letter.</p>
<p>Schematic:</p>
<p><img loading="lazy" class="alignnone size-large wp-image-1637" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-1024x693.png" alt="" width="840" height="568" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-1024x693.png 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-300x203.png 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-768x520.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-1536x1040.png 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem-1200x812.png 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/shcematic_schem.png 1644w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p>Code:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">//Defining the pins
#define solenoide 12
#define motor 13
#define rotary_up 5
#define rotary_down 4
#define confirm 3
#define back 2
#define LED1 11
#define LED2 10
#define LED3 9
#define LED4 8
#define LED5 7
#define LED6 6

//Variables
//constant variables
char *INPUT_STRINGS[] = {"information destk is at first floor","elevator is to the right by ten meters" ,"this is room b ten"};

//Message is like the route and direction
int message;
int message_length;
String string;
int start_letter;

//Alert is like the signs or alerts on the street or in buildings
String incoming_alert; //string that stores the incoming message
String alert[5];
int alert_index;
bool has_alert;
bool vibration_on;

//variable for interrupt, note that message is also a ISR variable
const bool isInterrupt = true;
int message_number = 3;

//timer
//Clock 1 is the timer for checking the rotary encoder
unsigned long clock1 = 0; // variable for timing
const int INTERVAL1 = 300; // milliseconds between updates

//Clock 2 is for serial printing for illustration
unsigned long clock2 = 0; // variable for timing
const int INTERVAL2 = 2000; // milliseconds between updates

//Clock 3 is for serial printing for illustration
unsigned long clock3 = 0; // variable for timing
const int INTERVAL3 = 1500; // milliseconds between updates


// the interrupt method
// NOTE:  we shouldn't use Serial.prinln(), delay(), and many
// other functions in an interrupt method
void ConfirmSwitchPressed()
{
  if (digitalRead(confirm) == LOW) {
    if (has_alert == true) {
      //alert index also show how many alerts are in the alert array
      if (alert_index == 1) {
        has_alert = false;
      }

      for (int i; i &lt; alert_index; i++) {
        alert[i] = alert[i + 1];
      }

      if (alert_index != 0) {
        alert_index -= 1;
      }

      Serial.println("Alert read");
      return;
    }


    if (has_alert == false) {
      message == message_number ? message = 0 : message++;
      start_letter = 0;

      Serial.println("Next Message");
    }
  }
}

void BackSwitchPressed()
{
  if (digitalRead(back) == LOW) {

    if (has_alert == false) {
      message == 0 ? message = message_number : message--;
      start_letter = 0;

      Serial.println("Previous Message");
    }
  }
}

//Functions
//demonstration function that shows how to move solenoid
void move_solenoid() {
  digitalWrite(solenoide, HIGH);
  delay(1000);
  digitalWrite(solenoide, LOW);
  delay(1000);
}

//Demonstration function
void vibrate_motor() {
  digitalWrite(motor, HIGH);
  delay(2000);
  digitalWrite(motor, LOW);
  delay(2000);
}


void show_letters() {
  if (has_alert == true) {
    braille(alert[0][start_letter]);
  }

  if (has_alert == false) {
    braille(INPUT_STRINGS[message][start_letter]);
  }

  //if there are actually 12 digits, each made of 6 solenoid
  //int digit;
  //for (i=start_letter, i&lt; start_letter +13,i++) {
  //     braille(digit, INPUT_STRINGS[message][start_letter + i])
  //     digit += 1;
  //    }
}

//This function put the incoming alert into the alert array
void insert_alert() {
  //-1 indicates that there is no \ in the alert message
  int null_index = incoming_alert.indexOf('.');
  if (null_index != -1 and alert_index &lt; 4) {
    alert[alert_index] = incoming_alert.substring(0, null_index);
    alert_index += 1;
    //Tell the system there are alerts
    has_alert = true;

    //Turn the vibration and its corresponding timer on
    digitalWrite(motor, HIGH);
    vibration_on = true;
    clock3 = millis() + INTERVAL3;

    //Clear the string for the next incoming alert
    incoming_alert = "";

    Serial.print("Alert received, ");
    Serial.println("vibration on.");
  }
}



//In the actual desgin instead of this demo, the 6 LEDs are 6 solenoides
void braille(char input) {
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, LOW);
  digitalWrite(solenoide, LOW);


  if (input == 'a') {
    digitalWrite(LED1, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'b') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'c') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED4, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'd') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'e') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'f') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'g') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'h') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'i') {

    digitalWrite(LED2, HIGH);
    digitalWrite(LED4, HIGH);

  }

  if (input == 'j') {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);
  }

  if (input == 'k') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);

    digitalWrite(solenoide, HIGH);

  }

  if (input == 'l') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'm') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'n') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED5, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'o') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED5, HIGH);
    digitalWrite(LED3, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'p') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);

    digitalWrite(solenoide, HIGH);
  }

  if (input == 'q') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }


  if (input == 'r') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }



  if (input == 's') {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);

  }


  if (input == 't') {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);
  }


  if (input == 'u') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED6, HIGH);

    digitalWrite(solenoide, HIGH);
  }


  if (input == 'v') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED6, HIGH);

    digitalWrite(solenoide, HIGH);

  }


  if (input == 'w') {

    digitalWrite(LED2, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);
  }


  if (input == 'x') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED6, HIGH);

    digitalWrite(solenoide, HIGH);
  }



  if (input == 'y') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED4, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }


  if (input == 'z') {
    digitalWrite(LED1, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED5, HIGH);

    digitalWrite(solenoide, HIGH);
  }


  if (input == ',') {
    digitalWrite(LED2, HIGH);
  }


  if (input == '.') {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED6, HIGH);
    digitalWrite(LED5, HIGH);
  }

  if (input == '!') {
    digitalWrite(LED2, HIGH);
    digitalWrite(LED3, HIGH);
    digitalWrite(LED5, HIGH);
  }
}



void setup() {
  // Setup the pin modes
  pinMode(solenoide, OUTPUT);
  pinMode(motor, OUTPUT);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);


  //When the buttons are pushed, digitalRead shows 0
  pinMode(rotary_up, INPUT_PULLUP);
  pinMode(rotary_down, INPUT_PULLUP);
  pinMode(confirm, INPUT_PULLUP);
  pinMode(back, INPUT_PULLUP);


  //Initiate the serial monitor
  Serial.begin(9600);

  // attach the interrupt pin to a method
  if (isInterrupt) {
    attachInterrupt (digitalPinToInterrupt(confirm), ConfirmSwitchPressed, FALLING);
    attachInterrupt (digitalPinToInterrupt(back), BackSwitchPressed, FALLING);
  }


}


void loop() {
  //Determining the number of messages/alerts and the length of each message

  if (has_alert == true) {
    string = alert[0];
    message_length = string.length();
  }

  if (has_alert == false) {
    string = INPUT_STRINGS[message];
    message_length = string.length();
  }

  //Receiving the characters of incoming alerts
  while (Serial.available()) {
    //while there is data available on the serial monitor
    //Serial.println(Serial.read());
    incoming_alert += char(Serial.read()); //store string from serial command
  }

  insert_alert();

  //Check if any movement has been made on the rotary encoder
  if (millis() &gt;=  clock1) {

    if (digitalRead(rotary_up) == LOW) {
      if (start_letter + 12 &lt;= message_length) {
        start_letter += 12;
        Serial.println("Next 12 letters");
      }
    }

    if (digitalRead(rotary_down) == LOW) {
      if (start_letter - 12 &gt;= 0)  {
        start_letter -= 12;
        Serial.println("Last 12 letters");
      }
    }

    clock1 = millis() + INTERVAL1 ;

  }

  show_letters();

  //For serial printing of demonstration
  if (millis() &gt;=  clock2) {

    if (incoming_alert != "") {
      Serial.print("Incoming Alert: ");
      Serial.println(incoming_alert);
    }

    //Serial.print("The current message or alert: ");
    Serial.println(string);

    
    clock2 = millis() + INTERVAL2 ;

  }

  //For 2-second duration of the vibration motor
  if (millis() &gt;=  clock3 and vibration_on == true) {
    digitalWrite(motor, LOW);
    vibration_on = false;
    Serial.println("vibration off.");
  }


}</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1596</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Worry free curtains and an alarm clock supplement that&#8217;s natural!</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1601</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1601#respond</comments>
		
		<dc:creator><![CDATA[sakamath@andrew.cmu.edu]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 22:51:16 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1601</guid>

					<description><![CDATA[Problem: Do you like having natural light in the room during the day, but often forget to close the curtains at night and so get woken up earlier than you wanted in the morning? Do you ever just want to wake up with natural light in the room, but not get woken up too early &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1601" class="more-link">Continue reading<span class="screen-reader-text"> "Worry free curtains and an alarm clock supplement that&#8217;s natural!"</span></a>]]></description>
										<content:encoded><![CDATA[<p><strong>Problem:</strong></p>
<p>Do you like having natural light in the room during the day, but often forget to close the curtains at night and so get woken up earlier than you wanted in the morning? Do you ever just want to wake up with natural light in the room, but not get woken up too early by it? After not getting enough sleep, do you find yourself having trouble getting up to your alarm or being blinded when you turn on the light or open the curtains because your eyes aren&#8217;t used to it? If you&#8217;re like me and have answered yes to these questions, this worry free curtain and alarm clock supplement could be the solution!</p>
<p><strong>Proposed Solution:</strong></p>
<p>Enter the time times you want to wake up each day of the week, the current date and time, upload the program, and that&#8217;s it your curtains will open according to the time you want to wake up and when you went to bed (set by pressing button) and close when it&#8217;s evening and dark. If you didn&#8217;t get nearly enough sleep, a fan will also blow in your face when your alarm goes off to help ensure you wake up. The fan could be an overhead one, but one on a nightstand or a taller one on the floor next to the bed would be best. I used the left and right threaded rods coupled together that I had from a previous project to be able to control the open and closing of the curtains movement. The logic I used for when the curtains should open compared to when you want to wake up and when you went to sleep were set by my preferences wherein the less sleep I got, the earlier the curtains would open based on time frames of amount of sleep. For me if I&#8217;ve gotten less sleep, I wake up to slight changes less than if I got enough sleep. Also, the fan is set to blow at a low speed for a minute when you&#8217;ve had under 5 hours sleep and high speed for 30 seconds if you&#8217;ve had between 5 and 6 hours. This is because higher speed will be more annoying and so needs to be on less; the lower speed is for the least sleep case because you are more likely to get sick on less sleep. I used a stepper motor to control the opening and closing of the curtains as that is what I had available and I can easily control the distance moved forward and reverse precisely. I would&#8217;ve used a faster motor if available and ideally a DC motor and an encoder instead as I&#8217;d be able to control the amounts forward and reverse easily and it&#8217;s more efficient in this scenario. Additionally, if I had a pressure sensor, the time you went to bed would be detected by the time you went on the bed and didn&#8217;t get up again before the alarm. This way you wouldn&#8217;t have to remember to click a button. To add to this, I would add a speaker so that this could be used for an alarm sound itself too. Finally, as someone mentioned during the crit, an app would be really useful for inputting the parameters and quickly making any changes. With the materials I was able to use and the time given, I&#8217;m happy with this prototype and in the future may make this for myself on an actual scale.</p>
<p>For reference, this is what the curtains in my room look like:</p>
<p><strong><img loading="lazy" class="size-medium wp-image-1627 aligncenter" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains-300x210.jpg" alt="" width="300" height="210" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains-300x210.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains-1024x717.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains-768x538.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains-1200x840.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/myCurtains.jpg 1204w" sizes="(max-width: 300px) 85vw, 300px" /></strong></p>
<p>Ideal fans:</p>
<figure id="attachment_1632" aria-describedby="caption-attachment-1632" style="width: 281px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-1632 size-medium" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/small-fan-for-nightstand-281x300.jpg" alt="" width="281" height="300" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/small-fan-for-nightstand-281x300.jpg 281w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/small-fan-for-nightstand.jpg 537w" sizes="(max-width: 281px) 85vw, 281px" /><figcaption id="caption-attachment-1632" class="wp-caption-text">small fan for nightstand</figcaption></figure>
<figure id="attachment_1633" aria-describedby="caption-attachment-1633" style="width: 189px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-1633 size-medium" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/floor-stand-fan-189x300.jpg" alt="" width="189" height="300" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/floor-stand-fan-189x300.jpg 189w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/floor-stand-fan.jpg 366w" sizes="(max-width: 189px) 85vw, 189px" /><figcaption id="caption-attachment-1633" class="wp-caption-text">floor stand fan to be put near  head of bed</figcaption></figure>
<p><strong>Proof of Concept:</strong></p>
<div style="width: 640px;" class="wp-video"><!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->
<video class="wp-video-shortcode" id="video-1601-1" width="640" height="368" preload="metadata" controls="controls"><source type="video/mp4" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/closingAfter6dark.mp4?_=1" /><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/closingAfter6dark.mp4">https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/closingAfter6dark.mp4</a></video></div>
<p style="text-align: center"><em>Closing the curtains after 6:00PM and dark</em></p>
<div style="width: 368px;" class="wp-video"><video class="wp-video-shortcode" id="video-1601-2" width="368" height="656" preload="metadata" controls="controls"><source type="video/mp4" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/setSleepTimeopenfan.mp4?_=2" /><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/setSleepTimeopenfan.mp4">https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/setSleepTimeopenfan.mp4</a></video></div>
<p><em>Setting the time went to bed, opening curtains, and blowing the fan.</em></p>
<p>You might notice that in this video, the printing format changed from day, month, year to month, day, year. This was an intentional change after the first video because it&#8217;s the format we are accustomed to.</p>
<figure id="attachment_1634" aria-describedby="caption-attachment-1634" style="width: 840px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-1634 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit-1024x567.jpg" alt="" width="840" height="465" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit-1024x567.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit-300x166.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit-768x425.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit-1200x664.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kinetic-crit-circuit.jpg 1424w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-1634" class="wp-caption-text">Circuit</figcaption></figure>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;AccelStepper.h&gt;

// stepper Motor pin definitions:
#define motorPin1  9      // IN1 on the ULN2003 driver
#define motorPin2  10      // IN2 on the ULN2003 driver
#define motorPin3  11     // IN3 on the ULN2003 driver
#define motorPin4  12     // IN4 on the ULN2003 driver

// Define the AccelStepper interface type; 4 wire motor in half step mode:
#define MotorInterfaceType 8

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper library with 28BYJ-48 stepper motor:
AccelStepper stepper = AccelStepper(MotorInterfaceType, motorPin1, motorPin3, motorPin2, motorPin4);
//above from  https://www.makerguides.com to learn how to use this specific stepper motor and driver

#include &lt;Wire.h&gt;
#include &lt;RTC.h&gt;
const int photoPin = A5;
static DS3231 RTC;

//input times for each day with hr then min; 24 hr time but as it'll be morning, it shouldn't make too much of a difference
int wakeUpTimes[7][2] ={{12, 12}, //sun
                        {9, 0}, //mon
                        {9, 35}, //tues
                        {8, 55}, //wed
                        {9, 30}, //thurs
                        {10, 10}, //fri
                        {11, 11}};//sat

const int fanMotorPin = 3;
int low = 50;
int high = 150;
int fanSpeed;
int turnOnFan;
int fanDuration;

int timeSlept[3];
int openCurtainsXbeforeWakeUpTime;
int sleep = 0;
const int buttonPin = 2;

int timeWentToBed[3];

void calcTimeSlept() {
  //seconds
  int secs = 60 - timeWentToBed[0];
  if (secs == 60) {
    timeSlept[2] = 0;
  }
  else {
    timeSlept[2] = secs;
  }

  //mins
  if (wakeUpTimes[RTC.getWeek() - 1][1] &gt;= timeWentToBed[1]) {
    if (timeSlept[2] == 0) {
      timeSlept[1] = wakeUpTimes[RTC.getWeek() - 1][1] - timeWentToBed[1];
    }
    else {
      timeSlept[1] = wakeUpTimes[RTC.getWeek() - 1][1] - timeWentToBed[1] - 1;
    }
  }
  else {
    if (timeSlept[2] == 0) {
      timeSlept[1] = wakeUpTimes[RTC.getWeek() - 1][1] + 60 - timeWentToBed[1];
    }
    else {
      timeSlept[1] = wakeUpTimes[RTC.getWeek() - 1][1] + 60 - timeWentToBed[1] - 1;
    }
  }

  //hrs
  if (timeWentToBed[0] &lt; 12) {
    if (wakeUpTimes[RTC.getWeek() - 1][1] &gt;= timeWentToBed[1]) {
      timeSlept[0] = wakeUpTimes[RTC.getWeek() - 1][0] - timeWentToBed[0];
    }
    else {
      timeSlept[0] = wakeUpTimes[RTC.getWeek() - 1][0] - timeWentToBed[0] - 1;
    }
  }
  else { //if went to bed before midnight, need to add hours bc subtraction not right otherwise
    int hrsBeforeMidnight = 24 - timeWentToBed[0];
    if (wakeUpTimes[RTC.getWeek() - 1][1] &gt;= timeWentToBed[1]) {
      timeSlept[0] = wakeUpTimes[RTC.getWeek() - 1][0] + hrsBeforeMidnight;
    }
    else {
      timeSlept[0] = wakeUpTimes[RTC.getWeek() - 1][0] + hrsBeforeMidnight - 1;
    }
  }
}

void goinToSleep() {
  if (digitalRead(buttonPin) == HIGH) {
    sleep = 1;
  }
}

void openCurtains() {
  while (stepper.currentPosition() != 4096 * 7) { //choosing this bc it was enough rev to at least show some opening
    stepper.setSpeed(1000);
    stepper.runSpeed();
  }
}
void closeCurtains() {
  while (stepper.currentPosition() != 0) {
    stepper.setSpeed(-1000);
    stepper.runSpeed();
  }
}

void setup() {
  // put your setup code here, to run once:
  stepper.setMaxSpeed(1000);
  Serial.begin(9600);
  RTC.begin();

  RTC.setDay(16);
  RTC.setMonth(10);
  RTC.setYear(2020);

  RTC.setWeek(6);

//to show setting time went to bed from button for Fri
  RTC.setHours(10);
  RTC.setMinutes(8);
  RTC.setSeconds(0);
  
//to show fan turning on when not enough sleep for Mon
//  RTC.setHours(8);
//  RTC.setMinutes(59);
//  RTC.setSeconds(30);

////to show closing:
//  stepper.setCurrentPosition(4096 * 7);
  
  //to show curtains closing past 5 and dark
//  RTC.setHours(17);
//  RTC.setMinutes(59);
//  RTC.setSeconds(45);
  
//to show opening:
    stepper.setCurrentPosition(0);
  //to show curtain opening:
//  RTC.setHours(8);
//  RTC.setMinutes(49);
//  RTC.setSeconds(58);

  RTC.setHourMode(CLOCK_H24);

  pinMode(fanMotorPin, OUTPUT);

  attachInterrupt (digitalPinToInterrupt (buttonPin), goinToSleep, HIGH);

  /*set time went to bed to hr before wakeup as default after woken up
        will change if/when press button before going to sleep
        this way if you forget still get this, and assuming if didn't press,
        you went to bed really late
  */
  //commenting out for demo of button to set time went to bed
  timeWentToBed[0] = wakeUpTimes[RTC.getWeek() - 1][0] - 1;
  timeWentToBed[1] = wakeUpTimes[RTC.getWeek() - 1][1];
  timeWentToBed[2] = 0;
}

void loop() {
  int  photoVal = analogRead(photoPin);
  //Serial.println(photoVal);
  if (RTC.getHours() &gt;= 18) {//6:00PM
    if (photoVal &lt; 600) {
      //if it's past 6PM and dark(here just chose 600, but would be lower in real thing), close curtains
      closeCurtains();
    }
  }
  if (sleep == 1) {
    Serial.println("clicked");
    timeWentToBed[0] = RTC.getHours();
    timeWentToBed[1] = RTC.getMinutes();
    timeWentToBed[2] = RTC.getSeconds();
    calcTimeSlept();
    sleep = 0;
  }
  if (timeSlept[0] &gt;= 8) {
    openCurtainsXbeforeWakeUpTime = 5; //mins
  }
  else if (6 &lt;= timeSlept[0] &amp;&amp; timeSlept[0] &lt; 8) {
    openCurtainsXbeforeWakeUpTime = 30; //mins
  }
  else if (5 &lt;= timeSlept[0] &amp;&amp; timeSlept[0] &lt; 6) {
    openCurtainsXbeforeWakeUpTime = 45; //mins
    turnOnFan = 1;
    fanSpeed = high;
    fanDuration = 30;
  }
  else {//under 5 hrs
    //for demo
    //openCurtainsXbeforeWakeUpTime = 1; //mins
    openCurtainsXbeforeWakeUpTime = 55; //mins
    turnOnFan = 1;
    fanSpeed = low;
    fanDuration = 60;
  }
  if (wakeUpTimes[RTC.getWeek() - 1][1] &gt;= openCurtainsXbeforeWakeUpTime) {
    if (RTC.getHours() == wakeUpTimes[RTC.getWeek() - 1][0]) {
//Serial.println(openCurtainsXbeforeWakeUpTime);
        //Serial.println((wakeUpTimes[RTC.getWeek() - 1][1] - openCurtainsXbeforeWakeUpTime));
      if (RTC.getMinutes() == (wakeUpTimes[RTC.getWeek() - 1][1] - openCurtainsXbeforeWakeUpTime)) {
        openCurtains();
        timeWentToBed[0] = wakeUpTimes[RTC.getWeek() - 1][0] - 1;
        timeWentToBed[1] = wakeUpTimes[RTC.getWeek() - 1][1];
        timeWentToBed[2] = 0;
      }
    }
  }
  else {//minutes of wakeUpTime&lt;time to subtract to wake up
    if (RTC.getHours() == (wakeUpTimes[RTC.getWeek() - 1][0] - 1)) { //took hr off here
      //right side of eq subtracted amount of time left after changing hr
      if (RTC.getMinutes() == (60 - openCurtainsXbeforeWakeUpTime + wakeUpTimes[RTC.getWeek() - 1][1])) {
        openCurtains();
        timeWentToBed[0] = wakeUpTimes[RTC.getWeek() - 1][0] - 1;
        timeWentToBed[1] = wakeUpTimes[RTC.getWeek() - 1][1];
        timeWentToBed[2] = 0;
      }
    }
  }
  
  if (RTC.getHours() == wakeUpTimes[RTC.getWeek() - 1][0]) {
    if (RTC.getMinutes() == wakeUpTimes[RTC.getWeek() - 1][1]) {
      //Serial.println(RTC.getSeconds());
      if (turnOnFan) {
        if (RTC.getSeconds() &lt;= fanDuration) {
          //Serial.println(RTC.getSeconds());
          analogWrite(fanMotorPin, fanSpeed);
        }
        else {
                    analogWrite(fanMotorPin, 0);
          turnOnFan = 0;        
          }
      }

    }
  }
  static int startPrint=millis();
  if ((millis()-startPrint)&gt;=1000){//putting this here so don't use delay while also showing the times
   switch (RTC.getWeek())
    {
      case 1:
        Serial.print("SUN");
        break;
      case 2:
        Serial.print("MON");
        break;
      case 3:
        Serial.print("TUE");
        break;
      case 4:
        Serial.print("WED");
        break;
      case 5:
        Serial.print("THU");
        break;
      case 6:
        Serial.print("FRI");
        break;
      case 7:
        Serial.print("SAT");
        break;
    }
    Serial.print(" ");
    Serial.print(RTC.getMonth());
    Serial.print("-");
    Serial.print(RTC.getDay());
    Serial.print("-");
    Serial.print(RTC.getYear());
  
    Serial.print(" ");
  
    Serial.print(RTC.getHours());
    Serial.print(":");
    Serial.print(RTC.getMinutes());
    Serial.print(":");
    Serial.println(RTC.getSeconds());

    startPrint=millis();
  }
  //  delay(1000);
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1601</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/closingAfter6dark.mp4" length="4490978" type="video/mp4" />
<enclosure url="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/setSleepTimeopenfan.mp4" length="14909719" type="video/mp4" />

			</item>
		<item>
		<title>Attention during online meetings</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1567</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1567#respond</comments>
		
		<dc:creator><![CDATA[srng@andrew.cmu.edu]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 22:50:53 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1567</guid>

					<description><![CDATA[Problem: As we transition into a working from home setup during covid, we lose alot of the immediate feedback through body language and facial cues from people we are communicating with. In particular, this is pronounced in a presenting information to a large group of people, where a successful presentation relies on tailoring the speed, &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1567" class="more-link">Continue reading<span class="screen-reader-text"> "Attention during online meetings"</span></a>]]></description>
										<content:encoded><![CDATA[<p><strong>Problem:</strong><br />
As we transition into a working from home setup during covid, we lose alot of the immediate feedback through body language and facial cues from people we are communicating with. In particular, this is pronounced in a presenting information to a large group of people, where a successful presentation relies on tailoring the speed, complexity and cadence to engage the audience sufficiently to keep them interested, but not go too fast that you leave them behind.</p>
<p>When presenting a deck through online meeting platforms, presenters are often unable to monitor the real-time vibe of the audience since participants are not always visible due to screen real-estate (assuming that they have their cameras on). Even with the hand-raise feature, it&#8217;s hard for presenters to respond to questions in a timely manner.</p>
<p><strong>Solution:</strong><br />
I identified two main modes of feedback that are most important to a presenter:</p>
<ol>
<li style="list-style-type: none">
<ol>
<li>Are there any questions?</li>
<li>Are people paying attention?</li>
</ol>
</li>
</ol>
<p><strong>Raising your hand</strong><br />
To indicate if the audience has any questions, I used a servo as a physical indicator of the presence of questions. Typically, when participants raise their hands during a meeting virtually, this is missed. By mapping this state to the servo, presenters now have a better understanding of when exactly questions are being raised.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1576" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/servo1hand.gif" alt="" width="600" height="338" /></p>
<p><strong>Paying attention</strong><br />
One of the indicators of restlessness in your audience is fidgeting. If people are bored and unable to pay attention, they are likely to be crossing their arms, rearranging their seating posture, etc. We can monitor this by observing the rate of change in their posture. Using the <a href="https://editor.p5js.org/kylemcdonald/sketches/H1OoUd9h7">poseNet</a> in p5.js, we can abstract this information by drawing keypoints of your posture in the webcam and do a comparison.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1583" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/poseNet.gif" alt="" width="600" height="627" /></p>
<p>I wasn&#8217;t quite able to get the serial output from p5.js to work, so I replaced it with a potentiometer as an abstraction for the demo <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><strong>Kinetic feedback</strong><br />
By translating this to a tapping pattern if the changes exceed a particular threshold, presenters are able to understand when their audience get restless.</p>
<p>It is hard to discern the nuances if the tapping pattern were to change incrementally, so I set up 3 states with a threshold rate of change that matches 3 different tapping states.</p>
<p><strong>1 No need to worry</strong><br />
Some movement is to be expected in the audience, so presenters don&#8217;t need to be concerned about a non-zero level of movement.</p>
<p><strong>2 Antsy</strong><br />
When the audience starts getting restless, the tapping starts with a lower frequency. The presenter can quickly re-engage the audience by speeding up and moving on. As the audience returns back to normal and pays attention, the tapping should cease.</p>
<p><img loading="lazy" class="alignnone size-full wp-image-1587" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/2antsy.gif" alt="" width="600" height="338" /></p>
<p><strong>3 I can&#8217;t stand this anymore</strong><br />
If the audience crosses the second threshold indicating restlessness, the frequency of taps doubles and conveys to the presenter that they should try to wrap up the presentation ASAP since they&#8217;ve likely already lost their audience.<br />
<img loading="lazy" class="alignnone size-full wp-image-1598" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3nomore.gif" alt="" width="600" height="338" /></p>
<p>Schematic<br />
<img loading="lazy" class="alignnone size-large wp-image-1604" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-1024x811.png" alt="" width="840" height="665" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-1024x811.png 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-300x238.png 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-768x608.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-1536x1216.png 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit-1200x950.png 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/kineticCrit.png 1860w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1567</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Portable RehabActuators</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1569</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1569#respond</comments>
		
		<dc:creator><![CDATA[mvlachos@andrew.cmu.edu]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 20:41:01 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1569</guid>

					<description><![CDATA[PROBLEM: People experiencing finger -specific motor disabilities are often asked to participate in rehabilitation sessions, either within clinical settings or at home. Unfortunately, a lot of them (including me) do not execute the instructed exercises for finger strengthening and as a result their traumatised fingers may not fully recover back to their original potential. SOLUTION: &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1569" class="more-link">Continue reading<span class="screen-reader-text"> "Portable RehabActuators"</span></a>]]></description>
										<content:encoded><![CDATA[<p style="text-align: left"><img loading="lazy" class="aligncenter wp-image-1570 size-full" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/2-1.jpg" alt="" width="662" height="479" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/2-1.jpg 662w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/2-1-300x217.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></p>
<p><strong>PROBLEM:</strong> People experiencing finger -specific motor disabilities are often asked to participate in rehabilitation sessions, either within clinical settings or at home. Unfortunately, a lot of them (including me) do not execute the instructed exercises for finger strengthening and as a result their traumatised fingers may not fully recover back to their original potential.</p>
<p><strong>SOLUTION: </strong>RehabActuators constitute a portable, soft robotic wearable that exploits tangible interaction to motivate patients to execute finger exercises like bending/unbending. RehabActuators turns rehabilitation into a playful activity, where the participant can manipulate its own finger by using interacting with the interface.</p>
<p style="text-align: left"><strong>Computational Logic:</strong></p>
<p><img loading="lazy" class="wp-image-1571 size-full aligncenter" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-scaled.jpg" alt="" width="2560" height="1132" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-scaled.jpg 2560w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-300x133.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-1024x453.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-768x340.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-1536x679.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-2048x906.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/1-1-1200x531.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p style="text-align: left"><strong>Told Design &amp; Fabrication: </strong></p>
<p><img loading="lazy" class="aligncenter wp-image-1580 size-full" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-scaled.jpg" alt="" width="2560" height="919" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-scaled.jpg 2560w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-300x108.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-1024x368.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-768x276.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-1536x551.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-2048x735.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/3-1200x431.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p><img loading="lazy" class="wp-image-1572 size-full aligncenter" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-scaled.jpg" alt="" width="2560" height="1152" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-scaled.jpg 2560w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-300x135.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-1024x461.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-768x346.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-1536x691.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-2048x922.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/4-1200x540.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p style="text-align: left"><strong>Mechanism Overview:</strong></p>
<p><img loading="lazy" class="wp-image-1581 size-full aligncenter" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5.jpg" alt="" width="1874" height="1042" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5.jpg 1874w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5-300x167.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5-1024x569.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5-768x427.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5-1536x854.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/5-1200x667.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p style="text-align: left"><strong>Control Manipulation:</strong></p>
<p><img loading="lazy" class="wp-image-1582 size-full aligncenter" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6.jpg" alt="" width="1784" height="1472" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6.jpg 1784w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6-300x248.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6-1024x845.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6-768x634.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6-1536x1267.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/6-1200x990.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p style="text-align: left"><strong>Interaction Demonstration: <a href="https://drive.google.com/drive/folders/1ldiV7o1EZ_QfcC9cEiDaGpcplat2HtpA?usp=sharing">https://drive.google.com/drive/folders/1ldiV7o1EZ_QfcC9cEiDaGpcplat2HtpA?usp=sharing </a></strong></p>
<p><strong>Arduino + Motor Shield REV3</strong></p>
<p><img loading="lazy" class="alignnone wp-image-1795 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-1024x406.jpg" alt="" width="840" height="333" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-1024x406.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-300x119.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-768x304.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-1536x609.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1-1200x476.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/a-1.jpg 1605w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p><strong>Arduino Wiring: </strong></p>
<p><strong>-Copper tape </strong>for the two capacitive sensors</p>
<p><strong>-Peristaltic liquid pump</strong></p>
<p><img loading="lazy" class="alignnone wp-image-1796 size-full" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch.jpg" alt="" width="2208" height="1758" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch.jpg 2208w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-300x239.jpg 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-1024x815.jpg 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-768x611.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-1536x1223.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-2048x1631.jpg 2048w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/sketch-1200x955.jpg 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></p>
<p><strong>Arduino Code:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp"># include &lt;CapacitiveSensor.h&gt;

// Capacitive Sensors
CapacitiveSensor csLeft = CapacitiveSensor(6, 7);
bool csLeftTouched = true;
long csLeftVal;

CapacitiveSensor csRight = CapacitiveSensor(6, 5);
bool csRightTouched = true;
long csRightVal;

// water pump
const int pumpPin = 13; const int speedPin = 11; const int brakePin = 8;
const int cw = HIGH;
const int ccw = LOW;

void setup() {
  //Serial.begin(9600);
  pinMode(pumpPin, OUTPUT); pinMode(speedPin, OUTPUT); pinMode(brakePin, OUTPUT);

}

void loop() {

  capacitiveSensorLeft();
  capacitiveSensorRight();
  activatePump();

}

void capacitiveSensorLeft() {

  csLeftVal = csLeft.capacitiveSensor(80); // 80: resolution
  if (csLeftVal &gt; 1000) {
    csLeftTouched = true;
    //Serial.println("left on");
  } else if (csLeftVal &lt; 100) {
    csLeftTouched = false;
    //Serial.println("left off");
  }
}

void capacitiveSensorRight() {

  csRightVal = csRight.capacitiveSensor(80); // resolution
  if (csRightVal &gt; 1000) {
    csRightTouched = true;
    //Serial.println("right on");
  } else if (csRightVal &lt; 100) {
    csRightTouched = false;
    //Serial.println("right off");
  }

}

void activatePump() {

  while (csRightTouched == false &amp;&amp; csLeftTouched == false) {
    digitalWrite(brakePin, HIGH);
  }

  while (csRightTouched == true &amp;&amp; csLeftTouched == false) {
    digitalWrite(brakePin, LOW);
    digitalWrite(pumpPin, cw);
    analogWrite(speedPin, 200); // 200 is the rotation speed
  }

  while (csRightTouched == false &amp;&amp; csLeftTouched == true) {
    digitalWrite(brakePin, LOW);
    digitalWrite(pumpPin, ccw);
    analogWrite(speedPin, 200); // 200 is the rotation speed
  }

}</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1569</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Smart Curtain</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1561</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1561#respond</comments>
		
		<dc:creator><![CDATA[tianhony@andrew.cmu.edu]]></dc:creator>
		<pubDate>Thu, 15 Oct 2020 17:29:23 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1561</guid>

					<description><![CDATA[At the beginning of the semester, Chloe had an idea for an alarm clock that wakes people up through lights rather than sounds. I then bought an alarm clock, sunrise alarm clock, that has a similar functionality, and it has been great. Then I thought, well instead of using artificial lights, why can&#8217;t we use &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1561" class="more-link">Continue reading<span class="screen-reader-text"> "Smart Curtain"</span></a>]]></description>
										<content:encoded><![CDATA[<p>At the beginning of the semester, Chloe had an idea for an alarm clock that wakes people up through lights rather than sounds. I then bought <a href="https://www.amazon.com/Wake-Up-Light-Sunrise-Alarm-Clock/dp/B07ZF5X3KQ/ref=sr_1_8?crid=25HU9L4RKM479&amp;dchild=1&amp;keywords=alarm+clock+light+wake+up&amp;qid=1602780620&amp;sprefix=alarm+clock+light%2Cinstant-video%2C407&amp;sr=8-8">an alarm clock, sunrise alarm clock,</a> that has a similar functionality, and it has been great. Then I thought, well instead of using artificial lights, why can&#8217;t we use natural lights? (Of course natural light would not work if you are waking up in the middle of the night).</p>
<figure id="attachment_1562" aria-describedby="caption-attachment-1562" style="width: 341px" class="wp-caption alignright"><img loading="lazy" class="wp-image-1562 " src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-768x1024.jpg" alt="" width="341" height="455" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-768x1024.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-225x300.jpg 225w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-1152x1536.jpg 1152w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-1536x2048.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-1200x1600.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3235-scaled.jpg 1920w" sizes="(max-width: 341px) 85vw, 341px" /><figcaption id="caption-attachment-1562" class="wp-caption-text">sketches</figcaption></figure>
<p>I then came up with this idea of a<strong> smart curtain</strong> that is basically a reverse sunrise alarm clock. It serves as an <em>&#8220;alarm clock&#8221;</em> as it opens and lets lights in at the time you set. I also added a <em>natural light mode</em>: curtains are closed when the sun is down, and the curtain is opened when the sun is up. Houses/apartments in China are much closer to one another than ones in the US, so you have to close your curtains at night. But I rely on the lights to help me wake up in the morning, so ever since I came back home in China, my mom has been yelling at me to close my curtains completely every other night.</p>
<figure id="attachment_1558" aria-describedby="caption-attachment-1558" style="width: 1569px" class="wp-caption alignnone"><img loading="lazy" class="wp-image-1558 size-full" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa.png" alt="" width="1569" height="849" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa.png 1569w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa-300x162.png 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa-1024x554.png 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa-768x416.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa-1536x831.png 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Fabulous-Waasa-1200x649.png 1200w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /><figcaption id="caption-attachment-1558" class="wp-caption-text">schematic</figcaption></figure>
<p>I don&#8217;t have access to a linear stepper motor, nor a time module. So I used a servo motor to show the actions of opening and closing the curtains, and hardcoded the current time.</p>
<p>In addition, I used a <strong>potentiometer</strong> to adjust time, and I kept on getting connection issues with the potentiometer to have consistent readings. I used a <strong>push button</strong> to change mode, a <strong>photo cell</strong> to detect day/night(in practice, this photo cell needs to be placed such that only outdoor lightings are sensed but not indoor lightings), and an <strong>LCD</strong> to display mode and time.</p>
<figure id="attachment_1560" aria-describedby="caption-attachment-1560" style="width: 258px" class="wp-caption alignleft"><img loading="lazy" class="wp-image-1560 " src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-225x300.jpg" alt="" width="258" height="344" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-225x300.jpg 225w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-768x1024.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-1152x1536.jpg 1152w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-1536x2048.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-1200x1600.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3234-scaled.jpg 1920w" sizes="(max-width: 258px) 85vw, 258px" /><figcaption id="caption-attachment-1560" class="wp-caption-text">the beautiful curtain(wet wipe)</figcaption></figure>
<p><img loading="lazy" class=" wp-image-1559 alignleft" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-225x300.jpg" alt="" width="262" height="348" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-225x300.jpg 225w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-768x1024.jpg 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-1152x1536.jpg 1152w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-1536x2048.jpg 1536w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-1200x1600.jpg 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3233-scaled.jpg 1920w" sizes="(max-width: 262px) 85vw, 262px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="width: 840px;" class="wp-video"><video class="wp-video-shortcode" id="video-1561-3" width="840" height="473" preload="metadata" controls="controls"><source type="video/mp4" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3232-1.mp4?_=3" /><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3232-1.mp4">https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3232-1.mp4</a></video></div>
<p>This smart curtain can be improved in some ways. In alarm mode, the curtain could be slowly opening instead of opening at once, to fake the effect of sunrise. Like the sunrise alarm clock that can be controlled by smart phones, smart curtain should do that too and maybe even integrate with a traditional alarm system, i.e. slowly opens up at curtain and then alarm rings.</p>
<p>Code:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="c">#include &lt;LiquidCrystal.h&gt;
#include &lt;Servo.h&gt;

LiquidCrystal lcd = LiquidCrystal(7,6,5,4,3,2);
Servo myservo;
const int POTPIN = A1;
const int BUTTONPIN = 13;
const int PHOTOPIN = A0;
const int SERVOPIN = 9;
const int PHOTOTHRESH = 300;


bool isAlarm = true;
bool isOpen = false;
int clockTime = 0; // used for demo purpose
long long lastLCDTime = 0; 
long long LCDinterval = 100;
long long lastDebounceTime = 0;  
long long debounceDelay = 50; 


void openCurtain() {
  for (int pos = 89; pos &gt; 0; pos -= 1) {
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  isOpen = true;
}

void closeCurtain() {
  for (int pos = 0; pos &lt; 90; pos += 1) {
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  isOpen = false;
}

void updateLCD(long long currTime, int h, int m, bool isAlarm) {
  if (currTime - lastLCDTime &gt; LCDinterval) {
    lcd.clear();
    lcd.setCursor(2, 0);
    String mode = isAlarm ? "alarm" : "natural";
    lcd.setCursor(2, 1);
    lastLCDTime = currTime;
  }
}

void setup() {
  lcd.begin(16, 2);
  analogWrite(A5, 40);
  myservo.attach(SERVOPIN);
  myservo.write(0);
  pinMode(BUTTONPIN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  // read button
  long long currTime = millis();
  if (currTime-lastDebounceTime&gt;debounceDelay) {
    if (digitalRead(BUTTONPIN) == 0) {
        isAlarm = !isAlarm;
    }
    lastDebounceTime = currTime;
  }

  // read potentiometer
  int potVal = analogRead(POTPIN);
  int potTime = potVal/(1023.0/(24.0*60.0));
  int h = potTime/60;
  int m = potTime%60;

  // read photo resistor
  int photoVal = analogRead(PHOTOPIN);

  updateLCD(currTime, h, m, isAlarm);
  if ((!isAlarm) &amp;&amp; (!isOpen) &amp;&amp; (photoVal&gt;PHOTOTHRESH)) {
    openCurtain();
  }
  else if (isAlarm &amp;&amp; (!isOpen) &amp;&amp; (potTime==clockTime)) {
    openCurtain();
  }
  else if (isOpen &amp;&amp; (photoVal&lt;PHOTOTHRESH)) {
    closeCurtain();
  }
  
}</pre>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1561</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/IMG_3232-1.mp4" length="7001876" type="video/mp4" />

			</item>
		<item>
		<title>I&#8217;m your fan</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1544</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1544#respond</comments>
		
		<dc:creator><![CDATA[kyungsec@andrew.cmu.edu]]></dc:creator>
		<pubDate>Wed, 14 Oct 2020 06:23:29 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1544</guid>

					<description><![CDATA[To an artist, one&#8217;s respiratory health is one of the priorities. Spray paint, paint fume, melting plastic&#8230; even with a mask on, the fume still enters my lungs. Right now, being able to work on my projects from home, I had to make a compromise with my parents and trade my ventilation with an at-home &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1544" class="more-link">Continue reading<span class="screen-reader-text"> "I&#8217;m your fan"</span></a>]]></description>
										<content:encoded><![CDATA[<figure id="attachment_1549" aria-describedby="caption-attachment-1549" style="width: 798px" class="wp-caption alignnone"><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM.png"><img loading="lazy" class="wp-image-1549 size-large" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM-798x1024.png" alt="" width="798" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM-798x1024.png 798w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM-234x300.png 234w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM-768x986.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.15-PM.png 1064w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a><figcaption id="caption-attachment-1549" class="wp-caption-text">In counter-clockwise order, a fan, accelerometer, gas detector, and a PIR sensor.</figcaption></figure>
<p>To an artist, one&#8217;s respiratory health is one of the priorities. Spray paint, paint fume, melting plastic&#8230; even with a mask on, the fume still enters my lungs. Right now, being able to work on my projects from home, I had to make a compromise with my parents and trade my ventilation with an at-home studio. The room has no windows other than a door. However, to have a fan in the room, the foam particles will fly everywhere and stick to my sculptures or get into my eyes, which is not an ideal situation. But just leaving a door open doesn&#8217;t do much to ventilation either.</p>
<p>Therefore, I came up with a fan that interacts with my presence, action, and the gas level.</p>
<p>Video demonstration:</p>
<p><a href="https://drive.google.com/file/d/1VG5g9sS6BtFTEqqUuGJY6JN5LMpSzvyK/view?usp=sharing">https://drive.google.com/file/d/1VG5g9sS6BtFTEqqUuGJY6JN5LMpSzvyK/view?usp=sharing</a></p>
<p>If people had a hard time understanding since I was struggling to talk, film, move an accelerometer, and light a candle all at the same time, basically the fan works in this way:</p>
<p>Fan gets activated:</p>
<ul>
<li>when it detects no movement in the room and the doorknob was pulled</li>
<li>when the toxic gas level (flamable gas) is too high in the room, no matter of my presence in the room.</li>
</ul>
<p>Fan is off when:</p>
<ul>
<li>when it detects a movement in the room with a low gas level</li>
</ul>
<p>Now it is time to get real.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The first demonstration is activating the fan with no movement and the door knob.</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1552" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM-776x1024.png" alt="" width="776" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM-776x1024.png 776w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM-227x300.png 227w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM-768x1014.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.51-PM.png 1074w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>So this is my dusty, non ventilated studio. Since I am moving in the room, the fan is off.</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1551" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-776x1024.png" alt="" width="776" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-776x1024.png 776w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-227x300.png 227w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-768x1013.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM.png 1072w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>Currently, there is a movement detected in the PIR sensor, so the fan is off.</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1548" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM-835x1024.png" alt="" width="835" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM-835x1024.png 835w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM-244x300.png 244w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM-768x942.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.04-PM.png 1066w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>So I opened the door, AKA activated the accelerometer.</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1553" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM-804x1024.png" alt="" width="804" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM-804x1024.png 804w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM-235x300.png 235w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM-768x978.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.56.05-PM.png 1080w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>The fan turns on and ventilates the room.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Now it&#8217;s time to test the flamable gas detecting interaction.<a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM.png"><br />
<img loading="lazy" class="alignnone size-large wp-image-1551" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-776x1024.png" alt="" width="776" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-776x1024.png 776w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-227x300.png 227w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM-768x1013.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.39-PM.png 1072w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>Now I am in the room again, and moved infront of the PIR sensor. The fan is off.</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1546" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM-1024x916.png" alt="" width="840" height="751" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM-1024x916.png 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM-300x268.png 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM-768x687.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.54.32-PM.png 1028w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>I give the toxic gas detector (flamable gas detector) a whiff of my spray foam,</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM.png"><img loading="lazy" class="alignnone size-large wp-image-1550" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM-773x1024.png" alt="" width="773" height="1024" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM-773x1024.png 773w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM-227x300.png 227w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM-768x1017.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/Screen-Shot-2020-10-14-at-2.55.25-PM.png 1068w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px" /></a></p>
<p>The fan turns on, even though there is movement detected in the room.</p>
<p>&nbsp;</p>
<p>&lt;Schematics&gt;</p>
<p><a href="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad.png"><img loading="lazy" class="alignnone size-large wp-image-1554" src="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad-1024x598.png" alt="" width="840" height="491" srcset="https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad-1024x598.png 1024w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad-300x175.png 300w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad-768x449.png 768w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad-1200x701.png 1200w, https://courses.ideate.cmu.edu/48-339/f2020/wp-content/uploads/2020/10/tinkercad.png 1468w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px" /></a></p>
<p>&lt;Code&gt;</p>
<pre>int GasPin = A0;
int PIR = 7;
int motorPin = 8;
int Ypin = A1;


int yVal;
int oldY;
int dif;

void setup()
{
pinMode(GasPin, INPUT);
pinMode(PIR, INPUT); 
pinMode(Ypin, INPUT);
pinMode(motorPin, OUTPUT);
Serial.begin(9600);
analogWrite(motorPin, 0);
}
void loop()
{
oldY= yVal;
yVal = analogRead(Ypin);
dif = abs(oldY - yVal);
// delay(250);
//Serial.println(dif);


if (digitalRead(PIR) == LOW &amp;&amp; dif&gt;5){ 

/*Serial.println(dif);
Serial.println("PIR OFF");
Serial.println(analogRead(GasPin));
Serial.println();
delay(1000);*/
analogWrite(motorPin, 255);
}
if(digitalRead(PIR) == HIGH){
/*Serial.println(dif);
Serial.println("PIR: ON");
Serial.println(analogRead(GasPin));
Serial.println();
delay(1000);*/
analogWrite(motorPin, 0);
//delay(4000);
}
if(analogRead(GasPin) &gt; 330){
/*Serial.println(analogRead(GasPin));
Serial.println("PIR: ON");
delay(1000);*/
analogWrite(motorPin, 255);
//delay(4000);
}
}</pre>
<p>&lt;Reflection&gt;</p>
<p>Hardships:</p>
<ul>
<li>initially I had an LCD display, yet for some reason it was glitching not by itself, but also making the whole arduino glitch, and even my computer. The wiring was correct and everything, and that gave me a hardship of setting the range of gas level, because the serial monitor was already showing so many values from different sensors.</li>
<li>the both ground and vcc wire of my fan got detached. I didn&#8217;t have soldering equipments or anything so I took a knife and peeled some of the wire and used a piece of tape to hold them together.</li>
</ul>
<p>For future:</p>
<ul>
<li>Buy a bigger fan and actually use it.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1544</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kinetic Crit</title>
		<link>https://courses.ideate.cmu.edu/48-339/f2020/?p=1541</link>
					<comments>https://courses.ideate.cmu.edu/48-339/f2020/?p=1541#respond</comments>
		
		<dc:creator><![CDATA[Jet Townsend]]></dc:creator>
		<pubDate>Fri, 09 Oct 2020 01:28:06 +0000</pubDate>
				<category><![CDATA[Crit 2: Kinetic]]></category>
		<guid isPermaLink="false">https://courses.ideate.cmu.edu/48-339/f2020/?p=1541</guid>

					<description><![CDATA[Kinetic Crit, due 15 Oct 2020 Note: 13 Oct is a work day in A10, I will be on zoom if anyone has questions. Requirements Combine inputs, kinetic outputs, and state machines to create a physically interactive system that changes interaction based on inputs and logic a person cannot perceive.  That is, information we can’t &#8230; <a href="https://courses.ideate.cmu.edu/48-339/f2020/?p=1541" class="more-link">Continue reading<span class="screen-reader-text"> "Kinetic Crit"</span></a>]]></description>
										<content:encoded><![CDATA[<h2>Kinetic Crit, due 15 Oct 2020</h2>
<p>Note: 13 Oct is a work day in A10, I will be on zoom if anyone has questions.</p>
<h2>Requirements</h2>
<p>Combine inputs, kinetic outputs, and state machines to create a physically interactive system that changes interaction based on inputs and logic a person cannot perceive.  That is, information we can’t see, or we cannot see visible information.</p>
<h3>Doorbell example</h3>
<p>One example I gave early this semester was a “doorbell” for someone who cannot hear.</p>
<p>Inputs: doorbell, physical knock, person detector</p>
<p>Interaction: use inputs to determine output.  Doorbell + no person detected means someone rang the bell and walked away, was this a UPS/FedEx delivery?  Knock and person is there, is someone coming to visit?  To sell a product?  “Secret” knock pattern used by friends and a person is there, one of your friends has come to visit.</p>
<p>Output: Create appropriate output for the results of the interaction process.  UPS/FedEx drop off is lower priority than a friend coming for a visit.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://courses.ideate.cmu.edu/48-339/f2020/?feed=rss2&#038;p=1541</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
