#define BLINKER_WIFI               //支持wifi
//#define BLINKER_ESP_SMARTCONFIG    //Smartconfig或者手机微信扫码自动配网,代码配网请注释此条
#define BLINKER_MIOT_MULTI_OUTLET  //支持多路插座,最多4个插孔
#define BLINKER_PRINT Serial       //串口协议库
#define BLINKER_WITHOUT_SSL        //blinker默认使用加密方式进行远程通信,但通信加密会消耗大量的RAM,如果您对通信安全性无要求
//可以添加宏BLINKER_WITHOUT_SSL用以获得更多可用RAM,BLINKER_WITHOUT_SSL目前仅可用于ESP8266,其他设备的RAM足以进行加密通信#include <Blinker.h>               //使用第三方Blinker库#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>char auth[] = "06327a97cec4";      //Blinker APP(连接小爱同学必须阿里云服务器)中获取到的Secret Key(密钥)
//代码配网用这段
char ssid[] = "******";     //wifi名称
char pswd[] = "******";     //wifi密码//定义继电器信号
#define Relay_1 3      //定义继电器1信号接入GPIO3,RX
#define Relay_2 16     //定义继电器2信号接入GPIO16,D0
#define Relay_3 0      //定义继电器3信号接入GPIO0,D3
#define Relay_4 2      //定义继电器4信号接入GPIO2,D4//定义RFID和舵机脚针
#define RST_PIN   5
#define SS_PIN    4
#define DuoPIN    15MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
Servo myDuoJi;// 新建Blinker软件组件对象
BlinkerButton Button("MainSwitch");     //组件对象,要和APP组件中的“数据键名”一致,总开关
BlinkerButton Button1("Switch1");       //组件对象,要和APP组件中的“数据键名”一致,开关1
BlinkerButton Button2("Switch2");       //组件对象,要和APP组件中的“数据键名”一致,开关2
BlinkerButton Button3("Switch3");       //组件对象,要和APP组件中的“数据键名”一致,开关3
BlinkerButton Button4("Switch4");       //组件对象,要和APP组件中的“数据键名”一致,开关4
BlinkerButton Button5("Refresh");       //APP端按钮状态刷新//定义插座状态,用于小爱同学状态反馈
bool oState[5] = { false };
#define OUTLET_ALL   0  //所有插孔
#define OUTLET_NO_1  1  //插座插孔一
#define OUTLET_NO_2  2  //插座插孔二
#define OUTLET_NO_3  3  //插座插孔三
#define OUTLET_NO_4  4  //插座插孔四//反馈继电器状态函数
void RelayState(int num)
{switch (num){case 1:   //插座插孔一状态if (digitalRead(Relay_1) == LOW){Button1.color("#0099FF");   //设置app按键是淡蓝色,16进制颜色码Button1.text("设备1开");     //设置app按键注释“开”Button1.print("on");oState[1] = true;}else if (digitalRead(Relay_1 == HIGH)){Button1.color("#808080");   //设置app按键是灰色,16进制颜色码Button1.text("设备1关");     //设置app按键注释“关”Button1.print("off");oState[1] = false;}break;case  2:if (digitalRead(Relay_2) == LOW){Button2.color("#0099FF");   //设置app按键是淡蓝色,16进制颜色码Button2.text("设备2开");     //设置app按键注释“开”Button2.print("on");oState[2] = true;}else if (digitalRead(Relay_2 == HIGH)){Button2.color("#808080");   //设置app按键是灰色,16进制颜色码Button2.text("设备2关");     //设置app按键注释“关”Button2.print("off");oState[2] = false;}break;case  3:if (digitalRead(Relay_3) == LOW){Button3.color("#0099FF");   //设置app按键是淡蓝色,16进制颜色码Button3.text("设备3开");     //设置app按键注释“开”Button3.print("on");oState[3] = true;}else if (digitalRead(Relay_3 == HIGH)){Button3.color("#808080");   //设置app按键是灰色,16进制颜色码Button3.text("设备3关");     //设置app按键注释“关”Button3.print("off");oState[3] = false;}break;case  4:if (digitalRead(Relay_4) == LOW){Button4.color("#0099FF");   //设置app按键是淡蓝色,16进制颜色码Button4.text("设备4开");     //设置app按键注释“开”Button4.print("on");oState[4] = true;}else if (digitalRead(Relay_4 == HIGH)){Button4.color("#808080");   //设置app按键是灰色,16进制颜色码Button4.text("设备4关");     //设置app按键注释“关”Button4.print("off");oState[4] = false;}break;default:break;}
}//小爱同学控制插座多个插孔
void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
{switch (num){case 0:  //所有插孔digitalWrite(Relay_1, io_level);//控制继电器1digitalWrite(Relay_2, io_level);//控制继电器2digitalWrite(Relay_3, io_level);//控制继电器3digitalWrite(Relay_4, io_level);//控制继电器4break;case 1:  //插座插孔一digitalWrite(Relay_1, io_level);//控制继电器1break;case 2:  //插座插孔二digitalWrite(Relay_2, io_level);//控制继电器2break;case 3:  //插座插孔三digitalWrite(Relay_3, io_level);//控制继电器3break;case 4:  //插座插孔四digitalWrite(Relay_4, io_level);//控制继电器4break;default:break;}
}//小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
void miotPowerState(const String & state, uint8_t num)
{BLINKER_LOG("need set outlet: ", num, ", power state: ", state);if (state == BLINKER_CMD_ON){ctrl_multi_outlet(num, LOW);   //打开继电器,num表示是多少路(继电器低电平出发)BlinkerMIOT.powerState("on", num);BlinkerMIOT.print();RelayState(num);oState[num] = true;}else if (state == BLINKER_CMD_OFF){ctrl_multi_outlet(num, HIGH);   //关闭继电器,num表示是多少路BlinkerMIOT.powerState("off", num);BlinkerMIOT.print();RelayState(num);oState[num] = false;}
}//小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
void miotQuery(int32_t queryCode, uint8_t num)
{BLINKER_LOG("插孔", num, "状态", ",codes:", queryCode);switch (num){case 0 :BLINKER_LOG("状态:");BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.powerState(oState[4] ? "on" : "off");BlinkerMIOT.print();break;case 1 :BLINKER_LOG("设备1状态:");BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.print();break;case 2 :BLINKER_LOG("设备2状态:");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.print();break;case 3 :BLINKER_LOG("设备3状态:");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.print();break;case 4 :BLINKER_LOG("设备4状态:");BlinkerMIOT.powerState(oState[4] ? "on" : "off");BlinkerMIOT.print();break;default :BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.powerState(oState[4] ? "on" : "off");BlinkerMIOT.print();break;}
}// 在APP控制,按下MainSwitch按键即会执行该函数
void button_callback(const String & state)
{BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息if (state == "on"){ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有// 反馈继电器状态Button.color("#0099FF");   //设置app按键是淡蓝色,16进制颜色码Button.text("开");          //设置app按键注释“开”Button.icon("fal fa-power-on");Button.print("on");Blinker.vibrate();  //开启继电器时反馈,让手机震动} else if (state == "off"){ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有// 反馈继电器状态Button.color("#808080");   //设置app按键是灰色,16进制颜色码Button.text("关");          //设置app按键注释“开”Button.icon("fal fa-power-off");Button.print("off");}
}// 在APP控制,按下Switch1按键即会执行该函数--第1路开关
void button1_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state == "on"){ctrl_multi_outlet(OUTLET_NO_1, LOW);//打开继电器--第1路// 反馈继电器1状态RelayState(1);    //调用继电器反馈程序} else if (state == "off"){ctrl_multi_outlet(OUTLET_NO_1, HIGH);//关闭继电器--第1路// 反馈继电器状态RelayState(1);    //调用继电器反馈程序}
}// 在APP控制,按下Switch2按键即会执行该函数--第2路开关
void button2_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state == "on"){ctrl_multi_outlet(OUTLET_NO_2, LOW);//打开继电器--第2路// 反馈继电器状态RelayState(2);    //调用继电器反馈程序} else if (state == "off"){ctrl_multi_outlet(OUTLET_NO_2, HIGH);//关闭继电器--第2路// 反馈继电器状态RelayState(2);    //调用继电器反馈程序}
}// 在APP控制,按下Switch3按键即会执行该函数--第3路开关
void button3_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state == "on"){ctrl_multi_outlet(OUTLET_NO_3, LOW);//打开继电器--第3路// 反馈继电器状态RelayState(3);    //调用继电器反馈程序} else if (state == "off"){ctrl_multi_outlet(OUTLET_NO_3, HIGH);//关闭继电器--第3路// 反馈继电器状态RelayState(3);    //调用继电器反馈程序}
}// 在APP控制,按下Switch4按键即会执行该函数--第4路开关
void button4_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state == "on"){ctrl_multi_outlet(OUTLET_NO_4, LOW);//打开继电器--第4路// 反馈继电器状态RelayState(4);    //调用继电器反馈程序} else if (state == "off"){ctrl_multi_outlet(OUTLET_NO_4, HIGH);//关闭继电器--第4路// 反馈继电器状态RelayState(4);    //调用继电器反馈程序}
}//APP端状态手动刷新按钮
void button5_callback(const String & state)
{for (int i = 0; i < 5; i++){RelayState(i);}
}//心跳包刷新状态
void heartbeat()
{for (int i = 0; i < 5; i++){RelayState(i);}
}void setup()
{// 初始化串口,用于调试,后期可删除Serial.begin(115200);BLINKER_DEBUG.stream(Serial);BLINKER_DEBUG.debugAll();// 初始化有继电器的IOpinMode(Relay_1, OUTPUT);pinMode(Relay_2, OUTPUT);pinMode(Relay_3, OUTPUT);pinMode(Relay_4, OUTPUT);//初始化继电器初始状态digitalWrite(Relay_1, HIGH);   //继电器为低电平触发,初始化为HIGHdigitalWrite(Relay_2, HIGH);digitalWrite(Relay_3, HIGH);digitalWrite(Relay_4, HIGH);//初始化blinker// Blinker.begin(auth);              //手机配网用这段Blinker.begin(auth, ssid, pswd);//代码配网用这段Button.attach(button_callback);   //绑定按键回调Button1.attach(button1_callback); //绑定按键回调Button2.attach(button2_callback); //绑定按键回调Button3.attach(button3_callback); //绑定按键回调Button4.attach(button4_callback); //绑定按键回调Button5.attach(button5_callback); //绑定按键回调//小爱同学注册回调BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调BlinkerMIOT.attachQuery(miotQuery);           //小爱设备查询的回调函数//心跳包,初始化Blinker.attachHeartbeat(heartbeat);           //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态SPI.begin();          // SPI开始mfrc522.PCD_Init();   // Init MFRC522 cardSerial.println("test-demo-start");myDuoJi.attach(DuoPIN);   //初始化舵机
}void loop()
{Blinker.run();// 寻找新卡if ( ! mfrc522.PICC_IsNewCardPresent()) {//Serial.println("没有找到卡");return;}// 选择一张卡if ( ! mfrc522.PICC_ReadCardSerial()) {Serial.println("没有卡可选");return;}// 显示卡片的详细信息Serial.print(F("卡片 UID:"));dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);   //将字节数组十进制转储为串行的十六进制值Serial.println();for (byte i = 0; i < mfrc522.uid.size; i++) {Serial.print(mfrc522.uid.uidByte[i]);Serial.print(" ");}//识别十进制数组 判断舵机转动if ( mfrc522.uid.uidByte[0] == 44 && mfrc522.uid.uidByte[1] == 78 && mfrc522.uid.uidByte[2] == 245 && mfrc522.uid.uidByte[3] == 49 ){myDuoJi.write(180);   //关}if (mfrc522.uid.uidByte[0] == 51 && mfrc522.uid.uidByte[1] == 249 && mfrc522.uid.uidByte[2] == 223 && mfrc522.uid.uidByte[3] == 24 ){myDuoJi.write(90);   //开}Serial.println();Serial.print(F("卡片类型: "));MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);Serial.println(mfrc522.PICC_GetTypeName(piccType));// 检查兼容性if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI&&  piccType != MFRC522::PICC_TYPE_MIFARE_1K&&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {Serial.println(F("仅仅适合Mifare Classic卡的读写"));return;}MFRC522::StatusCode status;if (status != MFRC522::STATUS_OK) {Serial.print(F("身份验证失败?或者是卡链接失败"));Serial.println(mfrc522.GetStatusCodeName(status));return;}//停止 PICCmfrc522.PICC_HaltA();//停止加密PCDmfrc522.PCD_StopCrypto1();return;
}//将字节数组十进制转储为串行的十六进制值
void dump_byte_array(byte *buffer, byte bufferSize) {for (byte i = 0; i < bufferSize; i++) {Serial.print(buffer[i] < 0x10 ? " 0" : " ");Serial.print(buffer[i], HEX);}
}

Blinker+小爱同学+四路继电器+(RFID+舵机模拟开门)代码相关推荐

  1. ESP8266 Blinker 小爱同学 本地控制 手机配网 四路开关 物联网 arduino编程详细注释

    作为一名注册12年CSDN的电脑爱好者,没有从事喜欢的IT行业还是颇有那么一丝丝的想念. 通过一段时间的arduino编程和ESP8266学习,参考示例程序等,完善了自己的一份小爱同学四开关控制的程序 ...

  2. esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节

    esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节 所需准备的库: Adafruit_NeoPixel Blinker 开发板选择 1.源代码部分: 源代码: //WS281 ...

  3. ESP8266+Blinker+小爱同学舵机控制开关

    ESP8266 文章目录 ESP8266 一.简介 二.硬件连接 三.代码 四.blinker软件配置 总结 一.简介 最近想着用我们的小爱同学语音控制卧室的灯,这样就可以在睡觉的时候不用下床了,之前 ...

  4. WiFiduino+blinker+小爱同学打造智慧卧室

    系列文章目录 文章目录 系列文章目录 前言 一.实现功能 二.所需材料 三.导线连接 四.软件开发 1.开发环境搭建 2.编写程序 五 手机操作部分 1.blinkerAPP 2. 米家APP 3.小 ...

  5. 使用ESP8266与小爱同学通过Arduino控制舵机

    一.硬件 名称 数量 ESP8266开发板 1 Arduino UNO 1 MG995舵机 1 杜邦线 若干 二.开发环境配置 本实验通过Arduino IDE调用Blinker提供的SDK实现 ID ...

  6. (含代码)ESP8266+舵机 制作wifi灯控开关(arduino,点灯科技,小爱同学/天猫精灵实现)

    目录 项目涉及的主代码 前言 一.环境搭建 二.开发步骤 1.注册点灯科技平台 2.在点灯科技平台注册设备,获取Secret Key 3.在Arduino IDE中编写代码,写入ESP8266 4.编 ...

  7. ESP8266利用Bliker、小爱同学和本地按钮控制4路开关

    ESP8266利用Bliker.小爱同学和本地按钮控制4路开关 Blinker函数说明: Button.color("#FFFF00"); //设置app按键是纯黄色,16进制颜色 ...

  8. ESP8266用点灯app接入小爱同学

    ESP8266接入小爱同学-智能LED台灯或风扇 首先用的是arduino IDE对esp8266进行的编译,arduino对8266编译环境的具体配置可参考 1.利用WiFiManager库实现自动 ...

  9. ESP8266 快速对接小爱同学 语音控制

    ESP8266 快速对接小爱同学 一.环境资料 二.安装配置 三.下载Blinker手机APP,并更改符合小米小爱协议的代码 四.米家绑定Blinker点灯 一.环境资料 1. 硬件:ESP8266 ...

最新文章

  1. python有道词典-利用Python3和Charles爬取有道词典
  2. 面试题leetcode 3. 无重复字符的最长子串 暴力法和滑动窗口解法
  3. PHP — Cookie and Session篇
  4. JDK源码分析:Byte.java
  5. AI种番茄!腾讯xWUR智慧温室大赛预赛揭晓,农科院和三星等五队挺进决赛
  6. 不知道工作组名称怎样加入_第一次穿汉服不知道该怎样选择!一招教你用体型选汉服!...
  7. oracle读写文件--利用utl_file包对磁盘文件的读写操作
  8. Ubuntu已经很好用了
  9. linux中搜索指定字符串的方法
  10. 数据库系统概论(第五版) 王珊 第一章课后习题答案
  11. 刷脸支付帮助店铺构建细致准确的用户画像
  12. 降维 php,线性降维方法 - 百度开发者中心的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. 智慧消防三维地理信息应急指挥平台
  14. 5.交换机环路与VLAN
  15. mysql docker oom_记一次 K3s MySQL 启动 OOM 排查
  16. 考研计算机学硕370分,考研370分是什么水平??
  17. cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:971:
  18. Gitlab的介绍及使用
  19. [通信原理实验]北京邮电大学信息工程专业
  20. 六边形战士—雷达图实现

热门文章

  1. 【ROS】分布式系统【talkerlistener】(新增自定义名称)
  2. 怎么把做好的ps保存成图片_PS怎么把一张图片切片保存成多张png图片?
  3. LINUX - 实时LINUX内核(PREEMPT_RT)的编译安装以及测试
  4. 计算机课ps软件,电脑上的ps软件叫什么
  5. [nginx代理配置][nginx proxy_pass][nginx从一台服务器代理到另外一台服务器,浏览器地址不改变]
  6. quadro显卡好在哪
  7. 开源神器:让你一键卸载 Windows 默认程序!
  8. 简述:静态工作点(Q点),直流负载线,交流负载线
  9. IDEA小技巧之痛苦面具 主菜单不见了怎么办?
  10. word图文混排复制到JMEditor图片不显示