NAS Server

ABOUT

After using a plug-and-play QNAP T431 for six years, I ran out of available storage space. Instead of upgrading all four of my one terabyte hard drives just to leave them on the shelf collecting dust, I decided to build my own NAS with more bays. How many drive bays did I need? Well I have 12 additional drives laying around my apartment, so let’s use all of them in the new build for a grand total of 16 hard drives in a single NAS!

COMPONENTS

Cooler Master N400 NSE-400-KKN2 Computer Case

Buy at Amazon.com

Gigabyte X570 UD Rev 1.0 Motherboard

Chipset: AMD X570
Formfactor: ATX

AMD Ryzen 3 3100 CPU

Quad-Core 3.6 GHz Socket AM4 65W 100-100000284BOX Desktop Processor (no graphics)

Samsung 4GB DDR4 RAM (Quantity: 4)

2133MHz PC4-17000 1Rx8 288-Pin CL15 (P/N: M378A5143DB0-CPB)

PNY NVidia Quadro P400 V2 Dedicated GPU (dGPU)

Specs

RAID Controller

LSI SAS 9211-8i PCI Express to 6Gb/s Serial Attached SCSI (SAS) Host Bus Adapter

Docs

Power Supply Unit (PSU)

PowerSpec 650 Watt 80 Plus Bronze ATX Semi-Modular Power Supply

Docs

MODEL FILES

Thingiverse

Catan 3D Game Tiles

ABOUT

Settlers of Catan is one of my favorite board-games and like most tabletop games, it’s constructed with laminated cardboard. While this is sufficient to play the game, I want to due it justice but handcrafting gorgeous hexagon tiles featuring miniature landscapes frozen in time with liquid resin.

THE GAME

Before I start, I need to understand how the Settlers of Catan board works. It’s composed of 19 hexagon land tiles encompassed by six interlocking ocean tiles. The land tiles do not interlock and come in six types: wood (4), brick (4), sheep (4), wheat (3), rocks (3), and sand (1). Respectively, each type is depicted in an image as a forest, clay mine, grassy field, wheat crop, mountain, and a desert. If you look closely, each tile of the same type is slightly different which is a nice attention to detail by the game designers.
(for more info: catan.com)

Game PieceQuantityImageryShape
Logs (alias: wood)4forest / wooded areahexagon
Brick (alias: clay)4clay strip minehexagon
Sheep (alias: wool)4grassy fieldhexagon
Wheat3wheat crop fieldhexagon
Rocks3rocky mountainhexagon
Desert1sandy deserthexagon
Ocean6beach with oceanone edge of hexagon
(interlocking)

THE IDEA

Design hexagon tiles for each resource type using miniature woodland, mountains, and crops scenery.

Spidey Suit

ABOUT

In this project, I create Spider-man costume over the course of a year to transform myself into Spidey for comic-con and other fun activities, such as running around Times Square.

I followed many other more experienced costume makers and learned as much as I could from them while creating my costume. Despite this, I go through two iterations of the suit and blow through several hundred dollars in errors before the final design is done. I love the finished product and learned a ton from sewing spandex, to painting fabric, to rubber molding, and more.

GUIDE

You can find the complete guide on how I built this costume here.

Ancient Egyptian Pharaoh

Work-in-progress…

Main Components

Black and Gold Metallic Sheer Shawl

Buy on Amazon

Black Flipflops

Buy on Amazon

Sapphire Blue Glossy Paint (2 Ounce)

Buy on Amazon

Metallic Gold Cord-Edge Trim

Buy on Amazon

Metallic Gold Heat Transfer Foil for Apparel 12″ X 10″

Note: I drew the falcon on the reverse side, cut out, and ironed on a black t-shirt.

Buy on Amazon

Adjustable Waist Men’s Casual Black Skirt

Note: I removed the lion in the front.

Buy on Amazon

Hydro 9000

ABOUT

In this project, I create a device to water five indoor potted plants by measuring the moisture level in the soil and automatically pumping water when it becomes too dry. The device is powered by a standard 5 volt USB cable and pumps water from a reservoir (I reuse an empty tub of peanut-butter pretzels).

This was the first time I’ve used a 3D printer and it was incredibly fun! I learned how to use an XYZ Da Vinci Mini printer, how not to model parts in CAD, and just how small 8Kb of RAM is. Below is a step by step overview on how I created the Hydro9000.

THE PROBLEM

So…let me start by saying I love having plants indoors. However, my plants don’t seem to last as long as they should…due to a lack of water. SO! The problem is: plants need water and I’m terrible at giving them water.

THE SOLUTION

Water the plants. NO. That’s boring and as stated previously, I kill plants.

THEBETTER SOLUTION

I need to create a machine to water the plants for me! Obviously, I’ll need a control panel, a soil moisture sensor for each plant, a big red emergency stop button, a color display, a key to lock out my roommate, colorful 3D printed housing for the pumps,…okay, okay, let’s get started!

RESOURCES

Github

COMPONENTS

Arduino Mega 2560 R3

Buy at Arduino.cc

Soil Moisture Sensor Module

Buy on Amazon

Prototyping Board for Arduino Mega 2560

Buy on Aliexpress

Step Up Converter
(6V to 12V DV transformer, 3 amps)

Buy on Amazon

SOFTWARE TOOLS

CODING SAMPLE

void setup() {
  Serial.begin(115200);
  Serial.println("Starting...");
            
  Hydro9000::setCurrentMillis(0);
  unsigned char sensorPins[PLANT_COUNT] = {54, 55, 56, 57, 58};
  unsigned char pumpPins[PLANT_COUNT] = {30, 34, 38, 42, 46};
  String plantNames[PLANT_COUNT] = {"Basil", "Cilantro", "Oregano", "Thyme", "Rosemary"};
  for (unsigned int i = 0; i < PLANT_COUNT; i++) {
    MoistureSensor sensor(sensorPins[i]);
    WaterPump pump(pumpPins[i]);

    PlantController plant(sensor, pump);
    plant.name = "plant_"+String(i);
    plant.displayName = plantNames[i];

    hydro.addPlantController(plant);
  }
  
  ControlPanel controlPanel;

  attachInterrupt(digitalPinToInterrupt(SELECT_WHEEL_ENCODER_PIN_A), doEncoderPinARising, RISING);
  attachInterrupt(digitalPinToInterrupt(SELECT_WHEEL_ENCODER_PIN_B), doEncoderPinBFalling, FALLING);
  selectWheel = SelectWheel(SELECT_WHEEL_ENCODER_PIN_A, SELECT_WHEEL_ENCODER_PIN_B);
  selectWheel.readPinA();
  selectWheel.readPinB();
  controlPanel.addSelectWheel(selectWheel);

  /* Add buttons to control panel */
  Button blueButton(BLUE_BUTTON_PIN, BLUE_BUTTON_LED_PIN);
  Button redButton(RED_BUTTON_PIN, RED_BUTTON_LED_PIN);
  Button selectWheelButton(SELECT_WHEEL_BUTTON_PIN);
  Button emergencyStopButton(EMERGENCY_STOP_BUTTON_PIN);
  Button keySwitch(KEY_SWITCH_PIN);
  blueButton.stateWhenButtonPressed = LOW;
  redButton.stateWhenButtonPressed = LOW;
  selectWheelButton.stateWhenButtonPressed = LOW;
  controlPanel.addButton(ControlPanel::ButtonName::BLUE, blueButton);
  controlPanel.addButton(ControlPanel::ButtonName::RED, redButton);
  controlPanel.addButton(ControlPanel::ButtonName::SELECT_WHEEL, selectWheelButton);
  controlPanel.addButton(ControlPanel::ButtonName::EMERGENCY_STOP, emergencyStopButton);
  controlPanel.addButton(ControlPanel::ButtonName::KEY_SWITCH, keySwitch);
  
  hydro.addControlPanel(controlPanel);
  hydro.setup();

  Serial.println("Hydro900 setup complete");
}

void loop() {
  hydro.update();
}