基于ESP32-C3的月球灯

基于ESP32-C3的月球灯

基于ESP32-C3设计的月球灯控制器,需要搭配特定底座和法兰模型使用。
electronics 创客 esp32

零、模型说明

月球模型链接:https://www.thingiverse.com/thing:3242080
法兰、底座模型见附件(.SLDPRT文件为SW 2020创建,请使用2020以上版本打开)。

月球模型需要向热床反法向偏移一定距离,使其具有一定的基准平面安装底座。
接着导入法兰模型,调整到合适的位置使其两者能够良好吻合。
然后合并两者模型,或者直接进行切片(直接切片会有略微挤出溢出-走线重复)。
最后导入打印机打印。
(打印效果见Figure7)

法兰孔建议嵌入M3的土八螺母/铜嵌螺母以获得更好的装配效果。
装配的螺丝采用M3x26(?好像是这个参数,模型不在手边有点忘了,更长也无所谓)。

(好久之前打印的月球模型,当时打印机调教得不好,层纹还是很明显。)

一、效果展示

基于ESP32-C3的月球灯

Figure1 实物图1

基于ESP32-C3的月球灯

Figure2 实物图2

基于ESP32-C3的月球灯

Figure3 爆炸图

二、硬件设计

控制器需要尽可能小巧,因此需要采用体积较小的元件。

2.1 MCU

MCU采用ESP32-C3-MINI-N4,该封装外形小巧,且相对于QFN芯片更易于焊接、外围阻容少。
内置USB JTAG控制器,可以直接使用USB进行烧录,省下一颗USB-TTL芯片的成本和空间(虽然ESP32-C3成本比较高)。
具有WIFI和蓝牙功能,可以接入物联网平台。

2.2 电源管理

电源管理需要满足电池的充电、系统供电的分配和控制。电源架构如下图所示:

基于ESP32-C3的月球灯

Figure4 电源架构

电源管理采用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
(卡其色 103035-1000毫安)

三、软件设计

3.1 按键功能

在按键功能方面,软件需要实现:灯光的开关、灯光亮度切换、灯光颜色的切换。
本项目采用了单个按键的功能复用实现。
分别为:

  • KEY1长按:发光开/关
  • KEY1双击:发光颜色切换(预设5种)
  • KEY1单击:亮度切换(8个亮度等级)

在按键功能复用上,调用了OneButton库予以实现。

3.2 WS2812b控制

WS2812b是一款可编程的RGB灯珠,可以通过程序进行控制。
本项目采用了FastLED库予以实现控制。

3.3 低功耗&物联网

目前续航效果较差,亮度最高状态下约能连续使用6h。
因此,希望通过让MCU闲时进入低功耗状态以降低MCU的部分功耗、提高续航。

物联网后可以使用APP查看灯的状态、控制灯的状态或者接入米家灯。

目前这两个功能仍在开发中(咕咕)。

四、更多图片

基于ESP32-C3的月球灯

Figure5 实物图3

基于ESP32-C3的月球灯

Figure6 实物图4

基于ESP32-C3的月球灯

Figure7 实物图5

基于ESP32-C3的月球灯

Figure8 实物图6(该侧为Type-C接口和复位按键-需要顶针)

基于ESP32-C3的月球灯

Figure9 实物图7(该侧为多功能按键)

基于ESP32-C3的月球灯

Figure10 实物图8

附录

附录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);
}

链接:https://oshwhub.com/carele_i/moonlight


评论:
相关文章
物联网项目开发实战-第3章-自动浇花项目迭代3

本节我们在迭代二的基础上使用四位数码管和OLED显示屏显示相关交互信息。


物联网项目开发实战-第3章-自动浇花项目迭代2

本节我们在迭代一的基础上增加采集土壤湿度数据,并根据湿度数据来决定是否自动进行浇水动作。


物联网项目开发实战-第3章-自动浇花项目迭代1

本节我们实现一个基本能工作的手动浇水装置,即通过按下按键来闭合继发器让小水泵进行浇水。


物联网项目开发实战-第2章-开发环境

本小节通过点亮LED和串口输出两个程序,来初步掌握ArduinoIDE、了解GPIO和串口使用、同时把开发环境与开发板的连接,上传程序的各环节跑通,


小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


ESP32 的中断机制和处理

本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。


在ESP32上实现WEB交互界面

本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。


Arduino ESP32获取芯片、RAM信息

本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


ESP32 GPIO 矩阵和引脚多路复用

ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。

相关创作
这是由一个支持WiFi的ESP32单片机和一个7.5英寸电子墨水屏组成天气显示器。
热度:469
项目是基于 ESP32 处理器的自主 GPS 跟踪器,可以支持常规SIM800扩展板来管理2G GSM通信,并且与大多数3.3V的GPS模块兼容。
热度:354
HoloCubic 是一个带网络功能的伪全息透明显示桌面站,基于ESP32PICO-D4打造。
热度:318
基于ESP32-S3,板载1.69寸LCD总成接口、蜂鸣器、SD卡槽、AXP173电源管理,双排母引出大部分引脚供底板拓展功能。
热度:138
本项目是以ESP32为核心,打造一个多功能集合的综合性极强的小模块。
热度:113
OMOTE是一个基于ESP32-PICO-D4的开源通用遥控器。它的电容式2.8英寸触摸屏为切换设备和设置提供了直观而快捷的用户界面。
热度:93
基于ESP32的电子墨水屏日历,支持通过 OpenWeatherMap 实现天气显示等功能。
热度:89
LILYGO TTGO T-Watch-2020编程开发可穿戴设备 ESP32可编程手表
热度:70
用树莓派做了个产品级磁带随身听,好看又好听,开源了!
热度:70
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。