基于Blinker的舵机开关灯程序-Arduino中文社区 - Powered by Discuz! Archiver

a7178636965 发表于 2020-2-3 20:57

基于Blinker的舵机开关灯程序

基于Blinker的舵机开关灯程序
一、先放张成品图:这套设备支持Blinker APP上对灯进行控制,同时支持小爱对灯的控制。
二、硬件连接:
舵机的PWM信号线接NODEMCU的D2脚,即可控制舵机的运动。

三、程序分析
1.设备宏定义
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
第二行宏定义会将这个设备在米家中显示为插座设备。
2.头文件
#include <Blinker.h>
#include <Servo.h>//SG90舵机需要的头文件
3.设备ID和WIFI
char auth[] = "********";//设备ID,从Blinker APP上申请来的
char ssid[] = "*********";
char pswd[] = "**********";
4.APP组件绑定
BlinkerButton Button1("btn-led");//新建按键组件
BlinkerNumber Number1("num-wifi");//blinker新建数据组件
5.定义一些宏定义和布尔变量
bool oState = false;
Servo SG90;

#define angle_on0
#define angle_off 90
6.按键回调函数
// 按下按键即会执行该函数
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.小爱回调函数
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.小爱的状态查询函数
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.数据读取函数
void dataRead(const String & data)
{
    BLINKER_LOG("Blinker readString: ", data);

    Blinker.vibrate();
   
    uint32_t BlinkerTime = millis();
   
    Blinker.print("millis", BlinkerTime);
}

10.初始化函数
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.循环函数
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());//信号强度
}

ksbb4920355 发表于 2020-2-28 10:07

这么添加信号显示的图? ESP8266可以弄吗?板子代码是什么?APP端怎么设置?

这是TJ 发表于 2020-2-28 15:29

好像直接把舵机的PWM接到ESP8266上也可以

上官嘉萱 发表于 2020-3-4 08:28

这是TJ 发表于 2020-2-28 15:29
好像直接把舵机的PWM接到ESP8266上也可以

理论上是可以的    只用了一个脚有点浪费

a7178636965 发表于 2020-3-6 20:41

这是TJ 发表于 2020-2-28 15:29
好像直接把舵机的PWM接到ESP8266上也可以

ESP8266 01S也是可以的

a7178636965 发表于 2020-3-6 20:42

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

Number1.print(WiFi.RSSI());//信号强度

13675003417 发表于 2020-7-17 08:58

感谢分享,学习了

一入极客深似海 发表于 2020-11-14 19:35

感谢分享

we9873 发表于 2021-1-3 19:15

大佬怎么调整舵机角度啊我是个小白

曙光88 发表于 2021-1-4 12:04

谢谢楼主!
页: [1] 2
查看完整版本: 基于Blinker的舵机开关灯程序