使用 arduino nano DIY小台灯

前段时间忙于项目和比赛,因此没时间捣鼓些小玩意。上星期总算都结束了,然后发现手上有个arduino nano和WS2812,就想着要不做个台灯玩玩,有想法就要动手,走起!


下面先列出我用到的器件

  • arduino nano
  • WS2812
  • T型数据线
  • 三根杜邦线
  • 一个小洞洞板
  • 捡漏的3D打印边角料
  • 热熔胶

好了材料找到了,就开始一步步搭建模型啦!

  1. 底座搭建
    在这里插入图片描述
    可以看到底座由两部分组成,下面是较大的被切了的不规则圆环,上面也是被切了一部分的球体,这两个材料包括后面的台灯盖子都是实验室其他小伙伴玩3D打印剩下的,被我废物利用了,哈哈哈。

  2. 台灯盖子
    在这里插入图片描述
    盖子上面主要放了WS2812,这个模块某宝上有卖,也有源码提供,这里我选用的是环形的24小灯的模块,这里吐槽一下那个焊盘位置,个人感觉小了点,不好焊接,总担心焊不稳,然后就是引出三根导线,分别是DI、5V、GND。

  3. 整体外观
    然后我试着盖上盖子,先看看效果如何
    在这里插入图片描述
    在这里插入图片描述
    好像有台灯的样子,是不是呢?

  4. WS2812与arduino nano连接
    在这里插入图片描述
    nano板是个好东西,便宜又小巧,编程又不难,是用来DIY的不二之选。焊接比较随意,毕竟就用到三个管脚。
    在这里插入图片描述
    在这里插入图片描述

  5. 硬件搭载总体效果
    经过上面的步骤,硬件就搭完了,来看看效果:
    在这里插入图片描述

  6. 代码部分
    现在开始软件的编写啦,代码是卖家送的资料,自己也看了一下,也不难理解,那些主要的驱动代码都封装好了,我们直接用就行了,直接贴出来吧!

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

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

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127,   0,   0), 50); // Red
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// 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) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

还有就是,需要添加头文件的库,这里也分享压缩包给大家:提取码:x9im

  1. 烧录代码
    这个相信不用记录了。直接看效果吧!

  2. 图片展示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    大白天效果不是特别好,然后程序跑得比较快,也可以改代码实现不同的效果。

  3. 视频展示
    看链接吧:
    转B站

小台灯的小DIY到此啦!

发布了17 篇原创文章 · 获赞 47 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42827999/article/details/90603499