ScreenBOOM ๐ฃ
Big Brother Didnโt Force You to Watch
The concept began with nine days of device-usage data that I collected at the start of the school year. I created a visualization that turned the time spent in each application into an atom: the more electrons it had, the longer I had used the application. I wanted to imagine what the atoms in our brain cells might look like if computers had not become such a large part of our working lives.
ScreenBOOM
After visualizing the data, I wanted to build a system that could demonstrate the value of time. My first idea was a Tetris game controlled by three timers: one for horizontal movement, one for rotation, and one for speed. The player would adjust the timers to land each block in the desired position. However, a Tetris game did not communicate โtime is importantโ strongly enough. That led me to ScreenBOOM. Instead of using time to control a game, an Arduino timer limits your computer session and automatically logs you out when time expires. Its lesson is simple: time matters, and ALWAYS save your files.
What would you do if you could use each electronic device for only a limited amount of time per day?
Build Process
First Prototype on a Breadboard

Second Prototype on Cardboard

Testing the Second Prototype
Set time

Counting down

Game over

Code
screenBoom.ino
/*
This is an arduino timer that will
automatically log you out of your computer
***beware of unsaved files!!!***
Screen Timer v2
Author: James Shih
references
https://www.arduino.cc/en/Reference/KeyboardModifiers
https://www.arduino.cc/en/Reference/KeyboardPress
*/
#include <LiquidCrystal.h>
#include <Keyboard.h>
#include <HID.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
char cmdKey = KEY_LEFT_GUI;
char shfKey = KEY_LEFT_SHIFT;
char rtnKey = KEY_RETURN;
int potPin = A0;
int photoPin = A1;
int val = 0;
int photoVal = 0;
int counter = 0;
int countNum = 0;
int caseState = 0;
unsigned long pTime = 0;
void setup() {
Keyboard.begin();
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
val = analogRead(potPin);
photoVal = analogRead(photoPin);
counter = map(val, 0, 1016, 0, 600); //map to 600 seconds
long cTime = millis();
Serial.print(photoVal);
Serial.print(" ");
Serial.print(counter);
Serial.print(" ");
Serial.print(countNum);
Serial.println();
switch (caseState) {
case 0:
lcd.setCursor(0, 0);
lcd.print("Set Timer:");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(counter);
lcd.print(" seconds");
lcd.print(" ");
if (photoVal <= 300) {
tone(9, 3000, 100); //set time sound
countNum = counter;
lcd.clear();
caseState++;
}
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Time Left:");
lcd.setCursor(0, 1);
if (cTime - pTime >= 1000 && countNum > 0) {
pTime = cTime;
tone(9, 2500, 100);
countNum--;
lcd.print(" ");
lcd.print(countNum);
lcd.print(" seconds");
lcd.print(" ");
} else if (countNum <= 0) {
lcd.clear();
caseState++;
}
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.print("BOOM!");
lcd.setCursor(0, 1);
lcd.print("");
//Boom sound effect
tone(9, 400, 800);
delay(400);
tone(9, 200, 1000);
//Logout Mac
Keyboard.press(cmdKey);
Keyboard.press(shfKey);
Keyboard.press('q');
delay(100);
Keyboard.releaseAll();
Keyboard.press(rtnKey);
Keyboard.releaseAll();
delay(6000);
lcd.clear();
caseState = 0;
break;
}
}