点灯科技——小爱同学/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    15

MFRC522 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);//控制继电器1
      digitalWrite(Relay_2, io_level);//控制继电器2
      digitalWrite(Relay_3, io_level);//控制继电器3
      digitalWrite(Relay_4, io_level);//控制继电器4
      break;
    case 1:  //插座插孔一
      digitalWrite(Relay_1, io_level);//控制继电器1
      break;
    case 2:  //插座插孔二
      digitalWrite(Relay_2, io_level);//控制继电器2
      break;
    case 3:  //插座插孔三
      digitalWrite(Relay_3, io_level);//控制继电器3
      break;
    case 4:  //插座插孔四
      digitalWrite(Relay_4, io_level);//控制继电器4
      break;
    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();

  // 初始化有继电器的IO
  pinMode(Relay_1, OUTPUT);
  pinMode(Relay_2, OUTPUT);
  pinMode(Relay_3, OUTPUT);
  pinMode(Relay_4, OUTPUT);
  //初始化继电器初始状态
  digitalWrite(Relay_1, HIGH);   //继电器为低电平触发,初始化为HIGH
  digitalWrite(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 card
  Serial.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;
  }
  //停止 PICC
  mfrc522.PICC_HaltA();
  //停止加密PCD
  mfrc522.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);
  }
}

 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
继电器是一种电控制电器的装置,用来在电路中实现开关功能。它的工作原理可以简单地描述为:当输入电路的电流或电压满足一定条件时,继电器的线圈产生磁场,使得触点产生吸合或断开的动作。这样,继电器可以实现对高压电路的控制继电器模块的接线图可以根据具体的继电器模块而有所不同,但一般包括以下几个基本元素:继电器线圈、继电器触点、控制电源、输入信号和负载电源。 在一个典型的继电器模块中,继电器的线圈通过控制电源供电,输入信号可以是一个低电平的信号触发。一旦继电器线圈被触发,它会产生磁场,使得触点闭合或断开,从而控制负载电源的通断。 具体的继电器接线图可以根据不同的电路需求而有所差异。一般来说,你需要将控制信号接入继电器模块的输入端,将负载电源与继电器模块的输出端连接,并将继电器模块的控制电源接入。具体的接线图可以参考继电器模块的说明书或者根据具体的继电器型号进行确定。 请注意,不同的继电器模块可能有不同的工作原理和接线方式,请根据具体的继电器模块说明进行接线。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [51单片机驱动继电器模块点灯](https://blog.csdn.net/qq_42250136/article/details/108005233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值