Introduction: Easy Smart Mirror ( With a Twist πŸ˜‰)

In a world full of optimists, I pride myself in being a realist. In this day and age, we're constantly being thrown self help books and this idea of being more positive and doing more - but what if we were allowed to just be? How often do we really have the courage to face that which we fear and once and for all actually converse with and meet our demons instead of pushing them away? Inspired by that idea, I decided to create an easy smart mirror that reflects the thoughts many of us think about ourselves everyday. Unfortunately, many a times we try to push down the thought that we even have these thoughts, but through this project I wanted us to reflect on doing the opposite. What if confronting our demons could only allow us to be more aware and kinder instead of pushing them away and projecting "positivity" (which perhaps isn't even true)?

Supplies

Tools

  1. Soldering iron
  2. Solder wire
  3. Wire cutters / strippers
  4. Hot glue gun
  5. Scissors
  6. Black tape(will become your best friend! I used an electrical one)

MATERIALS / COMPONENTS

  1. Arduino Nano ESP32
  2. 2.4" OLED screen(I used an affordable one from Amazon, I would suggest looking one up on Adafruit for better quality and reliability)
  3. Wires
  4. Solderable breadboard
  5. USB-C cable (to program the ESP32)
  6. 6Γ—6 inch two - way see through mirror
  7. 6 x 6 inch Shadow box frame
  8. Cardboard/ Old box

Note: I would recommend playing around to see what size you'd like your mirror to be. Having your shadow box and mirror be the same size could lead to some limitations as I will explain below. Plan out the size of all your components before you rush to buy them.

Step 1: Get the Hardest Part Out of the Way! Let's Solder! πŸ‘―

I used an AI generated image to easily show you how to solder if you are using the same OLED as mine. If you are soldering for the first time, I would recommend watching this video.

For the first part, start with soldering your ESP32 to your soderlable breadboard. You may watch this video for help doing so. Make sure the USB side faces the outside. I placed mine towards the middle near the edges.

My OLED used an SPI connection because it had 7 pins. Spend some time reading up about your OLED and most importantly it's reviews to see how well it performs and what people recommend doing!

Back to the soldering -

VCC β†’ 3.3V: Powers the OLED. (My OLED was 3.3.V. Make sure to double check what works for you)

GND β†’ GND: Shared ground so everything talks the same β€œelectrical language.”

SCK β†’ D13: SPI clock β€” keeps the data in sync.

MOSI β†’ D11: β€œData line” where the ESP32 sends information to the screen.

CS β†’ D8: Chip Select β€” tells the OLED β€œI’m talking to you now.”

DC β†’ D9: Switches between commands and display data.

RST β†’ D10: Resets the OLED so it starts in a clean state.

Step 2: Let's Code! (The Fun Part)

For this project, I wanted the words on the mirror to reflect our inner thoughts - this would be a mirror that materializes how many of us think and talk about ourselves. I wanted the code to be glitchy. I used 10 simple quotes that I find many of us saying to ourselves everyday. I added a small glitch effect (words like STOP, VOID etc) in between each quote to add to the drama. The quotes change of their own and are spaced out differently (between 2-6 seconds) to add to the shock factor, randomness and glitch effect.

#include <U8g2lib.h>
#include <SPI.h>

U8G2_SSD1309_128X64_NONAME2_F_4W_HW_SPI u8g2(
U8G2_R0,
/* cs=*/ 8,
/* dc=*/ 9,
/* reset=*/ 10
);

// Short inner-thought mirror quotes (5 words each)
const char* quotes[] = {
"I am not enough",
"I feel so flawed",
"Everyone looks better",
"I hate what I see",
"Why can't I change",
"I'm not worthy",
"I wish I was different",
"Nothing feels right",
"I don't like myself",
"Why do I feel wrong"
};

const int numQuotes = sizeof(quotes) / sizeof(quotes[0]);
int currentQuote = 0;

// Creepy glitch filler words
const char* glitchWords[] = {
"ERROR", "??", "NOISE", "LOOK", "WHY", "#!%", "0000", "VOID", "STOP", "HELP"
};

void drawCentered(const char* text) {
int w = u8g2.getStrWidth(text);
int x = (128 - w) / 2;
u8g2.drawStr(x, 35, text);
}

// Fast glitch flashes
void glitchEffect() {
int flashes = random(4, 10); // random amount to feel alive
for (int i = 0; i < flashes; i++) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_6x10_tr);

int r = random(0, 10);
drawCentered(glitchWords[r]);

} while (u8g2.nextPage());

delay(random(20, 80)); // erratic timing
}
}

unsigned long nextChange = 0;

void setup() {
u8g2.begin();
randomSeed(analogRead(0));

// set first auto-change time
nextChange = millis() + random(2000, 6000);
}

void loop() {
// time to update quote?
if (millis() > nextChange) {

glitchEffect(); // horror glitch
currentQuote++; // next quote
if (currentQuote >= numQuotes) currentQuote = 0;

// schedule next change (2–6 seconds randomly)
nextChange = millis() + random(2000, 6000);
}

// show the current quote
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_6x10_tr);
drawCentered(quotes[currentQuote]);
} while (u8g2.nextPage());
}

Attachments

Step 3: Start to Assemble and Clean!

Unbox your shadow box. Remove the film from your see - through two way mirror. Unlike me, I would urge you to take a second to clean your mirror and the inside of the shadow box well to prevent any dust and fingerprints from showing. Once down, place the shadow box down with the inside facing up and place the mirror down.

Note: When I was working on this, there was some slight confusion of whether I should replace the front glass instead of placing the mirror at the back but unfortunately, my shadow box didn't allow me to. Explore your shadow box options before purchasing. Alternatively, you can also buy a see-through two way mirror that fits inside the frame of the box.

Step 4: Get the Tape Out!

Like I mentioned before, black tape will become your best friend for this project. Unfortunately, because my electronics were bulky, the back panel of my shadow box wasn't able to close (hence why I recommend maybe sizing your see-through two way mirror down). The main goal with this project was to block any light out so the OLED could shine through - so that's what we did! I decided to place my OLED on the bottom right corner of the screen. I started to tape the mirror down. I then positioned my OLED and taped everything down. But, as we can see my breadboard and wires were still hanging out!

Step 5: The Bread Box.

Since my mirror was going to be sitting on my desk and not mounted, I was ok with the back being bulky. I decided to use an amazon box to create a small box for the breadboard on the back. I also did so, so I can have easy access to the electronics and easily be able to plug and unplug the ESP32. I simply measured the breadboard, cut three pieces out, wrapped them each with black tape (for aesthetic purposes only) and hot glue-d them down.

Step 6: Done!

And Voila! I was left with a neat and easily accessible bread box with a functioning smart mirror. Continue to explore different ways of how you'd like to carry this about based on your needs :)

Step 7: How Would You Create This?

This project was truly so fun to make! And not to mention - EASY! I would love to see how you recreate this project but also what your thoughts are on displaying our negativity out in the open. Does this help you rewire and be more aware and kinder? Or do you think we're only adding more negativity to the world? Either way - the mirror and code is yours to play with as you please!