发作品
专业版

智能炫彩空气净化器【星火计划】

6.3k
0
0
14
简介:这是一个基于esp wroom 32e制作的带RGB的支持小爱同学控制的智能桌面空气净化器(已验证)
星火计划2024
开源协议:GPL 3.0(未经作者授权,禁止转载)
创建时间:2024-05-22 17:43:28更新时间:2024-05-29 18:06:50

描述

这是一个基于esp wroom 32e制作的带RGB的支持小爱同学控制的智能桌面空气净化器

 

强烈建议看完这个视频,里面包含了本项目的初衷,原理,功能,效果展示等等

空气净化器基本介绍(点击跳转B站)

 

概览

1.说明&注意事项

2.原理图与pcb展示

3.代码展示

4.外壳展示

5.嘉立创工程文件

6.附件

 

说明&注意事项:

1.风扇选择:3pinRGB的电脑风扇,12cm*12cm*2.5cm,我用的是立民的B12,12cm的电脑风扇做的空气净化器论净化性能肯定不会特别强,我做的目的也不是要极大的改善宿舍的空气,而是提供一个小范围的净化(不然也不叫桌面空气净化器了)的同时提供不错的装饰效果(RGB灯光以及填补桌面的空缺区域,同时要控制噪音,我这个空气净化器的噪音比我的幻14打3a的噪音小不少,开安静模式基本就没啥声音了,除非你凑近听)如果想要追求更好的效果,可以更换更大的更强的风扇的滤芯,我做的这个板子其实就是一个控制器,理论上你可以选择更大的电脑风扇,14cm的、20cm的都行,只要是12v的支持argb的就ok,我的桌面放12cm的就差不多了,再大外壳就没多少位置放器件和线了(外壳尺寸也改不了,桌面给他的位置就这么多),总之建议各位先观看上面的视频pcb中的1x3P和1x2P排针不需要焊,改为焊接买来的风扇的排线(直接剪下来),风扇排线的顺序我不清楚各品牌是否一致,我买的接线顺序如图

2.滤芯选择:本人最后使用了直径为20cm,高273cm的华为c350pdd版,后期改进的模型(本开源文章中的)也是基于这个尺寸设计的,也可以选择便宜一点的小米pdd版滤芯(直径一样,高293左右)以及其他任意滤芯,但需要自行设计外壳,我只提供了设配自己滤芯的外壳(见本文章的附件),如果你在纠结小米和华为的pdd滤芯哪个好,我个人建议加点钱买适配华为净化器c350的那款(小米华为仅仅只的是pdd滤芯适配的型号、品牌)

3.烧录代码:使用Arduino IDE,下载esp32的开发板文件、点灯科技的库(不懂就百度、b站搜),复制黏贴我下面放的代码(附件也有)即可,需要修改:

char auth[] = "点灯科技密钥";
char ssid[] = "WiFi名称";
char pswd[] = "WiFi密码";

其中点灯科技密钥获取(以及接入米家小爱同学)可以参考这个视频点击跳转B站

4.如果灯珠不能全亮等,可以更改NUM的值,我用的是15,慢慢找直到找到适配你的风扇的数字即可

5.我在烧录时遇到了主控供电不足反复重启的情况,找到的原因是插上的usb转ttl的3.3V供电不够稳定,改用拓展坞插c口线直接供电加usb转ttl连串口线和地线(3.3v不能插)解决,如果遇到了ttl供电能力不足的情况可以参考这个方法

6.原始的小爱控制指令不是空气净化器怎么怎么样,需要去小爱同学的训练计划自行添加

7.外壳的打印我用的是R3D的白色经济款PETG,打印机用的是拓竹P1SC,填充密度改为8%,不要BRIM,耗材大约900g(价格24元左右,算30的耗材成本吧)。其他材料也都可以,我直接提供SW文件了

8.外壳的最后一个小板是在连接完所有东西后盖上主控部分的盖子,合上后长这样:

9.连接的电源可以直接用5V1A的头(这个空气净化器的功耗很低,不用大功率充电头),我加了一个带开关的usb延长线再接C口线,建议你也这么干,PCB上的开关仅仅是调试时用的

10.pcb建议选esp32版本的,不要选esp8266的,具体原因看上面的视频
11.这个空气净化器其实还有很多功能可以完善可以加,但我只做满足自己需求的东西,目前这玩意对我而言就以及非常OK了,如果你想把它进一步完善,以及做了其他滤芯的外壳,欢迎发到评论区
12.这是我第一次尝试做小产品,就结果而言,我觉得成品的效果很不错了,自己非常满意,我觉得这个产品是很实用的,当然,如果其中存在设计的问题,欢迎各路大佬指教!

 

原理图

(esp32 版本)

PCB

(esp32 版本)

代码:

#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT

#include <Blinker.h>
#include <Adafruit_NeoPixel.h>

char auth[] = "点灯科技密钥";
char ssid[] = "WiFi名称";
char pswd[] = "WiFi密码";

#define PINe           26
#define PINp           27
#define PINl           25
#define NUM            15

Adafruit_NeoPixel rgbled = Adafruit_NeoPixel(NUM, PINl, NEO_GRB + NEO_KHZ800);

uint8_t wsMode = BLINKER_CMD_MIOT_COLOR;
uint8_t ledmode=1;
uint8_t fanmode=1;
bool wsState = true;
short int red[384],green[384],blue[384];
short int gap=384/NUM;
short int c=0;

// 按下按键即会执行该函数
void miotPowerState(const String & state)
{
    BLINKER_LOG("need set power state: ", state);

    if (state == BLINKER_CMD_ON) {
        ledmode=1;
        fanmode=1;
        fan();
        wsState = true;
        BlinkerMIOT.powerState("on");
        BlinkerMIOT.print();
    }
    else if (state == BLINKER_CMD_OFF) {
        ledmode=0;
        fanmode=0;
        fan();
        wsState = false;
        BlinkerMIOT.powerState("off");
        BlinkerMIOT.print();
    }

}

void miotMode(uint8_t mode)
{
    BLINKER_LOG("need set mode: ", mode);

    if (mode == BLINKER_CMD_MIOT_DAY) {
        ledmode=0;
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_NIGHT) {
        ledmode++;
        if(ledmode>4){
          ledmode=0;
        }
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_COLOR) {
        fanmode=0;
        fan();
        // Your mode function
    }
    else if (mode == BLINKER_CMD_MIOT_WARMTH) {
        fanmode++;
        if(fanmode>2){
          fanmode=0;
        }
        fan();
        // Your mode function
    }

    wsMode = mode;
    BlinkerMIOT.mode(mode);
    BlinkerMIOT.print();
}

void miotQuery(int32_t queryCode)
{
    BLINKER_LOG("MIOT Query codes: ", queryCode);

    switch (queryCode)
    {
        case BLINKER_CMD_QUERY_ALL_NUMBER :
            BLINKER_LOG("MIOT Query All");
            BlinkerMIOT.powerState(wsState ? "on" : "off");
            BlinkerMIOT.mode(ledmode);
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
            BLINKER_LOG("MIOT Query Power State");
            BlinkerMIOT.powerState(wsState ? "on" : "off");
            BlinkerMIOT.print();
            break;
        case BLINKER_CMD_QUERY_MODE_NUMBER :
            BLINKER_LOG("MIOT Query Mode");
            BlinkerMIOT.mode(ledmode);
            BlinkerMIOT.print();
            break;
        default :
            BlinkerMIOT.powerState(wsState ? "on" : "off");
            BlinkerMIOT.mode(ledmode);
            BlinkerMIOT.print();
            break;
    }
}

void fan(){
  if(fanmode==0){
    digitalWrite(PINe,LOW);
    digitalWrite(PINp,LOW);
  }
  else if(fanmode==1){
    digitalWrite(PINp,LOW);
    Blinker.delay(1);
    digitalWrite(PINe,HIGH);
  }
  else if(fanmode==2){
    digitalWrite(PINe,LOW);
    Blinker.delay(1);
    digitalWrite(PINp,HIGH);
  }
}

void setup() {

for(uint8_t i = 0; i<128; i++){
  red[i]=255-(i*2);
  green[i]=i*2;
  blue[i]=0;
}
for(uint8_t i = 0; i<128; i++){
  red[i+128]=0;
  green[i+128]=255-(i*2);
  blue[i+128]=i*2;
}
for(uint8_t i = 0; i<128; i++){
  red[i+256]=i*2;
  green[i+256]=0;
  blue[i+256]=255-(i*2);
}

    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    // 初始化IO
    pinMode(PINl, OUTPUT);
    pinMode(PINe, OUTPUT);
    pinMode(PINp, OUTPUT);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    BlinkerMIOT.attachPowerState(miotPowerState);
    BlinkerMIOT.attachMode(miotMode);
    BlinkerMIOT.attachQuery(miotQuery);
    rgbled.begin();
    rgbled.show();
    fan();
}

void loop() {
  if(ledmode==0){
    for (uint8_t i = 0; i < NUM; i++) {
      rgbled.setPixelColor(i, 0, 0, 0);
      rgbled.show();

      Blinker.run();
    }
  }

  if(ledmode==1){
 for(shortint j = 0; j<384; j++){
   if(j%4==0){

    Blinker.run();
    if(ledmode!=1)
      break;
  }
    for(uint8_t i = 0; i < NUM; i++){
      c=i*gap+j;
      if(c>=384){
        c=c-384;
      }
      rgbled.setPixelColor(i, red[c], green[c], blue[c]);
      rgbled.show();
    }
}
}

  else if(ledmode==2){

 for(shortint j = 0; j<384; j=j+3){
    if(ledmode!=2)
      break;
    for(uint8_t i = 0; i < NUM; i++){
      rgbled.setPixelColor(i, red[j], green[j], blue[j]);
      rgbled.show();

      Blinker.run();
    }
}
}

  else if(ledmode==3){
    for(uint8_t i = 0; i < NUM; i++){
      rgbled.setPixelColor(i, 6, 0, 154);
      rgbled.show();
      Blinker.run();

    }
  }

  else if(ledmode==4){
    for(shortint i = 0; i < NUM; i++){
      rgbled.setPixelColor(i, 160, 0, 0);
      rgbled.show();
      Blinker.run();

    }
  }

}

 

外壳模型

 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
kongjingnew1.SLDPRT
137
2
kongjingnew2.SLDPRT
72
3
kongjingnew3.SLDPRT
96
4
kongjingnew4.SLDPRT
63
5
kongjingESP32wroom32e.ino
60
克隆工程
添加到专辑
0
0
分享
侵权投诉
工程成员
全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程