查看: 702|回复: 5

[分享] 基于Blinker的舵机开关灯程序

[复制链接]
回帖奖励 3 金币 回复本帖可获得 1 金币奖励! 每人限 1 次(中奖概率 10%)
  • TA的每日心情
    开心
    2020-4-5 09:47
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2020-2-3 20:57 | 显示全部楼层 |阅读模式
    基于Blinker的舵机开关灯程序

    一、先放张成品图:
    这套设备支持Blinker APP上对灯进行控制,同时支持小爱对灯的控制。

    Blinker界面

    Blinker界面

    设备图

    设备图
    二、硬件连接:
    舵机的PWM信号线接NODEMCU的D2脚,即可控制舵机的运动。

    NODEMCU引脚图

    NODEMCU引脚图

    SG90舵机图

    SG90舵机图

    三、程序分析
    1.设备宏定义

    kittenblock中小学创客名师推荐的图形化编程软件

    #define BLINKER_WIFI
    #define BLINKER_MIOT_OUTLET

    第二行宏定义会将这个设备在米家中显示为插座设备。
    2.头文件

    kittenblock中小学创客名师推荐的图形化编程软件

    #include <Blinker.h>
    #include <Servo.h>//SG90舵机需要的头文件

    3.设备ID和WIFI

    kittenblock中小学创客名师推荐的图形化编程软件

    char auth[] = "********";//设备ID,从Blinker APP上申请来的
    char ssid[] = "*********";
    char pswd[] = "**********";

    4.APP组件绑定

    kittenblock中小学创客名师推荐的图形化编程软件

    BlinkerButton Button1("btn-led");//新建按键组件
    BlinkerNumber Number1("num-wifi");  //blinker新建数据组件

    5.定义一些宏定义和布尔变量

    kittenblock中小学创客名师推荐的图形化编程软件

    bool oState = false;
    Servo SG90;
    
    #define angle_on  0
    #define angle_off 90

    6.按键回调函数

    kittenblock中小学创客名师推荐的图形化编程软件

    // 按下按键即会执行该函数
    void button1_callback(const String & state)
    {
        BLINKER_LOG("get button state: ", state);
        if(oState == false)//如果灯是关的
        {
          oState = true;//将灯的状态打开
          SG90.write(angle_on);//调整舵机角度
          Button1.color("#6495ED");
          Button1.print();
         }
         else if(oState == true)
         {
           oState = false;//将灯的状态关闭
           SG90.write(angle_off);//调整舵机角度
           Button1.color("#000000");
           Button1.print();
         }
    }

    7.小爱回调函数

    kittenblock中小学创客名师推荐的图形化编程软件

    void miotPowerState(const String & state)
    {
        BLINKER_LOG("need set power state: ", state);
    
        if (state == BLINKER_CMD_ON && oState == false) {
            BlinkerMIOT.powerState("on");
            BlinkerMIOT.print();
            SG90.write(angle_on);//调整舵机角度 打开
            Button1.color("#6495ED");
            Button1.print();
            oState = true;
        }
        else if (state == BLINKER_CMD_OFF && oState == true) {
            BlinkerMIOT.powerState("off");
            BlinkerMIOT.print();
            SG90.write(angle_off);//调整舵机角度
            Button1.color("#000000");
            Button1.print();
            oState = false;
        }
    }

    8.小爱的状态查询函数

    kittenblock中小学创客名师推荐的图形化编程软件

    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;
        }
    }

    9.数据读取函数

    kittenblock中小学创客名师推荐的图形化编程软件

    void dataRead(const String & data)
    {
        BLINKER_LOG("Blinker readString: ", data);
    
        Blinker.vibrate();
        
        uint32_t BlinkerTime = millis();
        
        Blinker.print("millis", BlinkerTime);
    }
    

    10.初始化函数

    kittenblock中小学创客名师推荐的图形化编程软件

    void setup()
    {
        Serial.begin(115200);
        BLINKER_DEBUG.stream(Serial);
        
        Blinker.begin(auth, ssid, pswd);
        Blinker.attachData(dataRead);
        
        BlinkerMIOT.attachPowerState(miotPowerState);
        BlinkerMIOT.attachQuery(miotQuery);
        Button1.attach(button1_callback);//声明组件
        SG90.attach(4);//绑定连接舵机信号引脚的接口
        SG90.write((angle_off+angle_on)/2);//调整舵机角度
        Button1.color("#000000");//改变按键颜色
        Button1.print();//发送到APP
    }

    11.循环函数

    kittenblock中小学创客名师推荐的图形化编程软件

    void loop()
    {
        Blinker.run();
        if(oState == false)//如果灯是关的
        {
          Button1.color("#000000");
          Button1.print();
         }
         else if(oState == true)
         {
           Button1.color("#6495ED");
           Button1.print();
         }
         Number1.print(WiFi.RSSI());  //信号强度
    }


    SG90_wifi.rar

    1.33 KB, 下载次数: 32

    源码

  • TA的每日心情
    开心
    2020-3-6 02:42
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2020-2-28 10:07 | 显示全部楼层
    这么添加信号显示的图? ESP8266可以弄吗?板子代码是什么?APP端怎么设置?

    该用户从未签到

    发表于 2020-2-28 15:29 | 显示全部楼层
    好像直接把舵机的PWM接到ESP8266上也可以
  • TA的每日心情
    擦汗
    2020-3-9 08:21
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2020-3-4 08:28 | 显示全部楼层
    这是TJ 发表于 2020-2-28 15:29
    好像直接把舵机的PWM接到ESP8266上也可以

    理论上是可以的    只用了一个脚  有点浪费
  • TA的每日心情
    开心
    2020-4-5 09:47
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2020-3-6 20:41 | 显示全部楼层
    这是TJ 发表于 2020-2-28 15:29
    好像直接把舵机的PWM接到ESP8266上也可以

    ESP8266 01S也是可以的
  • TA的每日心情
    开心
    2020-4-5 09:47
  • 签到天数: 33 天

    [LV.5]常住居民I

     楼主| 发表于 2020-3-6 20:42 | 显示全部楼层
    ksbb4920355 发表于 2020-2-28 10:07
    这么添加信号显示的图? ESP8266可以弄吗?板子代码是什么?APP端怎么设置?

    Number1.print(WiFi.RSSI());  //信号强度
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    《Color Unit免费申请试用》
    《Color Unit免费申请试用
    COLOR 是一款颜色识别 Unit,其内部集成TCS3472彩色光数字转换器,能够将其检测到颜色
    编译时空白行出现stray '\345' in program
    编译时空白行出现stray &#
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    siri+小爱+小度+天猫控制灯
    siri+小爱+小度+天猫控制
    以上是颜色代码 本程序控制的是8266的 io 0 默认上电LOW 有需求可以知己改写 siri
    siri控制8266
    siri控制8266
    //本程序是操作8266的GPIO 0 口// 程序如下 #include const char* ssid = "TP-11222";
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表