这是本人用了一周半的时候写的,出是现学现卖。发这个主要的目的就是为了方便新人,这个代码新人直接复制就可以用。 支持 百度小度 小米小爱 天猫精灵 的语音控制。
同时内置了无线配网。方便大家联不通的WIFI, 唯一不足就是 点灯的 blinker char auth,也就是点灯的KEY要 一次烧录。
不废话 代码 如下。
#define BLINKER_WIFI
#define BLINKER_MIOT_LIGHT //定义小米小爱灵库函数
#define BLINKER_DUEROS_LIGHT //定义小度智能库函数
#define BLINKER_ALIGENIE_LIGHT //定义天猫精灵库函数
#include <Blinker.h>
#include <WiFiManager.h>
char auth[] = "xxxxxxx";//点灯科技获取的KEY
int GPIO=0;//定义GPIO口用于控制继电器
#define BUTTON_1 "ButtonKey"//定义按钮
BlinkerButton Button1("switch");//括号里面的字符就是点灯APP 创建按钮的字符
// 按下按键即会执行该函数 点灯APP代码配置
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
digitalWrite(GPIO,!digitalRead(GPIO));
Blinker.vibrate(); //使用Blinker.vibrate()即会让手机震动
if (state == BLINKER_CMD_OFF) { //如果点灯APP接收到是关闭灯就设置GPIO口为高电平
digitalWrite(GPIO, HIGH);
BUILTIN_SWITCH.print("off"); //这个就是点灯APP的回调函数 其作用就是发送关闭状态使用APP按钮显示关闭状态
}
else if (state == BLINKER_CMD_ON) {//如果点灯APP接收到是开灯就设置GPIO口为低电平
digitalWrite(GPIO, LOW);
BUILTIN_SWITCH.print("on"); //这个就是点灯APP的回调函数 其作用就是发送 打开 状态使用APP按钮显示 打开 状态
}
}
//Blinker定义小米小爱灵库函数
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ",state);
if (state == BLINKER_CMD_OFF) {//如果语音接收到是关闭灯就设置GPIO口为高电平
digitalWrite(GPIO, HIGH);
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_ON) {//如果语音接收到是开灯就设置GPIO口为低电平
digitalWrite(GPIO, LOW);
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
}
}
//Blinker小度智能接入代码
void duerPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_OFF) {//如果语音接收到是关闭灯就设置GPIO口为高电平
digitalWrite(GPIO, HIGH);
BlinkerDuerOS.powerState("off");
BlinkerDuerOS.print();
}
else if (state == BLINKER_CMD_ON) {//如果语音接收到是开灯就设置GPIO口为低电平
digitalWrite(GPIO, LOW);
BlinkerDuerOS.powerState("on");
BlinkerDuerOS.print();
}
}
//定义Blinker天猫精灵接口函数
void aligeniePowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_OFF) {//如果语音接收到是关闭灯就设置GPIO口为高电平
digitalWrite(GPIO, HIGH);
BlinkerAliGenie.powerState("off");
BlinkerAliGenie.print();
}
else if (state == BLINKER_CMD_ON) {//如果语音接收到是开灯就设置GPIO口为低电平
digitalWrite(GPIO, LOW);
BlinkerAliGenie.powerState("on");
BlinkerAliGenie.print();
}
}
void setup()
{
//首次无线自动配网代码 先以芯片名加MAC地址生成AP 配置SSID和密码 自动重启8266连接WIFI
//优先读取存储的SSID和密码,当存的密码连接不上自动进入配网模式
Serial.begin(115200); // 初始化串口
WiFiManager wm;
bool res;
res = wm.autoConnect(); // 从芯片名称和MAC地址自动生成AP名称
if(!res) {
Serial.println("Failed to connect");
ESP.restart(); //去掉注释可实现WiFi连接失败 自动清除配网信息
}
else {
//如果你到了这里,你已经连接到了WiFi
Serial.println("connected...yes :)");
Serial.println(WiFi.SSID()); // WiFi名称
Serial.print("IP address:\t");
}
BLINKER_DEBUG.stream(Serial);
//设置引脚模式并初始化引脚
pinMode(GPIO,OUTPUT);
digitalWrite(GPIO,HIGH);//初始化,由于继电器是低电平触发。所以刚开始设为高电平 也就是所谓的上拉锁定 保证默认状态是高电平 1
// 初始化blinker
Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str());
Button1.attach(button1_callback); //当app中组件触发并发送到设备端时将触发该组件注册的回调函数
BlinkerMIOT.attachPowerState(miotPowerState); //这段代码一定要加,不加小爱同学控制不了,务必在回调函数中反馈该控制状态
BlinkerDuerOS.attachPowerState(duerPowerState); //这段代码一定要加,不加小度智能控制不了,务必在回调函数中反馈该控制状态
BlinkerAliGenie.attachPowerState(aligeniePowerState); //这段代码一定要加,不加天猫精灵控制不了,务必在回调函数中反馈该控制状态
}
void loop()
{
Blinker.run();
}