【巴法云连接小爱同学+RC522刷卡双控制舵机门锁】

代码解释(结尾有完整代码)

巴法云私钥及主题

String UID = "9XXX24844f759f7b134a9XXXXXXXXXXX";  //用户私钥,可在控制台获取,修改为自己的UID
String TOPIC4 = "lghz001";   //主题名字,可在控制台新

控制角度设置

void openlock() {
  mySerial.print("a");
  delay(50);
  //  Serial.println("openlock");
  servo.attach(servoPin);
  servo.write(90);//控制角度90度
  delay(2500);

  servo.write(0);
  delay(1500);
  servo.detach();
  mySerial.print("b");
}

卡号读取并写入程序内

void check(String temphex)
{
  //  Serial.println("check");
  if (temphex == "310XXXX")

  {
    //    Serial.println(temphex);灏的公交卡
    openlock();
  }

步骤1

:注册巴法云获取私钥及主题名
新建TCP主题,名称结尾001
可修改昵称
在这里插入图片描述

步骤2

:米家其他平台添加巴法云
在这里插入图片描述
在这里插入图片描述

步骤3

烧录程序,接好线
跟你的小爱同学说声开门就可以
接线看以下文章http://t.csdn.cn/qlE4t

这里是引用添加链接描述

步骤4(该步骤后期出教程)

通过AppInventor制作软件,可实现手机app控制舵机
在这里插入图片描述

代码

#include <ESP8266WiFi.h>
#define server_ip "bemfa.com" //巴法云服务器地址默认即可
#define server_port "8344" //服务器端口,tcp创客云端口8344

//********************需要修改的部分*******************//

#define wifi_name  "526"                           //WIFI名称,区分大小写,不要写错
#define wifi_password   "qing1471815xxxx."        //WIFI密码

#include <SPI.h>
#include <Servo.h>
#include <SoftwareSerial.h>
//手动安装
#include <MFRC522.h>

#define RST_PIN         5           // 配置针脚
#define SS_PIN          4
#define TOUCH_SIG D8

SoftwareSerial mySerial(D0, D3);
MFRC522 mfrc522(SS_PIN, RST_PIN);   // 创建新的RFID实例
MFRC522::MIFARE_Key key;
Servo servo;

unsigned long previousMillis = 0; //毫秒时间记录
int servoPin = 2;//D4

String UID = "9XXX24844f759f7b134a9XXXXXXXXXXX";  //用户私钥,可在控制台获取,修改为自己的UID
String TOPIC4 = "lghz001";   //主题名字,可在控制台新建///////////////////////////////////////////////////////////////////////////////////////////
//**************************************************//
//最大字节数
#define MAX_PACKETSIZE 512
//设置心跳值60s
#define KEEPALIVEATIME 60*1000
//tcp客户端相关初始化,默认即可
WiFiClient TCPclient;
String TcpClient_Buff = "";//初始化字符串,用于接收服务器发来的数据
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;
//相关函数初始化
//连接WIFI
void doWiFiTick();
void startSTA();

//TCP初始化连接
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);

//led控制函数,具体函数内容见下方

/*
  *发送数据到TCP服务器
 */
void sendtoTCPServer(String p){
  if (!TCPclient.connected()) 
  {
    Serial.println("Client is not readly");
    return;
  }
  TCPclient.print(p);
}


/*
  *初始化和服务器建立连接
*/
void startTCPClient(){
  if(TCPclient.connect(server_ip, atoi(server_port))){
    Serial.print("\nConnected to server:");
    Serial.printf("%s:%d\r\n",server_ip,atoi(server_port));
    
    String tcpTemp="";  //初始化字符串
    tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC4+"\r\n"; //构建订阅总指令
    ///////////////////////////////////////////////////////////////////////
    sendtoTCPServer(tcpTemp); //发送订阅指令
    tcpTemp="";//清空   
    


    
    preTCPConnected = true;
    preHeartTick = millis();
    TCPclient.setNoDelay(true);
  }
  else{
    Serial.print("Failed connected to server:");
    Serial.println(server_ip);
    TCPclient.stop();
    preTCPConnected = false;
  }
  preTCPStartTick = millis();
}


/*
  *检查数据,发送心跳
*/
void doTCPClientTick(){
 //检查是否断开,断开后重连
   if(WiFi.status() != WL_CONNECTED) return;
  if (!TCPclient.connected()) {//断开重连
  if(preTCPConnected == true){
    preTCPConnected = false;
    preTCPStartTick = millis();
    Serial.println();
    Serial.println("TCP Client disconnected.");
    TCPclient.stop();
  }
  else if(millis() - preTCPStartTick > 1*1000)//重新连接
    startTCPClient();
  }
  else
  {
    if (TCPclient.available()) {/////////////////////////////收数据
      char c =TCPclient.read();
      TcpClient_Buff +=c;
      TcpClient_BuffIndex++;
      TcpClient_preTick = millis();
      
      if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){
        TcpClient_BuffIndex = MAX_PACKETSIZE-2;
        TcpClient_preTick = TcpClient_preTick - 200;
      }
      preHeartTick = millis();
    }
    if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳
      preHeartTick = millis();
      Serial.println("--Keep alive:");
      sendtoTCPServer("ping\r\n"); //发送心跳,指令需\r\n结尾,详见接入文档介绍
    }
  }
  if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))
  {
    TCPclient.flush();
    Serial.print("Rev string: ");
    TcpClient_Buff.trim(); //去掉首位空格
    Serial.println(TcpClient_Buff); //打印接收到的消息
   String getTopic = "";
    String getMsg = "";
    
    String getTopic2 = "";
    String getMsg2 = "";
    if(TcpClient_Buff.length() > 15){                                    //注意TcpClient_Buff只是个字符串,在上面开头做了初始化 String TcpClient_Buff = "";
                                                                          //此时会收到推送的指令,指令大概为 cmd=2&uid=xxx&topic=light002&msg=off
          int topicIndex = TcpClient_Buff.indexOf("&topic=")+7;              //c语言字符串查找,查找&topic=位置,并移动7位,不懂的可百度c语言字符串查找
          int msgIndex = TcpClient_Buff.indexOf("&msg=");                   //c语言字符串查找,查找&msg=位置 
          getTopic = TcpClient_Buff.substring(topicIndex,msgIndex);          //c语言字符串截取,截取到topic,不懂的可百度c语言字符串截取
          getMsg = TcpClient_Buff.substring(msgIndex+5);                     //c语言字符串截取,截取到消息

          Serial.print("topic:------");
          Serial.println(getTopic); //打印截取到的主题值
          Serial.print("msg:--------");
          Serial.println(getMsg);   //打印截取到的消息值
   }

   
   if(getTopic=="lghz001"&&getMsg  == "on"){       //如果是消息==打开
     
     openlock2();
     system_restart(); //系统重新复位
     
   }
   else if(getTopic=="lghz001"&&getMsg == "off"){ //如果是消息==关闭
    

    }

   TcpClient_Buff="";
   TcpClient_BuffIndex = 0;
  }
}
/*
  *初始化wifi连接
*/
void startSTA(){
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(wifi_name, wifi_password);
}
/**************************************************************************
                                 WIFI
***************************************************************************/
/*
  WiFiTick
  检查是否需要初始化WiFi
  检查WiFi是否连接上,若连接成功启动TCP Client
  控制指示灯
*/
void doWiFiTick(){
  static bool startSTAFlag = false;
  static bool taskStarted = false;
  static uint32_t lastWiFiCheckTick = 0;

  if (!startSTAFlag) {
    startSTAFlag = true;
    startSTA();
  }

  //未连接1s重连
  if ( WiFi.status() != WL_CONNECTED ) {
    if (millis() - lastWiFiCheckTick > 1000) {
      lastWiFiCheckTick = millis();
    }
  }
  //连接成功建立
  else {
    if (taskStarted == false) {
      taskStarted = true;
      Serial.print("\r\nGet IP Address: ");
      Serial.println(WiFi.localIP());
      startTCPClient();
    }
  }
}

void rc522() {
  // 寻找新卡
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    //Serial.println("没有找到卡");
    return;
  }

  // 选择一张卡
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    //    Serial.println("没有卡可选");
    return;
  }
  
  // 显示卡片的详细信息
   Serial.print("卡片 UID:");
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
}

/**
   将字节数组转储为串行的十六进制值
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
  String temphex = "";
  for (byte i = 0; i < bufferSize; i++) {
    //    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    //    Serial.print(buffer[i], HEX);
    temphex += tohex(buffer[i]);
  }
  Serial.println(temphex);
  delay(100);
  check(temphex);

}
//十进制转十六进制
String tohex(int n) {
  if (n == 0) {
    return "00"; //n为0
  }
  String result = "";
  char _16[] = {
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };
  const int radix = 16;
  while (n) {
    int i = n % radix;          // 余数
    result = _16[i] + result;   // 将余数对应的十六进制数字加入结果
    n /= radix;                 // 除以16获得商,最为下一轮的被除数
  }
  if (result.length() < 2) {
    result = '0' + result; //不足两位补零
  }
  return result;
}

//获取状态
boolean get_touch() {
  boolean touch_stat = 0;
  touch_stat = digitalRead(TOUCH_SIG); //读入状态
  return touch_stat;
}
void openlock() {
  mySerial.print("a");
  delay(50);
  //  Serial.println("openlock");
  servo.attach(servoPin);
  servo.write(90);
  delay(2500);

  servo.write(0);
  delay(1500);
  servo.detach();
  mySerial.print("b");
}

void openlock2() {
  mySerial.print("a");
  delay(50);
  //  Serial.println("openlock");
  servo.attach(servoPin);
  servo.write(90);
  delay(9500);

  servo.write(0);
  delay(1500);
  servo.detach();
  mySerial.print("b");
}

void check(String temphex)
{
  //  Serial.println("check");
  if (temphex == "310XXX")

  {
    //    Serial.println(temphex);灏的公交卡
    openlock();
  }
else if (temphex == "36D9XXXX")

  {
    //    Serial.println(temphex);灏的校园卡
    openlock();
  }
  }
  else
  {
    mySerial.print("d");
  }

}

// 初始化,相当于main 函数
void setup() {

  mySerial.begin(115200);
  delay(100);
  SPI.begin();        // SPI开始
  mfrc522.PCD_Init(); // Init MFRC522 card
  delay(100);

  servo.attach(servoPin);
  servo.write(0);
  delay(200);
  servo.write(0);
  delay(200);
  servo.detach();

  mySerial.print("c");

  Serial.println("Beginning...");
}

//循环
void loop() {
  doWiFiTick();
  doTCPClientTick();
   rc522();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值