Project tutorial
Made of Mars + Adafruit Circuit Playground Express + DFRobot

Made of Mars + Adafruit Circuit Playground Express + DFRobot © CC BY-SA

An outfit made of Martian material. It provides awareness of its environment. Let's protect the Earth even if we can move to Mars.

  • 20 respects

Components and supplies

Necessary tools and machines

sewing machine (generic)
Hy gluegun
Hot glue gun (generic)

Apps and online services

About this project

This project began as a design challenge when my friend, J.R. Skok (a planetary geologist at the SETI Institute), provided me a bunch of basaltic fabrics to make something fashionable. These fabrics were made of volcanic lava, which were mined, melted, pulled into threads and woven into fabrics. Basalt is the most common rock on Mars but is also found throughout the Earth in places like Hawaii and Iceland and on the volcanoes of most continents. Designing with fabrics made from volcanoes on Earth is a fascinating connection to our planet and a critical step toward learning how to build on other worlds. J.R. has been working with these fabrics for their potential to be made wherever basalt is common, but other fabrics are rare. Maybe one day when humans visit Mars, we'll be using items made of these rocks.

While I was trying to master constructions using these fabrics, I couldn't help but thinking when and why we would ever want to visit Mars. Apart from our scientific curiosity and exploration, could it be caused by in-habitability of the Earth environment? Thus, I embedded an optical dust sensor from DFRobot and used the temperature sensor on Adafruit Circuit Playground Express in the hope to make us be more aware of air pollution and global warming.

Introducing to you, Made of Mars fashion design.

1. Handbag and purse

1.1. Material selection

Although I had a vision of the dress, I started making simpler items first to get used to the materials. There are a few different kinds of the basalt rock fabrics. The threads were woven in different ways, creating different touches and stretches of the fabrics. They are all a bit rigid, made of a mildly flexible sort of glass, so the edges tend to fall apart if not protected. Some fabrics are stabilized with aluminum foils. This kind tends to be very good for making stiff structures. Thus, I used this type to make the base of a handbag and a purse. (See description of the fabrics here ) There are two other kinds of basaltic fabrics I used which will be described later.

1.2. Sewing

I drew and cut out a pattern for a semi-circular bag and sewed the patterns together to get the initial shape. (I didn't use an existing pattern. Just dreamed up some patterns that would give me the correct 3D shape.) Surprisingly, even though the fabric was quite thick and had aluminum foil on one side, it was pretty easy to sew on a normal sewing machine.

Next is the lining. I found some very beautiful mesh-like fabrics with denim decorations on it. They match very well with the color of the basaltic fabrics, which has a dark, golden luster to it.

Then I folded the edges and sewed them inside another piece of fabric. This way, the finishing looks seamless. This other type of fabric is very interesting. The way threads were woven in made the fabric stretchy in one direction and can be very flexible. They come in a belt. The strands of threads can also be separated. I inserted yet another type of basaltic fabric, or rather it's a thin rope, through the gaps between the strands. This rope made up a strap for the bag.

One thing to note is that whenever you cut the fabrics (other than the one with aluminum foil), you need to hold the ends together, otherwise the threads will fall apart. I used plastic tapes to stick the threads together. These were all folded and sewn inside the linings. So the tapes are invisible :)

1.3. Embellishment

Tassels are really in fashion this year (don't know who defines the trends). When I first saw these basaltic fabrics, my first reaction was to combine it with tassels. Because the fabrics look very much like straws. I decorated the bare bag with bright and colorful tassels, fluffs and ribbons.

The first Martian tassel bag was born!

While complexity of a tassel bag was worth pursuing, minimalism is also attractive. In addition, because the dress I had in mind would have fewer colors, I decided to make another purse that would match with the dress better. Here's what I came up with.

The design of this purse fully takes advantage of the different textures of materials. One could put a tablet in it.

2. The dress

Alright, in the above photo you already noticed the unfinished dress in the background. Here's the construction process.

2.1. Base

As mentioned in my previous project, a basic pattern can be used to guide sizing. Then modify details to make your design. I found a basic tube dress and cut out the fabric based on the right size.

2.2 Martian materials

As the belt-type basaltic fabric mentioned above gives really good structure, I wanted to use it to make a prominent collar.

And decorate the whole dress with it.

3. Circuits

Now the fun part.

As a common theme in many of my projects, I usually start by testing out the components. For the optical dust sensor, most existing projects are built on Arduino Uno. I referred to this project by mybotic and made sure my circuit behaved in the correct way. (I didn't have a 150 Ohm resistor so I used a 100+47 Ohm in series.)

Then I can replace the Arduino Uno with an Adafruit Circuit Playground Express, because the latter is more wearable and already has a temperature sensor on the board. But before soldering I always test out the circuit first.

The code provided below combines the dust sensing with one of the Circuit Playground examples called "analog_sensors". It can be found in the Adafruit Circuit Playground examples after you download the library. Here to learn how to use Adafruit Circuit Playground Express.

The value of the dust sensor will trigger a buzzing sound at a frequency scaled with the dust reading. Every time the wearer resets the circuit, the buzzer will make a pitch. The colors of the NeoPixels are defined by the temperature reading. This way, the sound and colors are the outputs that alerts the wearer about their environment.

The fabric is see-through and I can leverage that for subtle lighting by putting the Circuit Playground inside. The dust sensor needs to be outside. Therefore, before soldering, the wires should be fed through the fabrics.

Because this would mean taking off the wires from the board, I came up with a trick to remember which wire goes into which pin without needing to refer to a schematics. I left the color coded clips on and will take one off for soldering at a time, corresponding to the color coded wires.

Use heat shrink tubing to protect the soldered joints. Also do not solder the wires from the dust sensor directly onto the pins. Rather, add a section of wire to each dust sensor wire to compensate the additional length added by the two resistors on one of the wire already.

Bind the cables together with a tape and glue the taped section onto the fabric inside. This will create a stress release so the soldering joints are less likely to break.

Plug in the battery and play!

4. Photography

One more interesting aspect about these design projects is experimenting with photography. J. R. Skok also gave me these cute solar system planets from AstroReality. These are globes that can actually be viewed on AR.

I hope one day I'll make an AR dress and experience flying to Mars.

More photos on


Made of Mars Kitty YeungArduino
Reference code from Adafruit Circuit Playground Express "analog_sensor" example and dust sensor on Arduino UNO
// Circuit Playground Analog Sensor Demo
// Shows how to read an analog sensor like temperature, light,
// sound, or even external inputs and convert the analog value
// to color and sound on the board.  Will light up NeoPixels
// with a color proportional to the analog value, and if the slide
// switch is turned to the left will play a music tone proportional
// to the value.
// Code for optical dust sensor refer to

#include <Adafruit_CircuitPlayground.h>
#include <Wire.h>
#include <SPI.h>

// Change the analog input value below to try different sensors:
#define ANALOG_INPUT  A3  // Specify the analog input to read.
                          // Circuit Playground has the following
                          // inputs available:
                          //  - A0  = temperature sensor / thermistor
                          //  - A4  = sound sensor / microphone
                          //  - A5  = light sensor
                          //  - A7  = pin #6 on board
                          //  - A9  = pin #9 on board
                          //  - A10 = pin #10 on board
                          //  - A11 = pin #12 on board
#define ANALOG_INPUT2  A0

// These defines set the range of expected analog values.
// This is used to scale the NeoPixels, sound, etc.
#define VALUE_MIN     0
#define VALUE_MAX     200

// These defines set the range of pixel color when mapping
// to the sensor value.
#define COLOR_RED_MIN    255  
#define COLOR_GREEN_MIN  0
#define COLOR_BLUE_MIN   0

#define COLOR_RED_MAX    0
#define COLOR_GREEN_MAX  0
#define COLOR_BLUE_MAX   255

// These defines set the range of sound frequencies when
// mapping to the sensor value.
#define TONE_FREQ_MIN    523  // C5 note
#define TONE_FREQ_MAX    988  // B5 note

// Initialize and define optical dust sensor
int measurePin = A3;
int ledPower = 2;

unsigned int samplingTime = 280;
unsigned int deltaTime = 40;
unsigned int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup() {
  // Setup serial port.
  Serial.println("Circuit Playground Analog Sensor Demos!");

  // Setup optical dust sensor

  // Setup Circuit Playground library.

void loop() {
  // Get the sensor value and print it out (can use serial plotter
  // to view realtime graph!).
  uint16_t value = analogRead(ANALOG_INPUT);
  uint16_t value2 = analogRead(ANALOG_INPUT2);
  Serial.println(value, DEC);
  Serial.println(value2, DEC);

// Measure optical dust sensor and print in serial monitor

  voMeasured = analogRead(measurePin);


  calcVoltage = voMeasured*(3.3/1024.0);
  dustDensity = 0.17*calcVoltage-0.1;

  if ( dustDensity < 0)
    dustDensity = 0.00;

  Serial.println("Raw Signal Value (0-1023):");


  Serial.println("Dust Density:");

  // Map the sensor value to a color.
  // Use the range of minimum and maximum sensor values and
  // min/max colors to do the mapping.
  if(value2 < VALUE_MIN)      value2 = VALUE_MIN;
  else if(value2 > VALUE_MAX) value2 = VALUE_MAX;
  int red   = map(value2, VALUE_MIN, VALUE_MAX, COLOR_RED_MIN  , COLOR_RED_MAX);
  int blue  = map(value2, VALUE_MIN, VALUE_MAX, COLOR_BLUE_MIN , COLOR_BLUE_MAX);
  // Gamma correction gives a more linear appearance to brightness ranges
  red   = CircuitPlayground.gamma8(red);
  green = CircuitPlayground.gamma8(green);
  blue  = CircuitPlayground.gamma8(blue);

  // Light up all pixels with the color.
  CircuitPlayground.setPixelColor(1, red, green, blue);
  CircuitPlayground.setPixelColor(2, red-128, green, blue);
  CircuitPlayground.setPixelColor(3, red, green-128, blue);
  CircuitPlayground.setPixelColor(4, red, green, blue-128);
  CircuitPlayground.setPixelColor(5, red-128, green-128, blue);
  CircuitPlayground.setPixelColor(6, red, green-128, blue-128);
  CircuitPlayground.setPixelColor(7, red-128, green, blue-128);
  CircuitPlayground.setPixelColor(8, red-128, green-128, blue-128);
  CircuitPlayground.setPixelColor(9, red-200, green, blue);
  CircuitPlayground.setPixelColor(0, red, green-200, blue);


  // min/max colors to do the mapping.
  if(value < VALUE_MIN)      value = VALUE_MIN;
  else if(value > VALUE_MAX) value = VALUE_MAX;
  // Map the sensor value to a tone frequency.
  int frequency = map(value, VALUE_MIN, VALUE_MAX, TONE_FREQ_MIN, TONE_FREQ_MAX);
  // Play the tone if the slide switch is turned on (to the left).
  if (CircuitPlayground.slideSwitch()) {
    // Play tone of the mapped frequency value for 1000 milliseconds.
    CircuitPlayground.playTone(frequency, 1000);
  // Delay for a bit and repeat the loop.


Pin connections
I used A3 for dust sensor analogue pin to avoid sharing pins with other sensors on Adafruit Circuit Playground Express. The diagrams are from
F952yuhiqhiul3i large njlsnhetyf
Optical dust sensor pin assignments
Diagram from
Fv7aezhiqhiurv5 large fxe1m2wg2l


Similar projects you might like

Laser, Robe, Star Wars?! - Versalume + Adafruit Gemma

Project tutorial by Kitty Yeung

  • 11 respects

Mini Me 1.5 - Adafruit HUZZAH Robot Doll

Project tutorial by Kitty Yeung

  • 31 respects

Beautifully Finished Humidity and Temperature Sensor

Project tutorial by Wicked Makers

  • 162 respects

Flowers - Arduino Nano, CrazyCircuits, DFRobot

Project tutorial by Kitty Yeung

  • 31 respects

Temperature sensor

Project tutorial by Grant

  • 57 respects

Ultimate Cough Recognition: How Dangerous is Coughing?

Project tutorial by corey yin

  • 17 respects
Add projectSign up / Login