Blinker改造德尔玛自动喷香机(多图)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12745|回复: 17

[分享] Blinker改造德尔玛自动喷香机(多图)

[复制链接]
发表于 2019-9-7 13:52 | 显示全部楼层 |阅读模式
本帖最后由 Yuanw 于 2019-9-7 15:06 编辑

Blinker改造德尔玛自动喷香机



产品:德尔玛自动喷香机(小米自动喷香机)

改造原因:原厂不够智能,喷香时间不可调切鸡肋

背景:家里来了新主子,精神有帅气的煤老板,话说煤老板是长得玉树临风,风流倜傥,上能耍帅撩妹,下能撒娇卖萌集万千优点于一身,但是,谁的粑粑不是臭的,为了解决主子形象问题,购入自动喷香机一台。话不多说先上我家主子靓照:

mmexport1566021953888.jpg MYXJ_20190825021414_save.jpg mmexport1566021951227.jpg

德尔玛喷香机:



       这个就是德尔玛官方的介绍了,嗯....看起来很香的样子,本着一切为了主子服务的宗旨,毫不犹豫下单。
       买回来不到两天时间,问题就出现了,这个喷香机根本不够智能,开机后自动喷香,每隔20分钟喷一次,该时间不可进行调整,不可进行调整,不可进行调整,重要的问题说三遍!!!,这就很尴尬了,白天喷也就算了,嗯,白天大家都不睡觉,闻了也就闻了,但是这玩意晚上也会每隔20分钟喷一次,每隔20分钟滋~~~每隔20分钟滋~~~........,睡觉比较深的人还好,睡眠比较浅的就数滋滋滋~~~,其实声音倒不是我最不能忍受的部分了,我最不能忍受的部分,我晚上睡觉一般是关了窗户的,这玩意喷香之后房子空间相对密闭,香味持久不散,闻了久了我会有点头晕,实在无法忍受这种完全不智能,完全不人性化的设备,于是乎开始改造计划

改造计划
产品痛点有两个
1、喷香间隔时间不可控(时间不可调整)
2、鸡肋的触发时间(白天黑夜24小时喷)
改造方案:
1、外观图:外观简洁大方,其实还是很好看的,德尔玛喷香机内部是一个芳香喷雾罐(压力罐),喷香功能是通过控制喷香机顶部的电磁阀开关来喷射香水的

2、内部构造:喷香机底部是德尔玛控制电路部分,顶部是用于控制压力罐开关的电磁阀,电磁阀通电则开启,进行喷香,关闭后停止喷香,底部控制电路较为简单,一个物理的安全开关,主要用于检测喷香机盖是否关闭,关闭后机器通电,主控电路上也有一个物理按键,主要用于喷香机开机以及
手动触发喷香。
4.png 3.png 11.png
3、改造计划
1、需要通过小度音响进行控制,例如小度小度,太臭了,这时喷香机自动喷香
2、喷香量可控制:每次喷香量可手动控制,屋内太臭的情况下可以增量喷香
3、可以APP手动触发喷香
4、定时任务触发喷香
经过分析,以上功能blinker均可实现,目前手头拥有的零件有:ESP8266,S9013三极管,以及各种电阻一大包
初步想法是,通过blinker提供的官方小度demo来进行改造处理:
DuerOS_OUTLET   该案例可通过小度音响进行控制,我只需要在开启和关闭代码里面增加对电磁阀的控制即可
电磁阀的控制需要3V 电压(猜的),通过ESP8266  GPIO口是无法驱动的,因此需要想办法处理,因此使用S9013制作一个开关电路
通过ESP8266  GPIO口进行控制,从而控制电磁阀,大概电路图如下:
u=3398499177,2328133123&fm=173&app=25&f=JPEG.jpg
网上找的电路图,大概是这个意思,我只需要吧直流负载换成喷香机的电磁阀即可,R1   R2其实没有也可以进行控制,毕竟电压很小

控制方式已经解决,接下来就是编码了,话不多说,直接上代码


[pre]#define BLINKER_WIFI
#define BLINKER_DUEROS_OUTLET
#include <Blinker.h>
BlinkerButton Button1("btn-open");
BlinkerNumber Number1("num-times");
BlinkerSlider Slider1(Slider_1);

#define Slider_1 "openTime"

char auth[] = "d370eb4b5934";
char ssid[] = "PDCN";
char pswd[] = "YW020230";

int counter = 0;
int open_time = 200;
bool oState = false;

void duerPowerState(const String & state)
{
  BLINKER_LOG("need set power state: ", state);

  if (state == BLINKER_CMD_ON) {
    digitalWrite(LED_BUILTIN, LOW);
    digitalWrite(5, 1);
    delay(open_time);                       // wait for a second
    digitalWrite(5, 0);
    counter++;
    Number1.print(counter);
    BlinkerDuerOS.powerState("on");
    BlinkerDuerOS.print();
    oState = true;
  }
  else if (state == BLINKER_CMD_OFF) {
    digitalWrite(LED_BUILTIN, HIGH);
    digitalWrite(5, 1);
    delay(open_time);                       // wait for a second
    digitalWrite(5, 0);
    counter++;
    Number1.print(counter);
    BlinkerDuerOS.powerState("off");
    BlinkerDuerOS.print();

    oState = false;
  }
}

void duerQuery(int32_t queryCode)
{
  BLINKER_LOG("DuerOS Query codes: ", queryCode);

  switch (queryCode)
  {
    case BLINKER_CMD_QUERY_TIME_NUMBER :
      BLINKER_LOG("DuerOS Query time");
      BlinkerDuerOS.time(millis());
      BlinkerDuerOS.print();
      break;
    default :
      BlinkerDuerOS.time(millis());
      BlinkerDuerOS.print();
      break;
  }
}

void dataRead(const String & data)
{
  BLINKER_LOG("Blinker readString: ", data);

  Blinker.vibrate();

  uint32_t BlinkerTime = millis();

  Blinker.print("millis", BlinkerTime);
}
void button1_callback(const String & state)
{
  BLINKER_LOG("get button state: ", state);
  digitalWrite(5, 1);
  delay(open_time);                       // wait for a second
  digitalWrite(5, 0);
  counter++;
  Number1.print(counter);
}
void slider1_callback(int32_t value)
{
  open_time = value * 100;
  BLINKER_LOG("get slider value: ", value * 100);
}
void setup()
{
  Serial.begin(115200);
  BLINKER_DEBUG.stream(Serial);

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(5, OUTPUT);
  digitalWrite(5, 1);
  delay(100);                       // wait for a second
  digitalWrite(5, 0);
  Blinker.begin(auth, ssid, pswd);
  Blinker.attachData(dataRead);
  Button1.attach(button1_callback);
  Slider1.attach(slider1_callback);

  BlinkerDuerOS.attachPowerState(duerPowerState);
  BlinkerDuerOS.attachQuery(duerQuery);
}

void loop()
{
  Blinker.run();
}[/pre]
这个代码是第一次写,大神请指出我的不足,目前能实现我的改造计划
机器在开启时,会进行一次短时间的喷香(开机自检,其实没啥乱用,就是要喷一下)
我在blinker的APP里面采用了按钮进行控制,同时对喷香次数进行计数,起到一个简单的监控作用(本地变量),我记得有数据库操作的,但是一切从简,就不弄数据库啥的了,接下来上一下APP图:
Screenshot_20190907-133442.jpg 界面布局代码:
[pre]{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/bg/1.jpg¨}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨iconfont icon-fan¨¨mode¨É¨t0¨¨喷香¨¨t1¨¨文本2¨¨bg¨Ì¨cols¨Í¨rows¨Í¨key¨¨btn-open¨´x´Ë´y´Ï¨speech¨|÷¨lstyle¨Ë¨clr¨¨#00A90C¨}{ß9¨num¨ßE¨本次开机喷香次数¨ßBßCßP¨#389BEE¨¨min¨É¨max¨§¨uni¨´次´ßIÉßJËßKËßL¨num-times¨´x´É´y´ÌßN|÷ßOÉ}{ß9¨tex¨ßE¨德尔玛¨ßG¨自动喷香机¨ßIÉßBßCßJËßKÊßL¨德尔玛自动喷香机¨´x´É´y´ÉßN|÷ßOÉßP¨#595959¨}{ß9¨deb¨ßDÉßIÉßJÑßKÌßL¨debug¨´x´É´y´¤C}{ß9¨ran¨ßE¨喷射时间¨ßPßcßV¤KßUÊßIÉßJÏßKËßL¨openTime¨´x´Ë´y´ÌßN|÷ßOÊ}÷}[/pre]

喷香时间是通过滑块的形式进行控制,最高设置到2秒,时间可调,这样就可以自己控制喷香的量,再臭也不怕了,也可以利用binker提供的定时任务触发喷香按钮,达到定时喷香功能,目前由于时间问题,暂时未对喷香机物理开关按键进行改造,理论上原理是一样的,只需要检测ESP8266上某一个GPIO口的状态,从而控制电磁阀开关即可。
感谢大家的观看,以后还有什么好的想法我会再进行分享的,谢谢大家,也希望大家能指出我代码逻辑中的不足(第一次写这个代码,本人java程序员)

PS:第一次写教程,有不明白的地方请指出,我会一一给大家解释






发表于 2019-9-7 17:27 来自手机 | 显示全部楼层
不错不错,简便使用就ok了。
发表于 2019-9-13 00:01 | 显示全部楼层
人家说的是自动人家又没说智能啊[滑稽]
 楼主| 发表于 2019-10-12 15:57 | 显示全部楼层
白羊羊罐头 发表于 2019-9-13 00:01
人家说的是自动人家又没说智能啊[滑稽]

嗯嗯  好像很有道理的样子
发表于 2019-10-13 02:17 | 显示全部楼层
Yuanw 发表于 2019-10-12 15:57
嗯嗯  好像很有道理的样子

能帮我也搞个控制器吗?
 楼主| 发表于 2019-10-14 16:51 | 显示全部楼层
疯小孩 发表于 2019-10-13 02:17
能帮我也搞个控制器吗?

可以根据我的教程做  没什么难度的
发表于 2019-10-30 09:12 | 显示全部楼层
嗯,会者不难,不会的看都看不懂,我就想问问,如何把自动喷香功能关掉,我就想手动按一下喷香,大神能教一下么
 楼主| 发表于 2019-10-30 11:11 | 显示全部楼层
231600434j 发表于 2019-10-30 09:12
嗯,会者不难,不会的看都看不懂,我就想问问,如何把自动喷香功能关掉,我就想手动按一下喷香,大神能教一 ...

原厂不支持这种操作的,你可以把里面控制电路直接干掉,电磁阀开关接到按钮上,这样就行了
发表于 2020-2-21 15:12 | 显示全部楼层
您好,我是刘先生,我看了你论坛的帖子改造德尔玛的机器,我觉得非常好,我家里买了三个这样的机器,但是我迫切的想改造他们,但是我不懂,我能出钱给你帮我改造吗?我想把机子改成每四小时喷一次,请问可以吗?我期待得到你的答复,请联系我:手机:13450241466 邮件:13450241466@163.com  真的真的十分期待你能够回复我,感谢你!
发表于 2020-2-21 15:21 | 显示全部楼层
真的非常希望楼主能够回复,我在线等,在线等
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 13:37 , Processed in 0.089698 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表