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

https://blog.csdn.net/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();
}
  • 4
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
对于ESP32驱动SG90舵机,你可以通过以下步骤进行操作: 1. 首先,将SG90舵机的信号线连接到ESP32的任意一个GPIO引脚上。选择一个适合的引脚,可以使用ESP32的数字引脚。 2. 在你的ESP32项目中,导入适当的库,例如ESP32库或者Servo库。这些库可以帮助你控制舵机。 3. 创建一个舵机对象,并将其连接到所选的GPIO引脚。 ```cpp #include <Servo.h> Servo myServo; // 创建舵机对象 void setup() { myServo.attach(GPIO_PIN); // 将舵机对象连接到GPIO引脚 } ``` 注意:将 `GPIO_PIN` 替换为实际连接舵机的GPIO引脚号。 4. 在 `setup()` 函数中,初始化舵机对象,并设置舵机初始位置。 ```cpp void setup() { myServo.attach(GPIO_PIN); // 将舵机对象连接到GPIO引脚 myServo.write(90); // 设置舵机初始位置(范围一般是0-180度) } ``` 在这里,将 `90` 替换为你想要设置的舵机初始位置。 5. 现在,你可以使用 `write()` 函数来控制舵机的位置。该函数接受一个角度值(范围一般是0-180度)。 ```cpp void loop() { myServo.write(0); // 将舵机转到0度位置 delay(1000); // 延迟1秒 myServo.write(180); // 将舵机转到180度位置 delay(1000); // 延迟1秒 } ``` 在这个示例中,舵机会先转到0度位置,然后再转到180度位置。你可以根据需要自定义角度值和延迟时间。 6. 上传代码到ESP32开发板,并观察舵机的运动。 请注意,不同型号的舵机可能具有不同的工作电压和角度范围。在操作舵机之前,你应该确认其工作规格,并相应地调整代码中的角度值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值