本帖最后由 Yuanw 于 2019-9-7 15:06 编辑
Blinker改造德尔玛自动喷香机
产品:德尔玛自动喷香机(小米自动喷香机)
改造原因:原厂不够智能,喷香时间不可调切鸡肋
背景:家里来了新主子,精神有帅气的煤老板,话说煤老板是长得玉树临风,风流倜傥,上能耍帅撩妹,下能撒娇卖萌集万千优点于一身,但是,谁的粑粑不是臭的,为了解决主子形象问题,购入自动喷香机一台。话不多说先上我家主子靓照:
德尔玛喷香机:
这个就是德尔玛官方的介绍了,嗯....看起来很香的样子,本着一切为了主子服务的宗旨,毫不犹豫下单。 买回来不到两天时间,问题就出现了,这个喷香机根本不够智能,开机后自动喷香,每隔20分钟喷一次,该时间不可进行调整,不可进行调整,不可进行调整,重要的问题说三遍!!!,这就很尴尬了,白天喷也就算了,嗯,白天大家都不睡觉,闻了也就闻了,但是这玩意晚上也会每隔20分钟喷一次,每隔20分钟滋~~~每隔20分钟滋~~~........,睡觉比较深的人还好,睡眠比较浅的就数滋滋滋~~~,其实声音倒不是我最不能忍受的部分了,我最不能忍受的部分,我晚上睡觉一般是关了窗户的,这玩意喷香之后房子空间相对密闭,香味持久不散,闻了久了我会有点头晕,实在无法忍受这种完全不智能,完全不人性化的设备,于是乎开始改造计划
改造计划: 产品痛点有两个: 1、喷香间隔时间不可控(时间不可调整) 2、鸡肋的触发时间(白天黑夜24小时喷) 改造方案: 1、外观图:外观简洁大方,其实还是很好看的,德尔玛喷香机内部是一个芳香喷雾罐(压力罐),喷香功能是通过控制喷香机顶部的电磁阀开关来喷射香水的
2、内部构造:喷香机底部是德尔玛控制电路部分,顶部是用于控制压力罐开关的电磁阀,电磁阀通电则开启,进行喷香,关闭后停止喷香,底部控制电路较为简单,一个物理的安全开关,主要用于检测喷香机盖是否关闭,关闭后机器通电,主控电路上也有一个物理按键,主要用于喷香机开机以及
手动触发喷香。
3、改造计划:
1、需要通过小度音响进行控制,例如小度小度,太臭了,这时喷香机自动喷香
2、喷香量可控制:每次喷香量可手动控制,屋内太臭的情况下可以增量喷香
3、可以APP手动触发喷香
4、定时任务触发喷香
经过分析,以上功能blinker均可实现,目前手头拥有的零件有:ESP8266,S9013三极管,以及各种电阻一大包
初步想法是,通过blinker提供的官方小度demo来进行改造处理:
DuerOS_OUTLET 该案例可通过小度音响进行控制,我只需要在开启和关闭代码里面增加对电磁阀的控制即可
电磁阀的控制需要3V 电压(猜的),通过ESP8266 GPIO口是无法驱动的,因此需要想办法处理,因此使用S9013制作一个开关电路
通过ESP8266 GPIO口进行控制,从而控制电磁阀,大概电路图如下:
网上找的电路图,大概是这个意思,我只需要吧直流负载换成喷香机的电磁阀即可,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图:
界面布局代码:
[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:第一次写教程,有不明白的地方请指出,我会一一给大家解释
|