查看: 1308|回复: 7

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

[复制链接]
  • TA的每日心情
    无聊
    2019-9-7 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 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其实没有也可以进行控制,毕竟电压很小

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


    #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();
    }

    这个代码是第一次写,大神请指出我的不足,目前能实现我的改造计划
    机器在开启时,会进行一次短时间的喷香(开机自检,其实没啥乱用,就是要喷一下)
    我在blinker的APP里面采用了按钮进行控制,同时对喷香次数进行计数,起到一个简单的监控作用(本地变量),我记得有数据库操作的,但是一切从简,就不弄数据库啥的了,接下来上一下APP图:
    Screenshot_20190907-133442.jpg 界面布局代码:
    {¨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Ê}÷}


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

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






  • TA的每日心情
    郁闷
    2019-10-27 12:29
  • 签到天数: 51 天

    [LV.5]常住居民I

    发表于 2019-9-7 17:27 来自手机 | 显示全部楼层
    不错不错,简便使用就ok了。
  • TA的每日心情
    开心
    2019-3-23 14:08
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2019-9-13 00:01 | 显示全部楼层
    人家说的是自动人家又没说智能啊[滑稽]
  • TA的每日心情
    无聊
    2019-9-7 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2019-10-12 15:57 | 显示全部楼层
    白羊羊罐头 发表于 2019-9-13 00:01
    人家说的是自动人家又没说智能啊[滑稽]

    嗯嗯  好像很有道理的样子

    该用户从未签到

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

    能帮我也搞个控制器吗?
  • TA的每日心情
    无聊
    2019-9-7 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    可以根据我的教程做  没什么难度的

    该用户从未签到

    发表于 2019-10-30 09:12 | 显示全部楼层
    嗯,会者不难,不会的看都看不懂,我就想问问,如何把自动喷香功能关掉,我就想手动按一下喷香,大神能教一下么
  • TA的每日心情
    无聊
    2019-9-7 14:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    原厂不支持这种操作的,你可以把里面控制电路直接干掉,电磁阀开关接到按钮上,这样就行了
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【Arduino】108种传感器模块系列实验(55)---DHT11温湿度传感器
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】168种传感器系列实验(149)--AS608光学指纹识别模块
    【Arduino】168种传感器系
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    黑乌鸦的Arduino兵器库-----DFPlayer MiNi mp3音乐模块
    黑乌鸦的Arduino兵器库---
    嗯 这是一个系列后期会罗列几乎所有的常见基础模块的demo所以 大家的回复将是我最大
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    【干货分享】mega2560原理图PCB图纸altium designer18
    【干货分享】mega2560原理
    分享一下mega2560的板子 AD版本 **** 本内容被作者隐藏 **** ergo
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表