E-Lumination (remastered)

Made by dongtaob

Smart home products can sometimes be a nightmare for users, as they can unknowingly surrender control of their personal devices and information. A frightening example of this is ‘Cryptojacking’ - a form of cyberattack where digital devices are secretly used to mine cryptocurrency, leading to data security issues and spine-chilling energy consumption.

Created: May 9th, 2023

0

Interactive System Diagram

Capture 3

0

Overview

Smart home products can sometimes be a nightmare for users, as they can unknowingly surrender control of their personal devices and information. A frightening example of this is ‘Cryptojacking’ - a form of cyberattack where digital devices are secretly used to mine cryptocurrency, leading to data security issues and spine-chilling energy consumption.

The project seeks to imagine a modern lamp advertised as 'free' that only requires an attached mobile phone to illuminate. That would be awesome, right? But beware, as the lamp hides a sinister secret. It quietly uses your phone for Bitcoin mining in the background, slowly draining its power and reducing its lifespan without any noticeable signs of the haunting effects. Once it has its claws in your device, it’s already too late..

Once the user arrives at the interaction, situated as a home office workspace environment. The participant will be immersed in a dark space where he/she is searching for illumination. He/she then noticed there is a lamp with an illumination feature, which requires a mobile phone to be placed on top for activation. Over time, the lamp is secretly draining the battery life since it is using the participant's mobile device for Bitcoin mining in the background - generating a sizzling and unsettling noise from inside of the device. The participant is triggered to remove his/her mobile phone from the device, but he can't live without illumination in the space - causing panic in the participant's mind. Once the battery life is drained to a certain point, the lamp will deactivate and prompt the participant to use another mobile device to renew illumination.   

0

Process

The project employs a variety of hardware and fabrication techniques to materialize the concept of a 'mobile phone interface for Bitcoin mining'. The intermediate development of this project (left) involves using a central LED lamp to serve as the primary functionality of the smart home object, which remains consistent during the second iteration (right).

Visualizing the project in 3D modeling space was exceptionally helpful, it helps with speculating both design thinking and physical considerations/constraints that determine workflow for fabrication down the road.  

Capture 1Intermediate digital prototype (left), Remastered digital prototype (right)


On the other hand, the project is amplified with a physical interface that intrigues participants to place their mobile devices - outlining the shape with a cellphone with an embedded proximity sensor that detects the placement and duration. 

Wechat image 20230509045758 2.thumb

As peripheral inferences, the project also uses a LED strip and a LED ring to, highlight the placement location of the user's mobile device; while signifying the current status of the device through varying colors and brightness of the LED. It is note-worthy that the central LED light generates a lot of heat during operation, which is technically harmless for other electronic components, but it is hot enough to degrade some of the laminations used in assembly. Using a heatsink to help with distribution of heat is critical for this purpose. 

Wechat image 20230509041207.thumb


The device is also equipped with a TFT for text prompts for leading the user through the interaction. Users will be able to see the screen showing 'place your mobile device for illumination' once they arrive at the designated scene.  Combined with the LED lighting effects indicating the status of the device, the project sought to create a cohesive experience for participants. 

A servo motor is also embedded within the device; leveraging its acoustic effect running at varying speeds to simulate the unsettling noise caused by 'Bitcoin mining' in the background. The motor noise comes in at different pitches when it's running at different speeds/directions, which is an ideal reflection of the degree of 'battery life' from the participant's mobile device - sizzling in the background and causing the participant to panic. 

Wechat image 20230509045802.thumb

0

Wechat image 20230509045743.thumb

Reflection and Future Development

'How would I further incentify the interaction process to facilitate more instantaneous reaction from participants' was the leading question in my mind. The majority of the participants would take time to read the instructions on the object label once they arrive at the scene, whereas it takes a little while for them to understand how the device work in correspondence to the descriptions. Therefore, leveraging the prototype I already have to conduct usability testing will be a critical next step in my project.

Which interactivities can be added/reduced to incentify the concept during the interaction? The project is currently using a wide range of sensors and outputs, it may be a little too complex for participants to gain underlying concepts. Minimizing the theoretical footprint of the design can be helpful as a next step.

One group of participants arrived at the scene with curiosity about the device, pulled out their mobile device, and placed it on top of the lamp. Once the lamp starts running and displays a 'battery life degrading' message on the screen, the participants hurried to retrieve their mobile phone from the lamp to stop it from getting harmed. Such a level of immediate interaction is desirable and can provide opportunities for further articulation of this project over time.   

Open Questions

  1. What research has been conducted to address these challenges and propose solutions in terms of smart home technology's transparency, explainability, and user consent? What are the outcomes of such research?
  2. What are the implications of the constant gathering of data by smart home technologies for the privacy and security of individuals, and how can these concerns be addressed?
  3. How can designers of smart home technologies prioritize informed consent and privacy as essential components of their design, and what measures can be taken to limit the collection of unnecessary data?


0

Fabrication

Assembly of the device is primarily composed of two parts: (1) the Primary housing of the lamp was constructed using laser-cut panels of plexiglass, while (2) the user interface is built with plywood panels to maintain the overall generic appearance and form. 

Wechat image 20230509041229.thumb

Laser cutting serves as the primary method of fabrication for custom shapes and joinery of plexi glass panels, allowing rapid prototyping combined with a preliminary polished appearance of the project.

Wechat image 20230509045758 2.thumb

Technical Resources:

- Adafruit Arduino Code Library: Adafruit Industries · GitHub

- CMU IDEATE 3D Printing - SkyLab :  3D Printers – IDeATe Resources (cmu.edu)

- Non-Delay Coding Tutorial: Simple Delays, non Blocking & timer free


Bill of Materials:

- Micro Controller (Arduino Uno R3) (1ct)

- 16Bulbs LED light ring (1ct)

- LED light strip (1ft)

- Servo Motor (Amazon brand) (1ct)

- Proximity Sensor (Adafruit ANCL4730) (1ct)

- LCD Screen (Adafruit ST7789) (1ct)

- High-power LED light with heatsink (1ct)

- 3mmPlexiglass panel (1 sheet)

- 6mm Plywood panel (1 sheet)

Annotated Final Product:

  content  

0
// PIN Number Documentation
// Acoustic Servo D2
// Interface LED Strip D6
// Interface LED Ring D7
// Central LED PWM Controller D9

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

#if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32
  #define TFT_CS         14
  #define TFT_RST        15
  #define TFT_DC         32

#elif defined(ESP8266)
  #define TFT_CS         4
  #define TFT_RST        16
  #define TFT_DC         5

#else
  // For the breakout board, you can use any 2 or 3 pins.
  // These pins will also work for the 1.8" TFT shield.
  #define TFT_CS        10
  #define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
  #define TFT_DC         8
#endif

Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

#include <Adafruit_NeoPixel.h>
#define LEDSTRIP_PIN    6
#define LEDSTRIP_CNT  16

#define LEDRING_PIN    7
#define LEDRING_CNT  16

// Create an instance of the Adafruit_NeoPixel class
Adafruit_NeoPixel ledstrip(LEDSTRIP_CNT, LEDSTRIP_PIN, NEO_GRB + NEO_KHZ800);
// Create an instance of the Adafruit_NeoPixel class
Adafruit_NeoPixel ledring(LEDRING_CNT, LEDRING_PIN, NEO_GRB + NEO_KHZ800);


#include <Wire.h>
#include <math.h>

#include "Adafruit_VCNL4010.h"
Adafruit_VCNL4010 vcnl;
unsigned long previousMillis_BRKT = 0;
const unsigned long interval_BRKT = 1000;
String BRKT_STATUS = "false";

// Define LD24AJTA device address and brightness register address
#define LD24AJTA_ADDRESS 0x2A
#define BRIGHTNESS_REGISTER 0x00
// Define Central LED PWM pin
#define CTLED_PIN 9


#include <Servo.h>
int SERVO_PIN = 2; // Servo motor 1 pin
Servo SERVO1; // Servo motor 1 object

void setup() {
  Serial.begin(9600);
  Wire.begin();  // Initialize I2C communication
  pinMode(CTLED_PIN, OUTPUT);  // Set LED pin as output

  // put your setup code here, to run once:
  // initaite VCNL proximity sensor 
  vcnl.begin();


  //LED strip initiation
  ledstrip.begin();           // Initialize the LED strip
  ledstrip.setBrightness(100);
  ledstrip.show();            // Turn all LEDs off initially

  //LED ring initiation
  ledring.begin();           // Initialize the LED strip
  ledring.show();            // Turn all LEDs off initially
  ledring.setBrightness(75);
  // Set overall brightness to 50 (out of 255)
  for(int i=0; i< ledring.numPixels(); i++) {
    ledring.setPixelColor(i, 255, 0, 255 );
    ledring.setBrightness(75);
		ledring.show();
  }

  //central LED beginning brightness:
  setBrightness(45);

  //Setup Servo
  SERVO1.attach(SERVO_PIN); // Attach servo motor 1 to D2

  tft.init(172, 320);
  tft.fillScreen(ST77XX_BLACK);
  tft.setRotation(3); // Set screen orientation to landscape
  
}

void loop() {
  // check for mobile phone bracket status every 1s
  unsigned long miningTime = getBracketStatusTime();
  Serial.print("Total miningTime:");
  Serial.println(miningTime);
  bracketStatus();
  updatePrompt( miningTime);
  // if bracket is detected, call mining function and set servo speed
  if (BRKT_STATUS == "true") {
    ledstripMINING(5, 100);
    setBrightness(255);
    setServoSpeed(miningTime);
  } else {
    ledstripOFF();
    setBrightness(45);
    if (miningTime == 0) {
      SERVO1.write(90); // Stop the servo motor
    }
  }
}


void ledstripMINING(int numLEDs, int delayTime) {
  static unsigned long prevTime = 0; // Stores the previous time when an LED was updated
  static int currentLED = 0; // Stores the index of the current LED being updated
  // Only update the LEDs after the specified delay time has passed
  if (millis() - prevTime >= delayTime) {
    // Turn off all LEDs initially
    for (int i = 0; i < LEDSTRIP_CNT; i++) {
      ledstrip.setPixelColor(i, 0, 0, 0);
    }
    // Turn on the numLEDs LEDs starting from currentLED
    for (int i = currentLED; i < currentLED + numLEDs; i++) {
      int pixel = i % LEDSTRIP_CNT; // Make sure the pixel index wraps around if it exceeds the strip length
      ledstrip.setPixelColor(pixel, 255, 0, 255); // Set the pixel color to red
    }
    ledstrip.show(); // Update the strip with the new colors
    // Update the currentLED index for the next loop
    currentLED++;
    if (currentLED >= LEDSTRIP_CNT) {
      currentLED = 0;
    }
    // Store the current time for the next loop
    prevTime = millis();
  }
}


void ledstripOFF() {
    // turn off all LEDs on the strip
    for (int i = 0; i < LEDSTRIP_CNT; i++) {
      ledstrip.setPixelColor(i, 0, 0, 0);
    }
    ledstrip.show(); // update the strip with the new colors
} 


void LED_FALSE(int times, int interval) {
  int i = 0;
  
  while (i < times) {
    ledstrip.fill(ledstrip.Color(255, 0, 0));   // Set all LEDs to white
    ledstrip.show();   // Turn on all LEDs
    unsigned long startTime = millis();
    while ((millis() - startTime) < interval) {}   // Wait for the specified interval
    ledstrip.clear();   // Turn off all LEDs
    ledstrip.show();   // Update the LED strip to turn off all LEDs
    startTime = millis();
    while ((millis() - startTime) < interval) {}   // Wait for the specified interval
    i++;
  }
}



//check for mobile phone bracket status every 1s.
void bracketStatus() {
  unsigned long currentMillis_BRKT = millis();
  if (currentMillis_BRKT - previousMillis_BRKT >= interval_BRKT) {
    int proximityValue = vcnl.readProximity();
    int proximityValue_mapped = (map(proximityValue, 65535, 2156, 0, 100));
    Serial.print("Proximity: ");
    Serial.println(proximityValue_mapped);
    if (proximityValue_mapped <= 90) { BRKT_STATUS = "true"; } 
    else { BRKT_STATUS = "false";}
    Serial.print("BRKT_STATUS: ");
    Serial.println(BRKT_STATUS);
    previousMillis_BRKT = currentMillis_BRKT;
  }
}

//Set central LED brightness using PWM controller
void setBrightness(byte brightness) {
  // Send brightness value to LD24AJTA controller
  Wire.beginTransmission(LD24AJTA_ADDRESS);
  Wire.write(BRIGHTNESS_REGISTER);
  Wire.write(brightness);
  Wire.endTransmission();
  // Set LED brightness using PWM
  analogWrite(CTLED_PIN, brightness);
}

unsigned long bracketStatusStartTime = 0;
unsigned long bracketStatusTotalTime = 0;

unsigned long getBracketStatusTime() {
  static unsigned long bracketStatusTotalTime = 0;
  static unsigned long bracketStatusStartTime = 0;
  unsigned long currentMillis_BRKT = millis();
  
  if (BRKT_STATUS == "true") {
    if (bracketStatusStartTime == 0) {
      bracketStatusStartTime = currentMillis_BRKT;
    }
    bracketStatusTotalTime += currentMillis_BRKT - bracketStatusStartTime;
    bracketStatusStartTime = currentMillis_BRKT; // reset start time to current time
  } else {
    bracketStatusStartTime = 0;
    bracketStatusTotalTime = 0; // reset total time when bracket status is false
  }
  return bracketStatusTotalTime;
}


void setServoSpeed(unsigned long miningTime) {
  static unsigned long lastUpdateTime = 0;
  static int servoSpeed = 90;
  
  if (millis() - lastUpdateTime > 1000) { // Update every 100ms
    if (miningTime == 0) {
      SERVO1.write(90);
      // Set servo speed to 90 if totalMiningTime is 0
    } else {

      int targetSpeed = constrain(map(miningTime, 6000, 15000, 90, 180), 90, 180);
       // Only update if the target speed has changed
        if (targetSpeed > servoSpeed) 
          {
          servoSpeed++; // Accelerate servo
          } 
        else 
          {
          servoSpeed = 90; // Decelerate serv
          }
    }
    SERVO1.write(servoSpeed);
    Serial.print("Current Servo Speed:");
    Serial.println(servoSpeed);
    lastUpdateTime = millis();
    return servoSpeed;
  }
}

void tftDrawtext(char *text, int line_number) {

  tft.setTextSize(3);
  tft.setCursor(0, line_number); // Set cursor position to x=0, y=80
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextWrap(true);
  tft.print(text);
}

unsigned long lastUpdateTime_tft = 0;
const unsigned long updateInterval_tft = 3000; // 3 seconds

void updatePrompt(int miningTime) {
  int batterylife = map(miningTime, 0, 45000, 100, 60);
  if (millis() - lastUpdateTime_tft >= updateInterval_tft) {
    if (miningTime == 0) {
      tft.fillScreen(ST77XX_BLACK);
      tftDrawtext("Place your mobile phone for illumination", 50);
    } else if ((miningTime < 10000) && (miningTime > 0)) {
      tft.fillScreen(ST77XX_BLACK);
      tftDrawtext("Illumination turned ON!  Enjoy!!!", 60);
    } else if ((miningTime < 45000) && (miningTime > 10000)) {
      tft.fillScreen(ST77XX_BLACK);
      tftDrawtext("Remaining Battery Life (%): ", 50);
      tftDrawtext(String(batterylife).c_str(), 100);
    } else  {
      setBrightness(45);
      tft.fillScreen(ST77XX_BLACK);
      tftDrawtext("Free illumination limit reached. Upgrade to premium or replace mobile phone", 30);
      LED_FALSE(10, 500);
      
      
    }
    lastUpdateTime_tft = millis();
  }
}
Click to Expand
0
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

Smart home products can sometimes be a nightmare for users, as they can unknowingly surrender control of their personal devices and information. A frightening example of this is ‘Cryptojacking’ - a form of cyberattack where digital devices are secretly used to mine cryptocurrency, leading to data security issues and spine-chilling energy consumption.