## 更新日志
* 2024.01.20:最初开源该项目 Ver2.4
* 2024.01.20:可以将D1移除、D2短接,以得到更好的供电效果,等待重新打板。
## 零、模型说明
月球模型链接:[https://www.thingiverse.com/thing:3242080](https://www.thingiverse.com/thing:3242080)
法兰、底座模型见附件(.SLDPRT文件为SW 2020创建,**请使用2020以上版本打开**)。
**月球模型需要向热床反法向偏移一定距离,使其具有一定的基准平面安装底座。
接着导入法兰模型,调整到合适的位置使其两者能够良好吻合。
然后合并两者模型,或者直接进行切片(直接切片会有略微挤出溢出-走线重复)。
最后导入打印机打印。
(打印效果见Figure7)**
法兰孔建议嵌入M3的土八螺母/铜嵌螺母以获得更好的装配效果。
装配的螺丝采用M3x26(?好像是这个参数,模型不在手边有点忘了,更长也无所谓)。
(好久之前打印的月球模型,当时打印机调教得不好,层纹还是很明显。)
## 一、效果展示
![IMG_20240114_125813.jpg](//image.lceda.cn/pullimage/T4XTn2JWdIimCjbaS3HwD8F9zsHZcrpPwwVpsnYC.jpeg)
<center>Figure1 实物图1</center>
![IMG_20231004_181830.jpg](//image.lceda.cn/pullimage/6lMFR3VBtta0PA6Y7B988i8fjOLf8iuTM7pWi9Cd.jpeg)
<center>Figure2 实物图2</center>
![IMG_20240114_130129.jpg](//image.lceda.cn/pullimage/JMLoKohbPdQBS2LRKb9vR76JmL5GZQxCAcWpszIJ.jpeg)
<center>Figure3 爆炸图</center>
## 二、硬件设计
控制器需要尽可能小巧,因此需要采用体积较小的元件。
### 2.1 MCU
MCU采用ESP32-C3-MINI-N4,该封装外形小巧,且相对于QFN芯片更易于焊接、外围阻容少。
内置USB JTAG控制器,可以直接使用USB进行烧录,省下一颗USB-TTL芯片的成本和空间(虽然ESP32-C3成本比较高)。
具有WIFI和蓝牙功能,可以接入物联网平台。
### 2.2 电源管理
电源管理需要满足电池的充电、系统供电的分配和控制。电源架构如下图所示:
![电源架构.png](//image.lceda.cn/pullimage/Q9QI7uaZdGMBkirRpIZNbc0CcvmikQ6Z2L8tfaAm.png)
<center>Figure4 电源架构</center>
电源管理采用ETA6002。
### 2.3 灯光
那必须要有 R!G!B!
采用了较为主流的WS2812b灯珠。选用更小封装的型号可能会更好,但由于手头还有不少5050封装的,因此就直接用了。
由于空间有限,只放进了两颗,亮度比较有限。
但,应该没人用这玩意照明吧?
### 2.4 电池
选用了一个尺寸为L35W30H10mm的聚合物电池,容量为1000mAh。
电池链接:[https://item.taobao.com/item.htm?id=589740856789&spm=a1z10.1-c.w4004-22660760862.4.2c3e7f05jPE9V6&skuId=4258503775257](https://item.taobao.com/item.htm?id=589740856789&spm=a1z10.1-c.w4004-22660760862.4.2c3e7f05jPE9V6&skuId=4258503775257)
(卡其色 103035-1000毫安)
## 三、软件设计
### 3.1 按键功能
在按键功能方面,软件需要实现:灯光的开关、灯光亮度切换、灯光颜色的切换。
本项目采用了单个按键的功能复用实现。
分别为:
* KEY1长按:发光开/关
* KEY1双击:发光颜色切换(预设5种)
* KEY1单击:亮度切换(8个亮度等级)
在按键功能复用上,调用了`OneButton库`予以实现。
### 3.2 WS2812b控制
WS2812b是一款可编程的RGB灯珠,可以通过程序进行控制。
本项目采用了`FastLED库`予以实现控制。
### 3.3 低功耗&物联网
目前续航效果较差,亮度最高状态下约能连续使用6h。
因此,希望通过让MCU闲时进入低功耗状态以降低MCU的部分功耗、提高续航。
物联网后可以使用APP查看灯的状态、控制灯的状态或者接入米家灯。
目前这两个功能仍在开发中(咕咕)。
## 四、更多图片
![IMG_20240114_125949.jpg](//image.lceda.cn/pullimage/BDb8VLfI14GUi64QFYkzRoRfO4UeW1ajRLkpng4T.jpeg)
<center>Figure5 实物图3</center>
![IMG_20240114_130339.jpg](//image.lceda.cn/pullimage/2A5GMzuV1ggNepYe5X2MyHxkOWsIDy9hIdKMQlAb.jpeg)
<center>Figure6 实物图4</center>
![IMG_20240114_125916.jpg](//image.lceda.cn/pullimage/M0Ulp0KyHJ3a5622A7AQlppSxP3MWcVPeDp9hBZ8.jpeg)
<center>Figure7 实物图5</center>
![IMG_20240114_130339.jpg](//image.lceda.cn/pullimage/qGIWxoaWFHmsvbTeHYn8jhlXiS6oi3yWacc9V2Fm.jpeg)
<center>Figure8 实物图6(该侧为Type-C接口和复位按键-需要顶针)</center>
![IMG_20240114_130354.jpg](//image.lceda.cn/pullimage/eG2T4BPWFiJnzwTCTW019dYtkMFhs4RTM2iNkkwT.jpeg)
<center>Figure9 实物图7(该侧为多功能按键)</center>
![IMG_20231004_163601.jpg](//image.lceda.cn/pullimage/JCmxJXSGFbUn1xEFb52PGtuirX3toemyasPmxV7E.jpeg)
<center>Figure10 实物图8</center>
## 附录
### 附录1:源代码
```
#include <Arduino.h>
#include <FastLED.h>
#include "OneButton.h"
// FastLED
#define NUM_LEDS 2 // LED灯珠数量
#define DATA_PIN 10 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 255; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立光带leds
// OneButton
#define button1_Pin 5
OneButton button1(button1_Pin, true);
// 变量
unsigned char status=0; // LED开关状态
unsigned char brightness=0; // 亮度状态
unsigned char colorStatus=0; // 颜色状态
// 函数
void click1()
{
if(status)
{
brightness+=32;
FastLED.setBrightness(brightness);
FastLED.show();
if(brightness<10)
{
brightness=0;
}
}
}
void doubleclick1()
{
if(status)
{
colorStatus++;
switch(colorStatus)
{
case 0: fill_solid(leds, 2, CRGB::White);break;
case 1: fill_solid(leds, 2, CRGB::LightBlue);break;
case 2: fill_solid(leds, 2, CRGB::LightCoral);break;
case 3: fill_solid(leds, 2, CRGB::Pink);break;
case 4: fill_solid(leds, 2, CRGB::MediumPurple);break;
case 5: fill_solid(leds, 2, CRGB::Gold);break;
case 6: colorStatus=0;
}
FastLED.show();
}
}
void longPressStart1()
{
status=!status;
if(status & brightness==0)
{
brightness=128;
}
else if(!status)
{
brightness=0;
}
FastLED.setBrightness(brightness*status);
FastLED.show();
}
void setup() {
// put your setup code here, to run once:
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(brightness); // 设置光带亮度
fill_solid(leds, 2, CRGB::White);
FastLED.show();
button1.attachClick(click1);
button1.attachDoubleClick(doubleclick1);
button1.attachLongPressStart(longPressStart1);
}
void loop() {
// put your main code here, to run repeatedly:
button1.tick();
delay(50);
}
```
17
22
收藏到专辑