# Animated Scrolling "Mario Clouds" TFT Jewelry

## Overview

http://youtu.be/fqcTEZpB780

It's 8-bit retro Mario Clouds! It's so tiny and cute, you can wear it!&nbsp;In this project, we're making Cory Arcangel-inspired Super Mario jewelry using 3D printing and DIY electronics.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/327/medium800/components_hero-cradule.jpg?1413259815)

## Prerequisite Guides

We recommend walking-through the following tutorials below before starting this project. These guides will help you get familiar with the components and get setup and configured with the Arduino IDE and libraries.

- [Introducing&nbsp;Pro Trinket](../../../introducing-pro-trinket)
- [Adafruit Pro Trinket LiPoly/LiIon Backpack](../../../adafruit-pro-trinket-lipoly-slash-liion-backpack)
- [1.44" Color TFT LCD Display with MicroSD Card](../../../../adafruit-1-44-color-tft-with-micro-sd-socket)

![](https://cdn-learn.adafruit.com/assets/assets/000/020/312/medium800/components_parts.jpg?1413256094)

## Parts

We have all the lovely components and tools to build this project in the Adafruit shop. Be sure to check out the featured products on the right sidebar.

- [Pro Trinket](https://www.adafruit.com/products/2000)
- [1.44" Color TFT LCD Display with MicroSD Card breakout](https://www.adafruit.com/product/2088)
- [Trinket LiIon/LiPoly Backpack Add-On](https://www.adafruit.com/product/2124)
- [100mAh battery](https://www.adafruit.com/product/1570)
- [Fast Vibration Sensor Switch (Easy to trigger)](https://www.adafruit.com/product/1766)
- [Breadboard-friendly SPDT Slide Switch](https://www.adafruit.com/products/805)

## Tools & Supplies

You'll need a couple of hand tools and accessories to assist you in the build.&nbsp;

- [Solder Iron](https://www.adafruit.com/products/1204 "Link: https://www.adafruit.com/products/1204") + [Solder](https://www.adafruit.com/products/734 "Link: https://www.adafruit.com/products/734")
- [Silicone&nbsp;Wire](https://www.adafruit.com/products/1877 "Silicone Wire")
- [PLA&nbsp;Filament](https://www.adafruit.com/products/2080 "https://www.adafruit.com/products/2080")
- [3D Printer](https://www.adafruit.com/search?q=3d+printer "Link: https://www.adafruit.com/search?q=3d+printer")
- [Panavise Jr.](https://www.adafruit.com/product/151)
- [Helping Third Hand](https://www.adafruit.com/product/291)

# Animated Scrolling "Mario Clouds" TFT Jewelry

## Code

Our cloud&nbsp;sketch depends on the Adafruit\_GFX, Adafruit\_BusIO and ST7735&nbsp;libraries. Library installation&nbsp;is a common sticking point for beginners…our&nbsp;[All About Arduino Libraries](../../../../adafruit-all-about-arduino-libraries-install-use)&nbsp;guide explains how this is done.

[Click to download Adafruit_GFX library for Arduino](https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip)
[Click to download Adafruit_ST7735 library for Arduino.](https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip)
[Click to download Adafruit_BusIO library for Arduino](https://github.com/adafruit/Adafruit_BusIO/archive/master.zip)
After installing the libraries, restart the Arduino IDE.

The code will work on an **Adafruit Pro Trinket** or an **Arduino Uno**. It makes reference to some specific pins and hardware features (sleep, interrupts, etc.) that may not work on other boards without some code changes and deeper understanding of the hardware.

In order to draw the clouds scrolling nice and smoothly, we write directly to the display buffer on the TFT rather than going thru the nice Adafruit\_GFX helper library.

```auto
// Scrolling cloud pendant for Adafruit Pro Trinket and ST7735R display.
// Inspired by Cory Arcangel's "Super Mario Clouds."
// Triggered with vibration switch between digital pins 3 and 4.

// This is NOT a good learning example for the Adafruit_GFX library!
// To achieve fast frame rates, the code does horrible irresponsible
// things, bypassing the GFX lib and issuing commands &amp; data directly
// to the LCD driver.  It's hardcoded for specific control pins, not
// portable to other displays, and other such crimes.
// Look at the ST7735R library examples for better role models.

// As part of the optimization strategy, everything's drawn sideways;
// clouds scroll "up," not across.  Mount TFT rotated to compensate.

#include &lt;avr/sleep.h&gt;
#include &lt;avr/power.h&gt;
#include &lt;SPI.h&gt;
#include &lt;Adafruit_GFX.h&gt;
#include &lt;Adafruit_ST7735.h&gt;
#include "clouds.h"

#define TFT_CS   10 // Chip select line for TFT  DO NOT CHANGE
#define TFT_DC    8 // Data/command line for TFT DO NOT CHANGE
#define TFT_RST   6 // TFT Reset pin
#define BACKLIGHT 9 // TFT "Lite" pin
#define EXTRAGND  4 // Extra ground pin for vibration switch
                    // Other leg of vibe switch MUST go to pin 3!

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

#define N_CLOUDS 6

struct {          // Cloud structure:
  uint8_t column; // Screen position 0-3
  uint8_t reps;   // Number of middle tiles in cloud (0-3)
  int16_t y;      // Top edge of cloud * 16 (subpixel pos)
  int16_t endy;   // Reset when Y reaches this value
  int16_t prev;   // Pixel position on prior frame
} cloud[N_CLOUDS];

const uint8_t PROGMEM          // For each of the 4 cloud columns...
  xpos[] = { 4, 36, 68, 100 }, // X pixel coordinate
  inc[]  = { 7, 10, 13,  16 }; // Vertical subpixel speed (16 = 1px)
  // The pseudo-parallax scrolling isn't canon, but adds flair(tm).

uint32_t startTime;

void setup(void) {
  randomSeed(analogRead(2));           // Seed randomness from unused input
  DDRB  = DDRC  = DDRD  = 0x00;        // Set all pins to inputs and
  PORTB = PORTC = PORTD = 0xFF;        // enable pullups (for power saving)
  pinMode(BACKLIGHT, OUTPUT);
  digitalWrite(BACKLIGHT, LOW);        // Backlight off
  pinMode(EXTRAGND, OUTPUT);           // Set one pin low to provide a handy
  digitalWrite(EXTRAGND, LOW);         // ground point for vibration switch

  tft.initR(INITR_144GREENTAB);        // Init 1.44" "green tab" screen
  SPI.setClockDivider(SPI_CLOCK_DIV2); // Force 8 MHz SPI for faster refresh
  // Default rotation (0) is used.  Rotation 3 would be cooler (breakout board
  // would hang symmetrically from mounting holes), but experiencing glitches/
  // artifacts when using non-default rotations on this screen; possible
  // MADCTL/CASET/RASET register strangeness to be resolved in library.
  // So the screen must be mounted with the control pins on the left.
  // tft.setRotation(3);
  tft.fillScreen(0x6C3F);              // Sky background
  // Cloud columns are primed to nonsense value so comparisons in
  // randomize() don't have trouble with non-initialized clouds.
  for(uint8_t i=0; i&lt;N_CLOUDS; i++) cloud[i].column = 255;
  for(uint8_t i=0; i&lt;N_CLOUDS; i++) randomize(i, false);

  // AVR peripherals that aren't used by this code are disabled to further
  // conserve power, and may take certain Arduino functionality with them.
  // If you adapt this code to other projects, may need to re-enable some.
  power_adc_disable();    // Disable ADC (no analogRead())
  power_twi_disable();    // Disable I2C (no Wire library)
  power_usart0_disable(); // Disable UART (no Serial)
  power_timer1_disable();
  power_timer2_disable();

  EICRA = _BV(ISC11); // Falling edge of INT1 (pin 3) generates an interrupt
  EIMSK = _BV(INT1);  // Enable interrupt (vibration switch wakes from sleep)

  digitalWrite(BACKLIGHT, HIGH); // Backlight on
  startTime = millis();
}

void loop() {
  uint32_t t = millis();
  int16_t  y;
  uint8_t  i, x, r;

  for(i=0; i&lt;N_CLOUDS; i++) {                           // For each cloud...
    if((y = (cloud[i].y / 16)) != cloud[i].prev) {      // Has it moved?
      if(y &lt; 128) {                                     // Is it on screen yet?
        x = pgm_read_byte(&amp;xpos[cloud[i].column]);      // Horiz pos from table
        // Address window = blit destination rectangle...
        tft.setAddrWindow(x, (y &gt; 0) ? y : 0, x+23, 127);
        // Access ST7735 control pins directly...dirty hack...
        PORTB |=  _BV(0);                               // Data mode
        PORTB &amp;= ~_BV(2);                               // Chip select
        y = blit(tile_a, y);                            // Blit first tile of cloud
        for(r=0; r&lt;cloud[i].reps; r++) y = blit(tile_b, y); // Middle tiles
        blit(tile_c, y);                                // Last tile
        PORTB |= _BV(2);                                // Chip deselect
      }
      cloud[i].prev = y;                                // Record new position
    }
    cloud[i].y -= pgm_read_byte(&amp;inc[cloud[i].column]); // Move cloud (subpixel)
    if(cloud[i].y &lt; cloud[i].endy) randomize(i, true);  // Regenerate?
  }

  if((t - startTime) &gt;= 15000L) {                       // If 15 seconds elapsed...
    digitalWrite(BACKLIGHT, LOW);                       // Backlight off
    PORTB &amp;= ~(_BV(0) | _BV(2));                        // Command + chip select
    for(SPDR = ST7735_SLPIN; !(SPSR &amp; _BV(SPIF)););     // Issue command
    PORTB |= _BV(2);                                    // Chip deselect
    power_spi_disable();                                // Disable remaining periphs
    power_timer0_disable();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);                // Deepest sleep
    sleep_mode();
    // Execution resumes here on wake.
    power_spi_enable();                                 // Re-enable SPI
    power_timer0_enable();                              // and millis(), etc.
    PORTB &amp;= ~(_BV(0) | _BV(2));                        // Command + chip select
    for(SPDR = ST7735_SLPOUT; !(SPSR &amp; _BV(SPIF)););    // Screen on
    PORTB |= _BV(2);                                    // Chip deselect
    delay(120);                                         // Must pause after wake
    digitalWrite(BACKLIGHT, HIGH);                      // Backlight on
    startTime = millis();
  } else if((t = (millis() - t)) &lt; 30) {
    delay(30 - t);                                      // Regular-ish frame timing
  }
}

// Copy data from tile array to screen, w/some clipping.
// Address window must already be set in calling function.
int16_t blit(const uint8_t *ptr,    // -&gt; tile data (in clouds.h)
                   int16_t  y) {    // Position (topmost row) on screen
  uint8_t h = pgm_read_byte(ptr++); // Tile height
  int16_t r = y + h;                // Return value = pos. of next tile
  if((y &lt; 128) &amp;&amp; (y &gt; -h)) {       // Ignore tile clipped fully off screen
    if(y &lt; 0) {                     // Tile clipped partially off top
      ptr += y * -48;               //  Move data pointer to first visible row
      h   += y;                     //  Reduce blit height
    } else if(r &gt; 128) {            // Tile clipped partially off bottom
      h = 128 - y;                  //  Reduce blit height
    }
    uint16_t count = h * 48;        // Number of bytes to transfer
    uint8_t  c;                     // Temp byte storage
    SPDR = pgm_read_byte(ptr++);    // Issue first byte
    while(--count) {                // Do loop control during SPI out
      c = pgm_read_byte(ptr++);     // Fetch next byte during SPI out
      while(!(SPSR &amp; _BV(SPIF)));   // Wait for SPI completion
      SPDR = c;                     // Issue next byte
    }
    while(!(SPSR &amp; _BV(SPIF)));     // Wait for last byte out
  }
  return r;                         // Starting pos. of next tile
}

// Randomize values for one cloud, making sure it doesn't overlap others
void randomize(uint8_t i, boolean offRight) {
  uint8_t j, tries = 0;
  int     iy1, iy2, jy1, jy2, maxy = 2048;

  cloud[i].reps = random(4);     // # tiles repeated in middle (0-3)
  do {
    cloud[i].column = random(4); // Randomize position...
    cloud[i].y      = 16 * (offRight ? (128 + random(64)) :
                      random((2 + cloud[i].reps) * -16, 192));
    iy1 = cloud[i].y;                             // Top of cloud i
    iy2 = iy1 + (2 + cloud[i].reps) * 256 + 15;   // Bottom of cloud i
    for(j=0; j&lt;N_CLOUDS; j++) { // Then test if it overlaps other clouds...
      if((i == j) || (cloud[i].column != cloud[j].column)) continue;
      jy1 = cloud[j].y;                           // Top of cloud j
      jy2 = jy1 + (2 + cloud[j].reps) * 256 + 15; // Bottom of cloud j
      if(jy2 &gt; maxy) maxy = jy2;                  // Track lowest cloud
      if((jy1 &lt;= iy2) &amp;&amp; (jy2 &gt;= iy1)) break;     // Overlap!
    }
  } while((j &lt; N_CLOUDS) &amp;&amp; (++tries &lt; 5));       // Retry until no overlap
  if(tries &gt; 4) cloud[i].y = maxy + 16;           // Give up; move to bottom
  cloud[i].endy = (2 + cloud[i].reps) * -256 - 31;
  cloud[i].prev = -30000;
}

ISR(INT1_vect) { } // Vibration switch wakeup interrupt
```

The graphics data is stored in a separate source file. Use the “new tab” button (near top right of Arduino editor window), name the new file “clouds.h,”&nbsp;then copy and paste the following into it:

```auto
// Cloud bitmaps for scrolling pendant project.

#include &lt;Arduino.h&gt;

// Tiles are stored in a 'raw' 16-bit color format (5/6/5 R/G/B);
// no color table, no run-length encoding.  This keeps the blitting
// function simple and quick.  Each tile requires nearly 800 bytes of
// program space, but it's OK as there's not much else going on.

//        Hi   Lo
#define K 0x00,0x00 // Black
#define W 0xFF,0xFF // White
#define B 0x6C,0x3F // Blue (sky)
#define G 0x04,0xBE // Gray (cloud shadow, alt blue really)

// First byte is height of tile in pixels.

const uint8_t PROGMEM
 tile_a[] = { 16, // Left cloud tile
  B,B,B,B,B,B,B,B,B,K,K,B,B,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,B,B,B,B,K,W,W,K,B,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,B,B,B,K,W,W,W,K,B,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,B,B,K,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,K,K,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,B,
  B,B,B,K,W,W,W,G,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,
  B,B,B,K,W,W,G,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,
  B,B,B,K,W,G,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,
  B,B,K,W,W,G,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,
  B,K,W,W,W,G,G,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,
  B,K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,K,K,K,B,B,B,
  K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,
  B,K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,W,K,
  B,B,K,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K },
 tile_b[] = { 16, // Middle (possibly repeating) cloud tile
  B,K,W,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,
  B,K,W,W,G,G,W,G,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,
  K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,
  B,K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,
  B,K,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,K,K,B,B,B,B,B,
  B,B,K,W,W,G,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,
  B,K,W,W,W,G,G,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,
  B,K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,K,K,K,B,B,B,
  K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,
  B,K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,W,K,
  B,B,K,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K },
 tile_c[] = { 17, // Right cloud tile
  B,K,W,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,
  B,K,W,W,G,G,W,G,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,G,W,W,W,W,K,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,K,B,B,
  K,W,W,G,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,
  K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,
  B,K,W,W,W,G,W,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,
  B,K,W,W,W,W,W,W,W,W,W,W,W,W,W,W,K,K,K,B,B,B,B,B,
  B,B,K,W,W,W,W,W,W,W,W,W,W,W,K,K,B,B,B,B,B,B,B,B,
  B,K,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,B,B,
  B,K,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,B,
  B,B,K,W,W,W,W,W,W,W,W,W,W,W,W,K,B,B,B,B,B,B,B,B,
  B,B,K,W,W,W,W,W,W,W,W,W,K,K,K,B,B,B,B,B,B,B,B,B,
  B,B,B,K,W,W,W,K,W,W,W,K,B,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,K,W,W,K,B,K,W,W,W,K,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,B,K,B,B,B,K,K,K,B,B,B,B,B,B,B,B,B,B,B,B,
  B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B };
```

# Animated Scrolling "Mario Clouds" TFT Jewelry

## 3D Printing

## FDM 3D Printing

These parts are optimized to print with desktop 3D Printers capable of printing in ABS or PLA material with a minimum build area of 100mm x 100mm x 90mm.&nbsp;&nbsp;The two&nbsp;parts are&nbsp;designed to print **without** any support material or raft.&nbsp;

## Printing Tiny Buttons

The buttons are rather small and&nbsp;should be printed separately. These can be painted or printed in different colored filament. We recommend printing these pieces with **slow** feed and travel rates (about 45/50mms).

![](https://cdn-learn.adafruit.com/assets/assets/000/020/311/medium800/components_3d-parts.jpg?1413256044)

[Edit 3D files](http://www.123dapp.com/project/Scrolling%20Clouds%20Jewelry/2929938)
[Download STLs](http://www.thingiverse.com/thing:500966)
## Slicing Software

The recommend settings above should work with most slicing software. However, you are encouraged to use your own settings since 3D printers and slicing software will vary from printer to printer.

## PLA or ABS Material

We recommend using PLA material for an easier print with high quality. The tolerance has been tested with PLA filament, but should also work with ABS. The parts **do not** require any support material or a raft.

# Animated Scrolling "Mario Clouds" TFT Jewelry

## Assembly

This diagram shows the connections to be made:

![](https://cdn-learn.adafruit.com/assets/assets/000/020/381/medium800/components_clouds-diagram.png?1413331209)

The LiPoly backpack sits atop the Pro Trinket on the BUS, G and BAT+ pins, and the power jumpers are modified to connect a switch. This makes for a compact USB-rechargeable design

The vibration sensor switch connects to Pro Trinket pins 3 and 4. We use this to turn on when the necklace is 'tapped'

The remaining connections are:

However,&nbsp; **the Pro Trinket and display are installed&nbsp;back to back,&nbsp;** so the routing won't exactly follow the diagram above…one’s&nbsp;rotated 90 degrees with respect to the&nbsp;other. Also,&nbsp;_much_&nbsp;shorter wire lengths can be used! Here’s the process…

## Lilon / LiPoly Backpack

Prepare the circuit to work with an on-off slide switch by&nbsp;carefully cutting the trace between the&nbsp;two 0.1" holes with a box around them (the battery output line)

![](https://cdn-learn.adafruit.com/assets/assets/000/020/315/medium800/components_trace-removed.jpg?1413257695)

## Add the On/Off Switch

Once that trace is cut, you can solder two wires from the power-switch pads to a switch (like a&nbsp;[slide switch](https://www.adafruit.com/product/805), or a&nbsp;[pushbutton](https://www.adafruit.com/products/1683) one, for example)

![](https://cdn-learn.adafruit.com/assets/assets/000/020/316/medium800/components_slide-switch-tubbed.jpg?1413257820)

## Measure wires

Align the Pro Trinket up with the&nbsp;display and&nbsp;appropriately&nbsp;cut each wire so that it can&nbsp;reach each&nbsp;through-hole.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/317/medium800/components_wire-length.jpg?1413258091)

## LiPoly backpack headers

Solder the included headers onto the LiPoly backpack.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/328/medium800/components_solder-backpack-to-header.jpg?1413310506)

## Display power

Connect the **VIN** pin on the display to **Bat** pin on the LiPoly backpack and solder the LiPoly header pins into&nbsp;the Pro Trinket.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/322/medium800/components_solder-trinket-header.jpg?1413258513)

## Sandwich&nbsp;Pro Trinket

Use two third-helping hands&nbsp;and tweezers&nbsp;to align each wire and through-hole.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/318/medium800/components_align-wires.jpg?1413258210)

## Solder display and Pro Trinket

Follow the circuit&nbsp;diagram and double check each connection before soldering.&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/020/319/medium800/components_complete-circuit-underside.jpg?1413258294)

## Vibration sensor

Insert the vibration sensor into pins 3 and 4. Use flat pliers to grab the ends&nbsp;and bend it over the Pro Trinket. Make sure to avoid covering the reset button.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/320/medium800/components_complete-circuit.jpg?1413258309)

## Fit circuit&nbsp;into enclosure

Insert the completed circuit into the printed case&nbsp;at an&nbsp;angle, port side first.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/329/medium800thumb/components_insert-case.jpg?1448312967)

## Install Slide Switch

Use tweezers to mount the slide switch into the two clips.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/323/medium800/components_slide-switch-insert.jpg?1413259313)

## Mount display

Secure&nbsp;the display to the enclosure with two #4-40x 3/8 flat Philips machine screws.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/326/medium800/components_mount-monitor.jpg?1413259602)

## Back Cover

Add one #4-40 x 3/8 flat Philips machine screw into the chamfered hole on the&nbsp; **cloudCover.stl** part.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/324/medium800/components_back-screw.jpg?1413259467)

## Add buttons

Paint or print each button in a sperate color and glue them on the the front of the **cloudCase.stl** part.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/325/medium800/components_add-btns.jpg?1413259473)

## Make it Wearable

Add a split ring to the top loop of the cover and link it to your favorite necklace.

![](https://cdn-learn.adafruit.com/assets/assets/000/020/330/medium800thumb/components_cloud-loop.jpg?1448312974)

## Wear It

Put it on and show it to your friends! Now you can&nbsp;take your love for 8-bit retroness with you everywhere!


## Featured Products

### Adafruit 1.44" Color TFT LCD Display with MicroSD Card breakout

[Adafruit 1.44" Color TFT LCD Display with MicroSD Card breakout](https://www.adafruit.com/product/2088)
This lovely little display breakout is the best way to add a small, colorful and bright display to any project. Since the display uses 4-wire SPI to communicate and has its own pixel-addressable frame buffer, it can be used with every kind of microcontroller. Even a very small one with low...

In Stock
[Buy Now](https://www.adafruit.com/product/2088)
[Related Guides to the Product](https://learn.adafruit.com/products/2088/guides)
### Adafruit Pro Trinket - 5V 16MHz

[Adafruit Pro Trinket - 5V 16MHz](https://www.adafruit.com/product/2000)
 **Deprecation Warning: The Pro Trinket bit-bang USB technique it uses doesn't work as well as it did in 2014, many modern computers won't work well. So while we still carry the Pro Trinket so that people can maintain some older projets, we no longer recommend it.** Please...

In Stock
[Buy Now](https://www.adafruit.com/product/2000)
[Related Guides to the Product](https://learn.adafruit.com/products/2000/guides)
### Breadboard-friendly SPDT Slide Switch

[Breadboard-friendly SPDT Slide Switch](https://www.adafruit.com/product/805)
These nice switches are perfect for use with breadboard and perfboard projects. They have 0.1" spacing and snap in nicely into a solderless breadboard. They're easy to switch no matter what size fingers you have, but not so easy that they'll get flipped by accident. Work great as...

In Stock
[Buy Now](https://www.adafruit.com/product/805)
[Related Guides to the Product](https://learn.adafruit.com/products/805/guides)
### Lithium Ion Polymer Battery - 3.7v 100mAh

[Lithium Ion Polymer Battery - 3.7v 100mAh](https://www.adafruit.com/product/1570)
Lithium-ion polymer (also known as 'lipo' or 'lipoly') batteries are thin, light, and powerful. The output ranges from 4.2V when completely charged to 3.7V. This battery has a capacity of ~100mAh for a total of about 0.4 Wh. If you need a larger battery, <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/1570)
[Related Guides to the Product](https://learn.adafruit.com/products/1570/guides)
### Adafruit LiIon/LiPoly Backpack Add-On for Pro Trinket/ItsyBitsy

[Adafruit LiIon/LiPoly Backpack Add-On for Pro Trinket/ItsyBitsy](https://www.adafruit.com/product/2124)
If you have an ItsyBitsy or Pro Trinket you probably know it's the perfect little size for a portable project. This LiPoly backpack makes it really easy to do! Instead of wiring 2 or 3 boards together to make a charging system, this little PCB sits on top of the PCB and allows a...

Out of Stock
[Buy Now](https://www.adafruit.com/product/2124)
[Related Guides to the Product](https://learn.adafruit.com/products/2124/guides)
### Fast Vibration Sensor Switch (Easy to trigger)

[Fast Vibration Sensor Switch (Easy to trigger)](https://www.adafruit.com/product/1766)
The "poor man's" accelerometer/motion sensor! These spring-vibration switches are **high sensitivity** non-directional vibration induced trigger switches. Inside is a very soft spring coiled around a long metal pin. When the switch is moved, the spring touches the...

In Stock
[Buy Now](https://www.adafruit.com/product/1766)
[Related Guides to the Product](https://learn.adafruit.com/products/1766/guides)
### USB Patterned Fabric Cable - A/MicroB

[USB Patterned Fabric Cable - A/MicroB](https://www.adafruit.com/product/2008)
Oooh it's so soft! And that beautiful&nbsp;pattern! If you have to have visible cables&nbsp;then you might as well have the nicest fabric bound cable with a eye-catching snake-like pattern. &nbsp;That's why we now carry this standard A to micro-B USB cable&nbsp;for USB 1.1 or 2.0....

No Longer Stocked
[Buy Now](https://www.adafruit.com/product/2008)
[Related Guides to the Product](https://learn.adafruit.com/products/2008/guides)
### PrintrBot Simple Metal 3D Printer - Black - Assembled

[PrintrBot Simple Metal 3D Printer - Black - Assembled](https://www.adafruit.com/product/1760)
New from Printrbot, the Metal Simple is a brand new rock solid, all metal, fully-assembled Printrbot Simple! As opposed to the [Printrbot Simple Kit](http://www.adafruit.com/products/1735), all of the laser cut wood parts have been replaced by rock solid metal and assembled. In...

No Longer Stocked
[Buy Now](https://www.adafruit.com/product/1760)
[Related Guides to the Product](https://learn.adafruit.com/products/1760/guides)

## Related Guides

- [Adafruit 1.44" Color TFT with Micro SD Socket](https://learn.adafruit.com/adafruit-1-44-color-tft-with-micro-sd-socket.md)
- [Happy Chewbacca Mask](https://learn.adafruit.com/happy-chewbacca-mask.md)
- [Adafruit Pro Trinket LiPoly/LiIon Backpack](https://learn.adafruit.com/adafruit-pro-trinket-lipoly-slash-liion-backpack.md)
- [Color Balancing Video Camera Light feat. DotStars](https://learn.adafruit.com/color-balancing-light-box-with-dotstar-cool-warm-white-leds.md)
- [Pro Trinket as a USB HID Mouse](https://learn.adafruit.com/pro-trinket-usb-hid-mouse.md)
- [Purple People Eater](https://learn.adafruit.com/purple-people-eater.md)
- [Animated Flying Toaster OLED Jewelry](https://learn.adafruit.com/animated-flying-toaster-oled-jewelry.md)
- [DotStar Belly Dance Fans](https://learn.adafruit.com/dotstar-belly-dance-fans.md)
- [Adafruit AMG8833 8x8 Thermal Camera Sensor](https://learn.adafruit.com/adafruit-amg8833-8x8-thermal-camera-sensor.md)
- [Watchmen's Sister Night NeoPixel Goggles](https://learn.adafruit.com/watchmen-sister-night-circuitpython-neopixel-goggles.md)
- [LO-LA59 Droid](https://learn.adafruit.com/lola-droid.md)
- [Tent Lantern](https://learn.adafruit.com/tent-lantern.md)
- [Introducing ItsyBitsy 32u4](https://learn.adafruit.com/introducting-itsy-bitsy-32u4.md)
- [Glowing Viking Rune wayFinder](https://learn.adafruit.com/glowing-viking-rune-artifact.md)
- [3D Printed Case for Raspberry Pi Pico](https://learn.adafruit.com/raspberry-pi-pico-case.md)
