900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 点灯科技——小爱同学/RFID/四路继电器

点灯科技——小爱同学/RFID/四路继电器

时间:2020-08-22 14:24:20

相关推荐

点灯科技——小爱同学/RFID/四路继电器

通过Blinker点灯科技APP连接esp32,并连接小爱同学,同时通过语音模块录入声音识别对应的语句,并通过程序判断需要执行何种操作。

#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[] = "*********";//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组件中的“数据键名”一致,开关1BlinkerButton Button2("Switch2"); //组件对象,要和APP组件中的“数据键名”一致,开关2BlinkerButton Button3("Switch3"); //组件对象,要和APP组件中的“数据键名”一致,开关3BlinkerButton Button4("Switch4"); //组件对象,要和APP组件中的“数据键名”一致,开关4BlinkerButton 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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。