基于Blinker的舵机开关灯程序
一、先放张成品图: 这套设备支持Blinker APP上对灯进行控制,同时支持小爱对灯的控制。
Blinker界面
设备图
二、硬件连接:
舵机的PWM信号线接NODEMCU的D2脚,即可控制舵机的运动。
NODEMCU引脚图
SG90舵机图
三、程序分析
1.设备宏定义
[mw_shl_code=arduino,true]#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET[/mw_shl_code]
第二行宏定义会将这个设备在米家中显示为插座设备。
2.头文件
[mw_shl_code=arduino,true]#include <Blinker.h>
#include <Servo.h>//SG90舵机需要的头文件[/mw_shl_code]
3.设备ID和WIFI
[mw_shl_code=arduino,true]char auth[] = "********";//设备ID,从Blinker APP上申请来的
char ssid[] = "*********";
char pswd[] = "**********";[/mw_shl_code]
4.APP组件绑定
[mw_shl_code=arduino,true]BlinkerButton Button1("btn-led");//新建按键组件
BlinkerNumber Number1("num-wifi"); //blinker新建数据组件[/mw_shl_code]
5.定义一些宏定义和布尔变量
[mw_shl_code=arduino,true]bool oState = false;
Servo SG90;
#define angle_on 0
#define angle_off 90[/mw_shl_code]
6.按键回调函数
[mw_shl_code=arduino,true]// 按下按键即会执行该函数
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();
}
}[/mw_shl_code]
7.小爱回调函数
[mw_shl_code=arduino,true]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;
}
}[/mw_shl_code]
8.小爱的状态查询函数
[mw_shl_code=arduino,true]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;
}
}[/mw_shl_code]
9.数据读取函数
[mw_shl_code=arduino,true]void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
[/mw_shl_code]
10.初始化函数
[mw_shl_code=arduino,true]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
}[/mw_shl_code]
11.循环函数
[mw_shl_code=arduino,true]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()); //信号强度
}[/mw_shl_code]
|