Lightcatcher-Team Natuallic

Made by Yanling Zhang, kharsono and Chengzhi Zhang

Lightcatcher is an IoT device that uses natural material to persuade people to going embrace the nature especially during the winter when the daylight is short.

Created: December 7th, 2021

0

Intention: 

Lightcatcher is a product that persuades people to go outside during the time when the daylight is on by dimming each box as time proceeds in the day. Lightcatcher divides the daytime of that day at that location into 6 equal parts, aligning with the 6 cubes we have, and dims each cube as the day proceeds. When the user goes out, he presses the cube of that moment, and it records the time of going out. When the user returns home, he presses the cube representing the time coming back home. The cubes in between will light up during the night. It urges people to go outside more especially during the winter days when the time of daylight is short. It implements the natural materials for the appearance, in order to persuade people to embrace nature more. 

0

Approach:

We approach the final design with a problem-oriented mindset. As the students who come to live in Pittsburgh, we find it extremely bothersome to have such short daylight during the winter. The night time proceeds so early even before 5 o’clock that if we don’t seize the day going outside during the daytime, we’ll have no chance embracing the daylight. In order to enjoy the short daylight, we have to check the sunrise and sunset time frequently. However, as we are busy, we always forget to check the time for sunset before it comes. Lightcatcher as an ambient device, reminds the people to go outside more by dimming the cubes with flowers in it. The actual natural elements also make it more appealing for users to step outside their home and go out more often.

0

Context:

  • Concept Reference 1: Mui, natural interface

In this concept, unlike other IoT devices, it adopts the natural materials for the appearance. Mui adopts a wood board for the touch-screen so that people can feel the wood while utilizing this smart panel for tele-communication and knowing the weather, ect.

Official website: https://mui.jp/en/

Medium post: https://medium.com/@muilab/mui-lab-announces-independence-ee19a54ab4e0

  • Concept Reference 2: Lane Tech HS Sunset Tracker

This is a product that simulates the sunrise and sunset that uses more specific metaphor-sun to indicate daylight time. It is cute and straightforward.

Link: https://particle.hackster.io/maggari/lane-tech-hs-sunset-tracker-082f4a

  • Concept Reference 3: phoneyTV for Spark

This product uses transparent matte material to mix different colors together, which creates fantastic color when projected.

Link https://particle.hackster.io/BulldogLowell/phoneytv-for-spark-e7c5b2


Besides, we also implemented the concept of ambient technology for behavior change. It persuades people to change their behavior by displaying the natural elements like decorations in the box. We looked into the Breakaway example (1) for similar design for behavior change like Roger et al’s Ambient Influence (2) example, and also the calm technology principles in Case’s book for our product (3).

Reference:

  1. Jafarinaimi, Nassim, et al. "Breakaway: an ambient display designed to change human behavior." CHI'05 extended abstracts on Human factors in computing systems. 2005.
  2. Rogers, Yvonne, et al. "Ambient influence: Can twinkly lights lure and abstract representations trigger behavioral change?." Proceedings of the 12th ACM international conference on Ubiquitous computing. 2010.
  3. Case, Amber. Calm technology: principles and patterns for non-intrusive design. " O'Reilly Media, Inc.", 2015.


0

Conceptual Design

Provide a high level design overview that considers and describes: what context it operates in ; what it does and how it behaves; how someone would or could interact with it; and how these interactions unfold to lead to the desired outcome? Detail your design proposal with a series of illustrations.

0

Storyboard:


  1. Sunrises, all the cubes light up, indicating the start of the day
  2. When user goes out, he touches the cube at the time
  3. Cubes dim as the day proceeds
  4. When he goes back, he touches the cube again
  5. The sunsets, and the cubes light up during the night
  6. Natural materials for all parts

0

Video

0

Process:

 Naturallic’s design process results in design iterations in terms of hardware & software. In hardware, we tested different materials as well as configurations to effectively convey the biophilic feel (of material) as well as light illumination to represent the sunshine. The design iterations involve testing out different configurations of boxes with acrylic, wood & translucent materials (shown in images below). With hardware electronics, different input sensors are being tested to find the best integrated to the system as well as generate great haptic feedback, which results in using a simple button. The short four prongs of the switch made it difficult to latch on top of the LEDs, requiring extra male-female connection. On the software front, multiple code iterations resulted in two different main functions: daylight operations & night operations. The daylight operation function is responsible for light fading through the day, monitoring button press & cancelling button press. Meanwhile, the night operation is responsible for lighting the pressed buttons during the day (code shown below).  One setback we had with using while loops in the code is inability to flash the code - requiring hard wire serial bypass.

0

Prototype:

The hardware (materials & electrical) & software (coding) design iterations are shown below. Finally, bill of materials of the project is listed below as well.

0
// This #include statement was automatically added by the Particle IDE.
#include <neopixel.h>
#include "neopixel.h"
#include <math.h>

// IMPORTANT: DEFINE PINS & CONSTANTS
#define button1 D2
#define button2 D3
#define button3 D4
#define button4 D5
#define button5 D6
#define button6 D7
#define PIXEL_PIN D8
#define PIXEL_COUNT 17
#define PIXEL_TYPE WS2812
#define numBoxes 6
#define numLightInBoxes 3

int LIGHTEST = 100;
int pixel_position = 0;
int delaytime;
int buttonPin [] = {button1, button2, button3, button4, button5, button6};
int buttonState [] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
//Initialize once to apply for all functions
int buttonState1; // variables to know if buttons are pressed
int buttonState2;
int buttonState3;
int buttonState4;
int buttonState5;
int buttonState6;

int nightStates[numBoxes] = {0,0,0,0,0,0}; // indicates which light should turn on at night - CHANGE WITH HOW MANY BOXES
long timeSincePress [] = {-1,-1,-1,-1,-1,-1}; 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

void setup(){

    Serial.begin(96000);

    pinMode(button1, INPUT_PULLUP); // sets pin as input
    pinMode(button2, INPUT_PULLUP); // sets pin as input
    pinMode(button3, INPUT_PULLUP); // sets pin as input
    pinMode(button4, INPUT_PULLUP); // sets pin as input
    pinMode(button5, INPUT_PULLUP); // sets pin as input
    pinMode(button6, INPUT_PULLUP); // sets pin as input
    
    strip.begin();
    strip.show(); // Initialize all pixels to 'off'
}

void loop(){

    nightStates[0] = 0; // start the day with all leds at night to turn off
    nightStates[1] = 0;
    nightStates[2] = 0;
    nightStates[3] = 0;
    nightStates[4] = 0;
    nightStates[5] = 0;
    dayOperations(); 
    nightOperations();
    
    delay(30000); // Duration of the night
    
}

void dayOperations(void) {
    
    unsigned long init = millis(); // time differences & setting to simulate sunrise to sunset
    unsigned long now = millis();
    int timeDel = 60000; // Duration of the day
    int timeDiff = now - init;
    Serial.println("day called: ");
    //Serial.println(init);
    
    // Initialize 3 blocks turn on in the morning 
    uint32_t b = strip.Color(160, 220, 255);
    for(int i=0; i < numBoxes; i++) { // 6 represents 6 blocks
        strip.setPixelColor((i*numLightInBoxes), b);
        strip.setPixelColor((i*numLightInBoxes + 1), b);
        strip.show();
    }
    
    // Simulates everything happening during the day
    while(timeDiff < timeDel) { // 1 minute
    
        // Dims the light one by one as day goes
        int value = map(timeDiff, 0, timeDel, 0, numBoxes);
        int gradientColor = map(timeDiff-value*(timeDel/numBoxes), 0, timeDel/numBoxes, 255, -1);
        
        uint32_t c = strip.Color(gradientColor*0.63, gradientColor*0.86, gradientColor);
        strip.setPixelColor((value*numLightInBoxes), c);
        strip.setPixelColor((value*numLightInBoxes + 1), c);
        strip.show();
        
        now = millis();
        timeDiff = now - init;
        //Serial.print(now);
        
        // Check that the current dimming block is pressed or not
        
        uint32_t orange = strip.Color(40, 30, 0); // orange
        uint32_t green = strip.Color(10, 40, 0); // green
        uint32_t d = strip.Color(0, 0, 0); //dark
        for(int i = 0; i <= value; i ++){
            int pressMode = checkButton(i);
            
            if(pressMode == 1){
                if(i == value){
                    Serial.println("1 in while");
                    strip.setPixelColor((i*numLightInBoxes), orange);
                    strip.setPixelColor((i*numLightInBoxes + 1), orange);
                    strip.show();
                    delay(500);
                }else{
                    strip.setPixelColor((i*numLightInBoxes), orange);
                    strip.setPixelColor((i*numLightInBoxes + 1), orange);
                    strip.show();
                }
            }
            else if(pressMode == 2){
                if(i == value){
                    strip.setPixelColor((i*numLightInBoxes), green);
                    strip.setPixelColor((i*numLightInBoxes + 1), green);
                    strip.show();
                    delay(500);
                }else{
                    strip.setPixelColor((i*numLightInBoxes), green);
                    strip.setPixelColor((i*numLightInBoxes + 1), green);
                    strip.show();
                    delay(500);
                    strip.setPixelColor((i*numLightInBoxes), d);
                    strip.setPixelColor((i*numLightInBoxes + 1), d);
                }
            }
            
            if(i < value && nightStates[i] == 1){
                strip.setPixelColor((i*numLightInBoxes), orange);
                strip.setPixelColor((i*numLightInBoxes + 1), orange);
                strip.show();
            }
        }
        
    }
}

void nightOperations(void) {
    
    // turn all the light dim first
    uint32_t c1 = strip.Color(0, 0, 0);
    for(int i = 0; i < numBoxes; i++){
        strip.setPixelColor((i*numLightInBoxes), c1);
        strip.setPixelColor((i*numLightInBoxes + 1), c1);
    }
    strip.show();
    
    
    // Decide which boxes to turn on at night
    uint32_t c2 = strip.Color(255, 165, 0); // Represents orange to turn on the whole night
    for(int i = 0; i < numBoxes; i++){
        if(nightStates[i] == 1){
            strip.setPixelColor((i*numLightInBoxes), c2);
            strip.setPixelColor((i*numLightInBoxes + 1), c2);
        }
    }
    strip.show();
}

int checkButton( int index ){
    Serial.println("checkButton going");
    int buttonReading = digitalRead( buttonPin[index] );
    
    // has changed from the last read
    if( buttonReading != buttonState[index] ){
        Serial.println("checkButton: state change");
        if( buttonReading == LOW && buttonState[index] == HIGH ){
            // recorded time when it was pressed. 
            timeSincePress[index] = millis();
            buttonState[index] = buttonReading;
        }
        
        if( buttonReading == HIGH && buttonState[index] == LOW ){
            long timeNow = millis();
            
            if( timeSincePress[index] + 2000 > timeNow  ){
                // it's been less than 2 seconds. this is a fast press
                nightStates[index] = 1;
                timeSincePress[index] = -1;
                buttonState[index] = buttonReading;
                Serial.println("1 returned in checkButton");
                return 1;
            }else{ 
                /// otherwise it's a long press
                nightStates[index] = 0; 
                timeSincePress[index] = -1;
                buttonState[index] = buttonReading;
                Serial.println("2 returned in checkButton");
                return 2;
            }
        }
        
    }
    return 0;
}
Click to Expand
0
0
0
0
BILL OF MATERIALS:


Material Quantity Additional Info
Base Box 1 Rectangular with 6 square holes
Square Boxes 6 Uniform walls with translucent sides
Flowers - Decoration purposes
Breadboard 3 2x 6.5" & 1x 3" length
17-lights LED strip 1
Button switch 6 4-pin momentary switch
Particle 1
Connectors 12 Male-Female

0

Reflection and Critique:

Kenny: Working on the software & electrical part of the project, I realized how each function/algorithm or electronics has its own interfacing that requires extra time and effort to understand. In coding the whole system, debugging for edge cases is very tough to pinpoint the root cause of the issue. Meanwhile, knowing your resources really help a lot in accomplishing the tasks. In regards to the product, one of the judges' commented on the fundamental project: finding a more fun & thoughtful solution to the problem like having a 'sunlight-collecting' device that you can bring around. This speaks volume to how important is the scope creation & ideation which we could have put more thought into. Finally, with team dynamics, I'm really grateful to have teammates that can be dependable on working with different parts of the products with clear communication and aligned goals.

Jenny: It is exciting to make ideas come true from sketch to prototype. From the process, I realized the importance to divide the prototype into small pieces so the whole project can be iterated based on that! I really appreciate everyone on the team creating this prototype and leaving beautiful memory this winter.

Chengzhi: From this exercise, I came to realize the importance of having all the information clear and updated in a group and also the importance of collaboration in a team. I learned a lot from my teammates who work hard to make our concept finally come true. To push this project further, I may implement the resin for the cubes and real wood for the base. It’s an intriguing project as we come to realize that implementing the natural materials for IoT device is a new venue to research into.

Hongyu:

0

Acknowledgements: 

Thanks Jenny’s friend who helped us with the debugging processes.

0

References: 

  • Kellert, Stephen R., Judith Heerwagen, and Martin Mador. Biophilic design: the theory, science and practice of bringing buildings to life. John Wiley & Sons, 2011.
  • Yin, Jie, et al. "Effects of biophilic indoor environment on stress and anxiety recovery: A between-subjects experiment in virtual reality." Environment International 136 (2020): 105427.
  • Barreiros, Carla, Viktoria Pammer-Schindler, and Eduardo Veas. "Planting the seed of positive human-IoT interaction." International Journal of Human–Computer Interaction 36.4 (2020): 355-372.
  • Anglin, Rebecca ES, et al. "Vitamin D deficiency and depression in adults: systematic review and meta-analysis." The British journal of psychiatry 202.2 (2013): 100-107.

x
Share this Project

Courses

About

Lightcatcher is an IoT device that uses natural material to persuade people to going embrace the nature especially during the winter when the daylight is short.