![](http://image.lceda.cn/pullimage/hTNRRanOVCCAHRXmln9R3Ti5PuNOPLw4tQrtmUwZ.jpeg)
开源协议: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();
}
}
}
外壳模型
设计图
![](/_next/static/media/empty2.28562477.png)
BOM
![](/_next/static/media/empty1.f115c8c9.png)
![](/_next/static/media/clone.4d8f0c21.png)
添加到专辑
0
0
分享
侵权投诉
工程成员
在登录或注册后才可以进行评论操作
全部评论(1)
按时间排序|按热度排序