Introduction: Neopixel Facemask Using Arduino

In today's blog post, we have a super interesting and cool project. we will make a Neopixel LED facemask using arduino!

We will make use of neopixel (WS2812B) LEDs and turn our boring mask into a litt! ( literally lit! ) facemask and stop the spread of COVID-19 with style and creative tech!

Supplies

  1. Neopixel LEDs ( WS2812b) banggoodgearbestAmazon India
  2. Arduino pro mini banggoodGearbestAmazon India
  3. Lithium Ion Cells ( 18650 ) GearbestAmazon India
  4. Lithium Ion cell holder (2s) Amazon India
  5. On Off Switch BangoodAmazon India
  6. Push Button Switch Amazon India

Step 1: Watch the Video!

Step 2: Measure and Cut L.E.D's

First thing we need to do after gathering all the required parts is to measure the appropriate length of LED strip and cut them so that it fits the mask exactly.

steps:

  1. remove the Waterproof sleeve ( if present ).
  2. keep the LED strip over mask, mark and measure required length of LED strip.
  3. cut the LED at appropriate cutting spot using scissors.

Step 3: Solder L.E.D's

There are 3 connection points or terminals for a Neopixel ( WS2812B ) LEDs which are VCC, DATA and GND.

We need to solder the LEDs strips to each other in series manner, that is connecting VCC to VCC, DATA to DATA, GND to GND of each LED strip.

steps:

  1. pre-tin the Solder pads of each LED strip on both sides to prepare LEDs for next step. ( refer This Post! for detailed soldering tutorial ).
  2. pre-tin 5 set of 3 wires ( preferably red, green, white color coded for VCC, DATA, GND ).
  3. arrange LED strips in series and continuous manner, making sure direction of arrow is continuous.
  4. solder VCC, DATA, GND of all strips in series.
  5. solder longer wire at start of strip so that we can route the controller inside our pocket or bag pack.

Step 4: Sew L.E.D's on Mask

Once our LEDs are soldered, we can proceed with getting those LEDs on mask, using needle and thread.

steps:

  1. place the LEDs facing outside ( black side or non LED side ) towards you.
  2. start sewing from left most end.
  3. sew all the LEDs on the mask keeping pinky finger gap between each LED so that diffusion is quite good.

( P.S. if you are not good at sewing ask help from your parents or siblings )

Step 5: Connections & Coding

for the circuit or controller, we will be using Arduino pro mini, but any similar Arduino or any microcontroller can be used for this project.

Connections are as below:

for Arduino Pro Mini and LED strip:

VCC to RAW

DATA to D6

Ground to Ground

ON OFF Switch:

positive of battery to Raw of Arduino

negative of battery to ground of Arduino.

PUSH Button:

First Terminal of Push button to D2 of Arduino

Second Terminal to Ground.

( Connection Diagram and Fritzing file attached in this step )

Coding:

For the coding part, we are using Adafruit’s Neopixel library's Button Cycler example.

so the only thing u need to change in code is number of LEDs in this circuit, so simply count the number of individual LEDs and make necessary changes ( for my case it is 141 LEDs ) and upload the code.

/*==========================================================================   

Neopixel LED Facemask using Arduino
by "Akshay Momaya"
for "Mission Critical" ( youtube )
******subscribe for more arduino projects and tutorials******

https://www.youtube.com/channel/UCM6rbuieQBBLFsxszWA85AQ?sub_confirmation=1


==========================================================================*/




#include <Adafruit_NeoPixel.h>

#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.

#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.

#define PIXEL_COUNT 141

// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

bool oldState = HIGH;
int showType = 0;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);

  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }

  // Set the last button state to the old state.
  oldState = newState;
}

void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
            break;
    case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
            break;
    case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
            break;
    case 7: rainbow(20);
            break;
    case 8: rainbowCycle(20);
            break;
    case 9: theaterChaseRainbow(50);
            break;
  }
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

( Code .ino file added in this step)

Step 6: Enclosure

Everything looks great so far, but to make a practical use of this project, we need a case, for that i used Fusion 360 Software by Autodesk and measured all the required dimensions.

we made this Enclosure in 2 parts so that it is easy to be printed as well easy to be used in real life. At last the STL file from the 3D model was sliced on pruca slicer and printed it using my Ender 3 3D printer.

Once the print was completed, l route the wires, soldered the wires at appropriate locations and close the case. Once that is done, the entire result looks just stunning!

( STL files can be found here! )

Step 7: Done!

Congratulations, we have made to the end of this post and learnt how we can easily make a Neopixel Facemask using Arduino.

If you enjoyed this blog post or project, consider supporting our work by subscribing to our Youtube Channel and following our Social media handles, your support means a lot to us and motivates us to keep making awesome content!

Social Media Handles: Patreon, Twitter, Instagram, Facebook.

Battery Powered Contest

Runner Up in the
Battery Powered Contest