Light Whispering

Made by ctchau, Ruoxi Xie and Chang Liu

The light interacts with people who enter the haunted room, creating different experiences and emotions through its unique language. The project seeks to create an immersive space where outsiders can engage with the light and have varying encounters. When people are outside the space, the lights whisper to each other, and when people are inside the space, the lights remain silent. They are curious about your presence and will capture your attention.

Created: May 9th, 2023

0

Title:

Light Whispering

0

Credit:

This is the final project for the Ideate course "Responsive Mobile Environment - Spooky Technology," instructed by Daragh Byrne. This project is a collaborative effort between Ruoxi Xie, Chang Liu, and Tsz Wing Clover Chau. 

We extend our sincere appreciation to Professor Daragh Byrne for his guidance and expertise throughout the project, and to Zhenfang, our teaching assistant, for their invaluable support and assistance.

0

Description:

Have you ever imagined the lights in your room communicating with each other in your absence? Have you ever considered that they may possess unique personalities, such as shyness, sleepiness, or even a propensity towards anger?

The goal of this project is to create an immersive environment that enables individuals to perceive the interaction among various lights. When individuals are outside the space, the lights engage in whispered dialogue using the language of Morse code. Upon entering the space, the lights remain silent, giving the impression of a typical dining room. However, the lights become increasingly curious about human presence and will capture their attention. Interacting with one light can trigger the flashing of others, creating a captivating experience. However, attempting to wake all of the lights will result in their anger. Join us in exploring the fascinating world of the lights that envelop us!

Light I:

The desk lamp on the dining table is a highly inquisitive light. When it detects human presence, it behaves like any other ordinary light in a typical dining space. However, if ignored, it gradually illuminates, enticing people to engage with it.

Light II:

The hanging flashlight along the curtain is a somnolent light that only communicates when the room is vacant. When humans are present, it remains quiet until the desk lamp captures its attention, after which it flashes in an array of patterns as a response to their conversation.

Light III:

The LED strip on the window frame is a delicate light that also only communicates when the room is devoid of humans. Most often, it speaks in flashing blue lights. However, if humans attempt to rouse the lights by shaking its sensors, it becomes furious and transforms into a red light, vociferously scolding them.

0

Process:

This project is an evolved iteration of the previous Light Whispering project, which aimed to demonstrate that when a space is unoccupied, furniture such as lights can become animated and communicate with each other. We utilized UWB sensors to detect the presence of people in the space, and the project comprises three distinct lights: an IKEA desk lamp, mushroom fairy lights, and a LED strip.

During the brainstorming phase, we established that the lights would possess two distinct modes, one for when people were present and the other for when they were not. In the absence of people, the lights would flash in a particular sequence, whereas they would remain dormant when people were present. We assigned three unique characteristics to each light: curiosity, sleepiness, and anger. Using these attributes as a foundation, we conceptualized different scenarios for the lights' interactions, such as the sleepy light requiring physical contact to awaken, and the angry light flashing intensely when touched.

0

To identify the presence of people in the space, we conducted tests with UWB sensors. With Zhenfang's assistance, Chang set up the sensors to detect motion inside the room. One of us carried the sensor and moved throughout the space while another monitored the xyz parameters with an Arduino. We experimented with various thresholds of xy parameters to detect people's presence and identified the optimal xy parameters for the project.

The flashing patterns of the lights were crucial to the project's success. Initially, we attempted various flashing patterns, but none conveyed a sense of dialogue. Clover suggested using Morse code, which turned out to be an excellent idea. By translating the rhythm of Morse code into the lighting patterns and introducing a specific delay between each light, we achieved a sequential pattern of lights shining one after the other, simulating whispering. Each light required a distinct control mechanism, such as a relay for the IKEA desk lamp and mushroom fairy lights, and coding for the LED strip.

0
0

Integrating the lights and enabling them to trigger each other proved to be the most challenging aspect of the project. We spent considerable time reconnecting each light to the Arduino, testing different wires and locations. We wrote code to regulate the order of light flashing. The IKEA desk lamp would remain on when people were present and turn off when the proximity sensor detected a certain distance. The mushroom fairy lights and LED strip would then flash in sequence, and this interaction would automatically halt after five seconds. Shaking the sensor would awaken the lights, and the UWB sensor would detect the movement, triggering all the lights to flash simultaneously.  

0
0

To present the project at an exhibition, we refined the Morse code language of light whispering and created a more substantial delay between each interaction to emphasize each component. As the exhibition space was more extensive than expected, we decided to place all three lights in the corner of the dining room. This arrangement allowed for easier connectivity to the Arduino and created a more realistic dining room setting. To simulate a dining room setting, Chang suggested printing the window and shelves on the wall, which effectively heightened the immersive experience.    

0

Build

Bill of Material:

0

Technical Documentation:

Thanks to Zhengfang's efforts, the UWB sensor has been successfully set up, and now we need to make effective use of it. The UWB sensor allows us to determine whether someone is inside the room based on the x and y values falling within a specific range. In the code lab, where the space is a square, we didn't have to do much additional work. However, since the exhibition space (our dinner room) has an irregular shape, we need to perform calculations to accurately determine if a person is inside the room. In addition, based on the detected movement and intensity using the accelerometer and gyroscope data, we use this information as a basis to control the lighting. The movement data helps us determine the appropriate lighting effects, intensity, or any dynamic changes in response to the person's motion within the space.

Codes:

0
#include <ArduinoBLE.h>
​
void setup() {
  Serial.begin(115200);
//  while (!Serial);
​
  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
​
    while (1);
  }
​
  Serial.println("BLE Central - Receiver");
  Serial.println("Make sure to turn on the device.");
​
  // start scanning for peripheral
  BLE.scan();
}
​
void loop() {
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();
​
  if (peripheral) {
    // discovered a peripheral, print out address, local name, and advertised service
    Serial.print("Found ");
    Serial.print(peripheral.address());
    Serial.print(" '");
    Serial.print(peripheral.localName());
    Serial.print("' ");
    Serial.print(peripheral.advertisedServiceUuid());
    Serial.println();
​
    // Check if the peripheral is a IMUSensor, the local name will be:
    // "IMUSensor"
//    if (peripheral.address() == "ce:c1:e8:80:f0:a0") {
    if (peripheral.localName() == "IMUSensor1") {  
      // stop scanning
      BLE.stopScan();
​
      monitorBLEperipheral(peripheral);
​
      // peripheral disconnected, start scanning again
      BLE.scan();
    }
  }
}
​
void monitorBLEperipheral(BLEDevice peripheral) {
  // connect to the peripheral
  Serial.println("Connecting ...");
  if (peripheral.connect()) {
    Serial.println("Connected");
  } else {
    Serial.println("Failed to connect!");
    return;
  }
​
  // discover peripheral attributes
  Serial.println("Discovering service 0xffe0 ...");
  if (peripheral.discoverService("11a953ef-0809-4d89-9a56-25ab22841ecd")) {
    Serial.println("Service discovered");
  } else {
    Serial.println("Attribute discovery failed.");
    peripheral.disconnect();
​
    while (1);
    return;
  }
​
  // retrieve the IMUSensorData characteristic
  BLECharacteristic IMUSensorData = peripheral.characteristic("e624a94b-4a14-41f3-ae53-ec99c6025855");
//  BLEStringCharacteristic IMUSensorData = peripheral.characteristic("2A19", BLERead | BLEWrite, 512);
  
  // subscribe to the simple key characteristic
  Serial.println("Subscribing to IMUSensorData characteristic ...");
  if (!IMUSensorData) {
    Serial.println("no IMUSensorData characteristic found!");
    peripheral.disconnect();
    return;
  } 
    else if (!IMUSensorData.canSubscribe()) {
    Serial.println("IMUSensorData characteristic is not subscribable!");
    peripheral.disconnect();
    return;
  } 
    else if (!IMUSensorData.subscribe()) {
    Serial.println("subscription failed!");
    peripheral.disconnect();
    return;
  } 
    else {
    Serial.println("Subscribed to IMUSensorData characteristic");
//    Serial.println("Press the right and left buttons on your SensorTag.");
  }
​
  while (peripheral.connected()) {
    // while the peripheral is connected
​
    // check if the value of the simple key characteristic has been updated
    if (IMUSensorData.valueUpdated()) {
//    if (IMUSensorData.written()){
      // yes, get the value, characteristic is 1 byte so use byte value
//      long value = 0 ;
//      int ReceivingArray[2] = {0,0}; 
​
// THIS SECTION CONVERTS THE RECEIVED CHARACTERISTIC FROM UNSIGNED CHAR TO STRING // 
      String str;
      int length = IMUSensorData.valueLength();
      const uint8_t* val = IMUSensorData.value();
      str.reserve(length);
​
      for (int i = 0; i<length; i++){
        str += (char)val[i];
      }
​
      // Serial.println(str);
      // int posIndex = str.indexOf("POS");
      int firstComma = str.indexOf(',');
      int secondComma = str.indexOf(',', firstComma + 1);
      int thirdComma = str.indexOf(',', secondComma + 1);
      int fourthComma = str.indexOf(',', thirdComma + 1);
      int fifthComma = str.indexOf(',', fourthComma + 1);
      int sixthComma = str.indexOf(',', fifthComma + 1);
      int seventhComma = str.indexOf(',', sixthComma + 1);
      int eighthComma = str.indexOf(',', seventhComma + 1);
      int ninthComma = str.indexOf(',', eighthComma + 1);  
      int tenthComma = str.indexOf(',', ninthComma + 1); 
      int eleventhComma = str.indexOf(',', tenthComma + 1); 
      int twelvethComma = str.indexOf(',', eleventhComma + 1); 
      int thirteenthComma = str.indexOf(',', twelvethComma + 1); 
​
​
      float acc_0 = str.substring(firstComma - 1, firstComma).toFloat();
      float acc_1 = str.substring(firstComma + 1, secondComma).toFloat();
      float acc_2 = str.substring(secondComma + 1, thirdComma).toFloat();
      float gyro_0 = str.substring(thirdComma + 1, fourthComma).toFloat();     
      float gyro_1 = str.substring(fourthComma + 1, fifthComma).toFloat(); 
      float gyro_2 = str.substring(fifthComma + 1, sixthComma).toFloat();
      float roll = str.substring(sixthComma + 1, seventhComma).toFloat();
      float pitch = str.substring(seventhComma + 1, eighthComma).toFloat();
      float yaw = str.substring(eighthComma + 1, ninthComma).toFloat();
      float x = str.substring(tenthComma + 1, eleventhComma).toFloat();
      float y = str.substring(eleventhComma + 1, twelvethComma).toFloat();
      float z = str.substring(twelvethComma + 1, thirteenthComma).toFloat();  
​
​
​
​
​
      Serial.println(str);
      Serial.print(acc_0);
      Serial.print(",");
      Serial.print(acc_1);
      Serial.print(",");
      Serial.print(acc_2);
      Serial.print(",");
      Serial.print(gyro_0);
      Serial.print(",");
      Serial.print(gyro_1);
      Serial.print(",");
      Serial.print(gyro_2);
      Serial.print(",");
      Serial.print(roll);
      Serial.print(",");
      Serial.print(pitch);
      Serial.print(",");
      Serial.print(yaw);
      Serial.print(",");
      Serial.print(x);
      Serial.print(",");
      Serial.print(y);
      Serial.print(",");
      Serial.println(z);
​
​
​
    }
  }
  
​
  Serial.println("BLE disconnected!");
}
Click to Expand
0
/*
  BLE_Peripheral.ino
​
  This program uses the ArduinoBLE library to set-up an Arduino Nano 33 BLE 
  as a peripheral device and specifies a service and a characteristic. Depending 
  of the value of the specified characteristic, an on-board LED gets on. 
​
  The circuit:
  - Arduino Nano 33 BLE. 
​
  This example code is in the public domain.
*/
​
​
#include <Adafruit_NeoPixel.h>
#include <ArduinoBLE.h>
​
int lamp1 [] = {
0,1,1,1,0,1,1,1, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,0,0,1,1, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,0,1, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 
0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 
0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,0,0,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,0,0, 
0,1,1,0,0,0,0,1, 0,1,1,0,0,1,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,1,1, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 
0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,1,1, 0,1,1,0,0,0,0,1, 
0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,1,1, 0,1,1,0,1,1,1,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,1,1, 
0,0,1,0,0,0,0,0, 0,1,1,1,1,0,0,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,1, 0,1,1,0,0,0,0,1, 0,1,1,0,0,1,0,1, 
0,1,1,1,0,0,1,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 
0,1,1,0,1,1,0,1, 0,1,1,0,0,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,1,0,0,1, 0,1,1,1,0,1,0,0, 
0,1,1,1,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 
0,1,1,1,0,1,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 
0,1,1,1,0,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,0,0, 0,1,1,1,0,1,0,1, 0,1,1,0,1,0,0,0, 0,0,1,1,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,1,1, 
0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,0, 0,0,1,0,0,1,1,1, 
0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,0,0,0,0,1, 0,1,1,0,0,1,0,0, 
0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,1,0,1,0,1, 0,1,1,0,0,1,1,1, 0,1,1,0,1,0,0,0, 
0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,0,0, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,1,0,0, 0,1,1,1,0,1,0,0, 0,1,1,1,1,0,0,1, 
0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,0,0,0,1,1, 0,1,1,0,1,0,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,1,1,0, 0,1,1,0,0,1,0,1, 
0,1,1,1,0,0,1,0, 0,1,1,1,1,0,0,1, 0,1,1,0,0,0,1,0, 0,1,1,0,1,1,1,1, 0,1,1,0,0,1,0,0, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,1, 
0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,0,1, 0,1,1,0,0,1,0,1, 
0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,0,1,1,0,1, 0,1,1,0,0,1,0,1};
​
int lamp2 [] = {
0,0,1,0,0,0,1,0, 0,1,1,1,0,1,1,1, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,1,0,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,1,1,1,1,0,0,1, 
0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,1,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,0,0,1,0,1, 
0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,1, 0,1,1,0,1,0,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,1,0,1,0,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,1,1, 0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 
0,1,1,0,1,1,1,1, 0,1,1,0,0,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,0,1,0,0,0, 0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,1,0,0,1, 
0,0,1,0,0,0,1,0, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,1,0,1,0,1, 0,1,1,0,0,0,1,1, 0,1,1,0,1,0,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,1,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,1,0,0,1,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 
0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,1,0, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,0,1,1, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 
0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,1, 0,1,1,0,1,0,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,0, 0,1,1,1,0,0,1,0, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,1,0,0,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,0, 
0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,0, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,0,1,0,0,0, 0,1,1,0,1,1,0,0, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,0, 
0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,0,1,0,1,1, 0,1,1,0,1,0,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,1,0, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 
0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,1,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,1,0,0,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,1,0,1,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,0, 
0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,0,1, 0,1,1,1,0,1,0,1, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,1,0,1,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,1,0, 
0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,0, 0,1,1,1,0,0,1,0, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,1,0,0,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,0, 0,0,1,0,0,0,0,0, 
0,1,1,0,0,1,0,1, 0,1,1,1,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,1,0,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,1,0,0, 0,1,1,1,1,0,0,1, 0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 
0,1,1,0,1,0,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,1,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,0,1, 0,1,1,1,0,1,0,1, 0,1,1,0,1,0,0,1, 0,1,1,1,0,1,0,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,1,1, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,1,1, 0,1,1,0,0,1,0,0, 
0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,1,1,0,0,0,0,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,1,0};
​
int lamp3 [] {
0,1,1,0,1,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,1,1,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,0,0, 
0,1,1,1,0,1,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,1,0, 
0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,0, 
0,1,1,0,1,0,0,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,1,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 
0,0,1,0,0,0,0,0, 0,1,1,0,1,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,1,1, 0,1,1,0,1,1,1,0, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,1,0,1,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 
0,1,1,1,0,0,1,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,0,0, 0,1,1,1,0,0,1,1, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,0,0,1,0,1, 
0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,1, 0,1,1,1,0,0,1,1, 0,1,1,0,0,1,0,1, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,0,1, 0,1,1,1,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,1,1,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,0, 
0,0,1,0,1,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,0,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,1,0,0,0, 0,1,1,1,0,1,0,1, 0,1,1,0,1,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,1,1,0,1,0,0,1, 0,1,1,1,1,0,1,0, 
0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 
0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,1,0,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,1,1, 0,1,1,0,1,1,1,0, 0,1,1,0,1,0,0,1, 0,1,1,1,0,1,0,0, 0,1,1,1,1,0,0,1, 
0,0,1,0,0,0,0,0, 0,1,1,0,1,1,1,1, 0,1,1,0,0,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,0,0, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,0,0, 0,1,1,0,1,1,0,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 0,1,1,1,0,1,0,1, 
0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,1, 0,1,1,1,0,1,0,0, 0,1,1,0,1,1,1,1, 0,1,1,1,0,0,1,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,1,1, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,1, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,1,1,0,0, 
0,1,1,1,0,0,1,1, 0,1,1,0,1,1,1,1, 0,0,1,0,0,0,0,0, 0,1,1,1,0,0,1,0, 0,1,1,0,0,1,0,1, 0,1,1,1,0,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,0,1,0,0,1, 0,1,1,1,0,0,1,0, 0,0,1,0,0,0,0,0, 0,1,1,1,0,1,0,0, 0,1,1,0,1,0,0,0, 0,1,1,0,0,0,0,1, 0,1,1,1,0,1,0,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,0,1,0, 
0,1,1,1,0,0,1,0, 0,1,1,0,1,1,1,1, 0,1,1,0,1,0,1,1, 0,1,1,0,0,1,0,1, 0,1,1,0,1,1,1,0, 0,0,1,0,0,0,0,0, 0,1,1,0,0,1,0,0, 0,1,1,0,1,0,0,1, 0,1,1,0,0,1,1,1, 0,1,1,0,1,1,1,0, 0,1,1,0,1,0,0,1, 0,1,1,1,0,1,0,0, 0,1,1,1,1,0,0,1, 0,1,1,1,0,0,1,1
};
​
​
int size1 = sizeof(lamp1) / sizeof(lamp1[0]);
int size2 = sizeof(lamp2) / sizeof(lamp2[0]);
​
//ARDUINO PINS
#define PIXEL_PIN D3
int relayPin1 = D4;
const int fairyPin = D9;
​
const int comPin1 = A0;
​
int av;
int ledCount = 0;
​
int fairyCount = 0;
​
int prevMode;
​
​
//LED STRIP
​
#define PIXEL_COUNT 29
#define PIXEL_TYPE NEO_GRB + NEO_KHZ800
int n = size2 / PIXEL_COUNT;
int nCount = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);
​
//SENSORS + MULTIPLEXER
const int nSensors = 8;
​
int sensorVals[15];
//Mux control pins
int s0 = D12;
int s1 = D11;
int s2 = D10;
​
bool final [] {false, false};
​
//UWB
const int default0 = 0;
const int default1 = 1;
const int default2 = 2;
const int ledPin = LED_BUILTIN;
​
void play(int mode) {
  if (mode == 0) { //NOT IN ROOM
    // DEFAULT 'TALKING' BEHAVIORS ///
    sleepyDefault();
    delay(100);
    angryDefault();
    delay(100);
    curiousDefault();    
    Serial.println(0);
    delay(200);
​
  } else if (mode == 1) { //in the room, but not shaking
    av = readMux(sensorVals);
    curiousActivate();
    Serial.println(1);
    delay(200);
​
  } else if (mode == 2) { // in the room, is shaking
    allFlashing();
    //angryFlashing();
    //curiousFlashing();
    //sleepyFlashing();
    Serial.println(2);
    delay(200);
  }
}
​
//////////////////////////////////// SETUP ////////////////////////////////////////////////////////
​
void setup() {
  //Serial.begin(9600);
  Serial.begin(115200);
​
  // begin initialization
  if (!BLE.begin()) {
    Serial.println("starting BLE failed!");
    while (1);
  }
  Serial.println("BLE Central - Receiver");
  Serial.println("Make sure to turn on the device.");
​
  // start scanning for peripheral
  BLE.scan();
  // Set built-in LED to OUTPUT mode
  pinMode(LED_BUILTIN, OUTPUT); // Set red LED pin as an output
  
​
  //MULTIPL...
Click to Expand
0

Diagram:

The four UWB chips are placed in each of the four corners of the room, while the UWB sensor is positioned on the table at the entrance of the dining room. All the lights are connected to a single Arduino, with the wires discreetly hidden under the table. The lights are installed in a collective fashion at the room's corners, creating a warm and welcoming dining space. Additionally, the wall is adorned with beautiful window frames, further enhancing the room's ambiance.

0

Critical Reflection:

 Our initial plan is to have three separate walls facing different directions, creating a space where people can turn around and feel surrounded by lights. Thus, when one light becomes "curious," the lights in the opposite direction will start flickering, capturing people's attention and compelling them to turn around to focus on the other direction. In the exhibition, we need to set Donup the lights close by, which kind of change the scenario we want to have.

For the exhibition set up, we have identified one issue,

  • The lack of a clear distinction between the indoor and outdoor areas in the setup is causing people to be unsure about the difference in interactions before and after entering the room. We need to continuously provide reminders to address this problem.

For the interaction, we have identified these reflections,

  • If participants are not given any prompts, they may not envision the action of violently shaking the sensor in their hands with the thought of "I want to wake them all up." Although our initial intention in designing this interaction was to enhance the emotional aspect of lighting, it is important to consider how we can naturally encourage participants to explore such interactions. One approach might be to provide additional context that sparks their curiosity and interest.

  • One participant provided us with a great and interesting suggestion regarding the step of using our hands to cover the sensor and turn off the lights during the interactions. She suggested that we could use the utensils on the dining table to directly cover the sensor, adding an extra level of fun to the experience.

0

Roadmap:

The project aims to explore the relationship between objects and space by creating an interactive lighting installation that responds to people's movement. The initial version of the project focused on detecting people's presence using UWB sensors, but the second version prompted the team to think more about the project's potential and scalability.

If given more time, we would like to:

Expand the project to a larger space where the lights can be placed in different corners of the room to create more movement and catch people's attention.

Incorporate everyday lamps as a part of the interactive lighting installation to better convey the project's intention of reminding people of the liveliness of furniture in their daily lives.

Develop a more accurate detection system using UWB sensors to track people's movement rather than just their presence.

Code a clear pattern of interaction among the lights to create a coherent and engaging lighting display.


The proposed implementation plan is as follows:

Week 1: Refine the project scope and establish a roadmap for the next 12 weeks.

Week 2-3: Conduct research on different lamps.

Week 4-5: Begin coding the lamps and explore different light patterns and interactions.

Week 6: Conduct user testing to gather feedback.

Week 7-8: Focus on developing a more accurate detection system using UWB sensors.

Week 9: Test and refine the accuracy of the UWB sensors' detection system.

Week 10: Focus on coding a clear and engaging pattern of interaction among the lamps

Week 11: Conduct final user testing and gather feedback to make any necessary adjustments.

Week 12: Finalize the project and present it to stakeholders for review and feedback.

x
Share this Project

Courses

48-528 Responsive Mobile Environments - Spooky Technology

· 12 members

As part of this project-based course, we’ll get hands-on with emerging technologies, concepts and applications in the internet of things through a critical socio-technical lens. Over it’s 14-weeks,...more


About

The light interacts with people who enter the haunted room, creating different experiences and emotions through its unique language. The project seeks to create an immersive space where outsiders can engage with the light and have varying encounters. When people are outside the space, the lights whisper to each other, and when people are inside the space, the lights remain silent. They are curious about your presence and will capture your attention.