Forget me not

Made by Nicole Xiang

There are many things we take for granted and sometimes we forget about them, like doorbells. Unlike a traditional doorbell, this one visualizes the weather with the color of a lamp. But this is a two-way relationship! And you never know what it’ll do when you take them for granted.

Created: February 17th, 2023

0

Intention

Doorbells are something that is slowly fading out of our lives. Millennials and Gen Z rather send a text “here” instead of ringing the doorbell. This leaves doorbells for just delivery purposes and visiting strangers. So when I thought about my project, my first instinct was how can we bring doorbells back to life. What if they also feel lonely when no one is giving them attention yet they still need to work so that they don’t get thrown out? For this project, I wanted to add a sense of emotion to doorbells. Since my input is temperature and my output is an LED strip, I created a doorbell that communicates with a lamp with an LED strip to reflect the weather. However, if you don’t give it its desired amount of attention, it will give inaccurate temperature readings (stop working properly). Thus, the other goal of the project is to remind us to pause and appreciate the things we take for granted.                    

0

Context

I’ve seen a lot of acrylic lamps before this project and they looked very modern and aesthetic so I wanted to see how I could incorporate that into the project. Luckily, I got LED strip as the output so I was able to an acrylic LED light. When I was researching the role of doorbells, I also found that it causes anxiety in many people because of their alarming sound and that people don’t use it that much. So for this project, I wanted to take a different perspective on doorbells and explore what other ways we could use them, perhaps incorporating them into our lives (hence the idea of the lamp)  

0

Prototype/Outcome

My initial prototype consists of the Arduino and an LED strip that changes color based on the temperature throughout the day. To add some spookiness, I wanted to give the doorbell this idea of seeking attention. As I started testing with the LED strip, I realized what if I turned this into a lamp which led me to make an acrylic lamp. 

The final product has 2 parts. The first part if the doorbell which is connected to the Arduino in order to know whether it was pressed or not. The second part is the LED strip and the lamp. I created an LED strip tube using wood so I can place it at the end of the lamp (a bent acrylic sheet) so that the light can travel through the acrylic. The sensor on the Arduino will sense the temperature which then will change the lamp color. When it gets warmer, the light will turn more red, and when it’s colder, it’ll turn more blue/white indicating snow. If you do not interact with it within the time it wants you to (the attention-seeking part), it will start changing the light animation to let you know that it wants your attention.  

Parts used in this project:

1x Arduino Nano 33 BLE Sense

1x 8-pixel LED strip

1x acrylic sheet (10cm x 40cm)

7x jumper wires 


0

Process

I think the most difficult part of the project is actually deciding on an idea. I had several ideas but I wasn’t particularly interested in them because it felt like incorporating the input/output for the sake of incorporating it. Since I wasn’t set on the idea until much later, I explored a lot with the sensors and LED strip libraries to see what was possible. This eventually led me to the idea of controlling LED colors and animation using temperature input and the amount of attention the user is paying to the doorbell. Another big challenge was getting the code to work. Because “attention” is determined by how often the doorbell is pressed, time calculation is a key piece that was tricky to work with. Using the time library gave me weird errors that caused my Arduino to function weirdly (not connecting to the IDE) so I had to use a delay to determine how much time has passed. My favorite part of this project is the acrylic light part. I’ve never bent acrylic before so it was very cool to see how I could form all kinds of shapes with it.   
0

Open Questions and Next Steps

If I had more time or if I were to continue working on this project, I would play around with the LED light animation more. I got some feedback on making the light also seem alive by creating a breathing animation. There were also some thought-provoking questions like “how do you make sure users think something that happened was not an error but an actual feature?”. Since this project is about counter-functional products, I thought this question was pretty hard to answer because the whole idea was going the opposite way of common sense. Nevertheless, from a user experience perspective, I think all products should offer enough affordances and help users understand as they interact with them. This is something that I need to think about for my future projects as well.   

0

Reflection

Overall, I had a very fun time exploring what the things an Arduino could do and its limitations. To make the final product look more like a real product, there needs to be a lot of work to cover the Arduino and all the wiring. I think I’m still pretty far from getting to that real-looking product but it was still exciting to build one from scratch and package it. For future projects, I want to start ideating earlier so that I have more time to actually test out all the parts and iterate on features. For this project, because of the time limit, I didn’t put enough support for the doorbell part so it broke when people pressed it very hard. Overall, I think I achieved what I imagined, other than the breaking part on Demo day. I’m looking forward to applying the lessons I learned to future projects.    

0
#include <Adafruit_NeoPixel.h>
#include <Arduino_LPS22HB.h>

#define PIXEL_PIN D11
#define PIXEL_COUNT 8
#define PIXEL_TYPE NEO_GRB + NEO_KHZ800
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

const int atnOptions[3] = {10,30,50}; //attention period options 
int atnPeriod = atnOptions[random(0, 2)]; //randomly select atnPeriod 
int duration = 0;
int r;
int g;
int b;
int color;

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

  if (!BARO.begin()) {
    Serial.println("Failed to initialize pressure sensor!");
    while (1);
  }
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

  pinMode(D2, INPUT_PULLDOWN);   
}

void loop() {
    // read the sensor value
  float pressure = BARO.readPressure();

  // print the sensor value
  Serial.print("Pressure = ");
  Serial.print(pressure);
  Serial.println(" kPa");
  float temperature = BARO.readTemperature();
  Serial.print("temperature");
  Serial.print(temperature);
  Serial.println();
   
  color = setTempColor(temperature);
  r = floor(color/1000000);
  g = floor(color/1000%1000);
  b = floor(color%1000);  
  Serial.print("rgb: ");
  Serial.print(r);
  Serial.print(g);
  Serial.print(b);
  Serial.println();
  boolean val = digitalRead(D2);  

  if (val == 1){ // pressed doorbell 
    duration = 0;
    Serial.print("true");
    Serial.print(atnPeriod);
    Serial.println();
    //set to correct temp 
  }

  else{ // did not press 
    duration += 1;  
    if (duration <= int(0.5*atnPeriod)){ // if less than half of attention period  

      uint32_t neutral = strip.Color(r, g, b) ;
      for( int i = 0; i < strip.numPixels(); i++ ){
        strip.setPixelColor(i, neutral); // set a color 
      }
      strip.show();
      delay(100);

      Serial.println(atnPeriod);
      Serial.print("less than half; duration: ");
      Serial.print(duration);
      Serial.println();
    }
    
    else if (duration <= atnPeriod){ // more than half 
      // make light fade  
      Serial.print("within atn");
      Serial.println();
      FadeInOut(r, g, b); // blue

    }
    else { //late 
      //make light strobe
      strip.clear();
      Serial.print("late atn");
      Serial.println();
      
      Strobe(r, g, b, 10, 50, 1000);
    }
  }
  delay(1000);
}

void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;
     
  for(int k = 0; k < 256; k=k+1) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    strip.show();
  }
     
  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    strip.show();
  }
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < PIXEL_COUNT; i++ ) {
    setPixel(i, red, green, blue);
  }
  strip.show();
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    strip.show();
    delay(FlashDelay);
    setAll(0,0,0);
    strip.show();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}

int setTempColor(int temp){
  Serial.print("setting color");
  if (temp <= 0){
    return 0;
  }  
  else if (temp > 0 && temp <=10 ){
    return 158255246;
  }  
  else if (temp > 10 && temp <=24 ){
    return 249217091;
  }  
  else if (temp > 24 && temp <=25 ){
    return 246012238;
  }  
  else {
    return 255000000;
  }  
}
Click to Expand
x
Share this Project


About

There are many things we take for granted and sometimes we forget about them, like doorbells. Unlike a traditional doorbell, this one visualizes the weather with the color of a lamp. But this is a two-way relationship! And you never know what it’ll do when you take them for granted.