ESP8266驱动SG90舵机控制开关灯(灯的开关)的折腾记录

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();
}
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值