https://blog.youkuaiyun.com/qq_47749454/article/details/117638828
想法来源地址在上面,可以去参考一下,建议是结合两篇文章一块看,按照大佬的先来折腾一次,有问题了在看我这个,会比较齐全。
具体的折腾细节方面可以去上面的博主页面去参考,这里想聊一些那个博主没涉及到的。
1.买的型号,SG90舵机,淘宝应该很多,和ESP8266的连线也是ok的,没有困难,连完线难题就开始了,首先舵机驱动并没有搞过,其次ESP8266也忘记的差不多了,然后,这个程序实际上还有另外一个第三方库,Bliker点灯科技,他的库也没用过,也没了解过,那就简单点,直接copy(不是)借鉴上面大佬的代码,到自己的开发环境,编译烧写,发现不起作用,舵机是可以转动,但是只能转动一点点,和大佬代码里的29度和-29度并没有关系,于是开始了反复的debug,于是一天过去了。
2.第二天,准备换个思路,先去百度找到一个单独驱动舵机的程序,就是让舵机自己正转180,再倒转180,结果烧写进去,发现我自己这个,只能转动90度,和别人写的根本不一样,于是,我就想着,驱动不成就先放弃吧,角度也不定是固定的,所以就放弃了挣扎,能转动一定的符合要求的角度就ok了。
3.再有一个,就是舵机怎么和开关绑定的问题,舵机这么轻,也并没有一个很好的方式来固定到开关上,所以一开始就想着搞个透明胶带,后来才上了热熔胶,上了热熔胶也来来回回粘了好几次,建议是先挤一丢丢热熔胶在舵机和开关盖子上,把这两个东西固定住,并且压紧等几分钟,看效果还ok了之后,再松掉,加多点热熔胶固定周边,(热熔胶这玩意还真的好用,因为开关的壳子和舵机表面都本来就很光滑的,所以基本可以不费太多事就可以完美拆除,并且不留痕迹,以后要多买一些备用了~~
4.再有,就是blinker这个app,上面博主并没有涉及到blinker这个app怎么搞,只是接入了小爱同学,实际上blinker这个app也提供了丰富的自定义能力,来让你自己去在app里DIY你自己设备的控制面板上的按钮,你DIY的按钮的ID或者说标识,要和你的实际程序里的代码相吻合,然后就可以正常使用了。
5. 再有就是说,不知道是我的姿势有问题,还是买的舵机力道太小了,我这个 舵机居然无法在侧边打开和关闭开关,最终没办法,只能换个单边的头,用来做触发操作,在每次开灯操作触发的代码上外挂自己的方法,来实现功能~~~
6. 最后,再有就是,接入小爱同学的话,小爱同学是要即时返回的,所以如果你的代码中,操作舵机这种需要等待的方法,尽量不要去用,不然小爱在每次操作需要等待的操作的时候,会提示说“要操作的设备出问题了”之类的提示语,当然我就没所谓了,因为已经能够实现关灯的动作触发了,只是因为没有即时返回导致音箱提示异常,谁还在乎 个音箱说设备在不在呢对不对~
7. 最后的最后,前面也说了,因为单舵机并不支持能够开关等,所以说后面可能还需要在继续买个单独的舵机,用热熔胶粘贴到设备的后面,来实现开关灯都可以独立控制。
8. 最后的最后的最后,附上我的调试的代码,角度或者是具体执行的方法等这些东西,是要你自己去调试的,所以这部分我会特殊标注出来。
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
#include <Blinker.h>
#include<Servo.h>
char auth[] = "Your Sercet Key";
char ssid[] = "Your SSID";
char pswd[] = "Your SSID Password";
bool oState = false;
Servo servo;
int pos = 0;
void doAction(const String & state) {
//here is your method
BLINKER_LOG("doAction : ", state);
if(state == BLINKER_CMD_ON) {
//暂时先空着,先不留开开关的
BLINKER_LOG("开关 开了");
} else if(state == BLINKER_CMD_OFF) {
BLINKER_LOG("开关 关了");
for (pos = 90; pos >= 0; pos --) { // 从180°到0°
servo.write(pos); // 舵机角度写入
delay(15); // 等待转动到指定角度
}
delay(200);
for (pos = 0; pos <= 90; pos ++) { // 0°到180°
// in steps of 1 degree
servo.write(pos); // 舵机角度写入
delay(15); // 等待转动到指定角度
}
delay(200);//延时0.2s
}
}
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
digitalWrite(LED_BUILTIN, LOW);
doAction(state);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
oState = true;
}
else if (state == BLINKER_CMD_OFF) {
digitalWrite(LED_BUILTIN, HIGH);
doAction(state);
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
oState = false;
}
}
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(oState ? "on" : "off");
BlinkerMIOT.print();
break;
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
BLINKER_LOG("MIOT Query Power State");
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState ? "on" : "off");
BlinkerMIOT.print();
break;
}
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
servo.attach(D0);
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
BlinkerMIOT.attachPowerState(miotPowerState);
BlinkerMIOT.attachQuery(miotQuery);
doAction("off");
}
void loop()
{
Blinker.run();
}