制作一个简易宿舍蓝牙密码锁-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4711|回复: 3

制作一个简易宿舍蓝牙密码锁

[复制链接]
发表于 2019-9-6 21:22 | 显示全部楼层 |阅读模式
本帖最后由 XlinliY.Zhang 于 2020-8-9 01:49 编辑

首先引用库文件[mw_shl_code=arduino,true]#include <Servo.h>
#include <Keypad.h>
#include <MsTimer2.h>[/mw_shl_code]

舵机库驱动舵机开门
定时中断用于清除密码
键盘库处理矩阵键盘输入
[mw_shl_code=arduino,true]#define PWD1 1234 //密码1
#define PWD2 1234 //密码2
#define lock 130 // 锁门舵机角度
#define unlock 60 //开门舵机角度
#define dead_lock_time 15 //输错锁死时间
#define error_number 5 //多少次错误锁死
#define BLE_Serial Serial //定义蓝牙连接串口[/mw_shl_code]
新建一些变量
[mw_shl_code=arduino,true]String scan = ""; //储存输入的密码
int input_error = 0; //记录输错次数
const byte ROWS = 4; // 矩阵键盘大小
const byte COLS = 4;[/mw_shl_code]
下面是矩阵键盘定义和引脚
[mw_shl_code=arduino,true]char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', '0'},
  {'4', '5', '6', '0'},
  {'7', '8', '9', '0'},
  {'C', '0', '0', 'D'}
};
byte rowPins[ROWS] = {6, 7, 8, 9};
byte colPins[COLS] = {2, 3, 4, 5};[/mw_shl_code]
实例矩阵键盘和舵机对象
[mw_shl_code=arduino,true]Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

Servo myservo;[/mw_shl_code]
下面是初始化蓝牙串口和声明舵机引脚
[mw_shl_code=arduino,true]  Serial.begin(38400);
  //  BLE_Serial.begin(38400);
  myservo.attach(11);
  pinMode(13, INPUT_PULLUP);//干簧管,检测门状态
  pinMode(12, OUTPUT);
  pinMode(10, OUTPUT);//蜂鸣器
  digitalWrite(12, LOW);
  MsTimer2::set(2500, clean);//此处启动定时中断,用于清除密码,因为定时器关系,此处中断实际时间为设置时间的两倍,单位ms
[/mw_shl_code]
loop内容
[mw_shl_code=arduino,true]check_error_number();
  check_Serial();//检查串口输入
  char customKey = customKeypad.getKey();//检查键盘输入
///////////处理键盘输出
  if (customKey) {
    Buzzer(1);
//处理正常输入
    if (customKey != 'D' && customKey != 'C') {
      scan += customKey;
      Serial.print("INPUT:");
      Serial.println(customKey);
      MsTimer2::start();
    }
//没有自动校验的话,用于确认,即确认键
    else if (customKey == 'D')
    {
      MsTimer2::stop();
      check();
    }
//退格
    else if (customKey == 'C')
    {
      MsTimer2::stop();
      Buzzer(3);
      int alter = scan.toInt();
      scan = "";
      scan += alter / 10;
      Serial.println(scan);
      MsTimer2::start();
    }
  }
//达到位数自动校对密码
  automated_proof();
}[/mw_shl_code]
开门函数
[mw_shl_code=arduino,true]
void opening() {
//do while 函数用于检测13号引脚,如果门没开,则一直循环开门
  do {
    Serial.println("OPENING!");
    myservo.write(unlock);
    delay(3000);
    myservo.write(lock);
  } while (digitalRead(13) == 1);
}[/mw_shl_code]蜂鸣器函数,用于各种情况的蜂鸣器发声
[mw_shl_code=arduino,true]void Buzzer(int  Type) {
  if (Type == 1) {
    tone(10, 3000);
    delay(50);
    noTone(10);
  }
  else if (Type == 2) {
    tone(10, 500);
    delay(1000);
    noTone(10);
  }
  else if (Type == 3) {
    tone(10, 2000);
    delay(50);
    noTone(10);
  }
}[/mw_shl_code]
检查函数,用于输入密码的校验
[mw_shl_code=arduino,true]void check() {
  int inputPWD = scan.toInt();
  Serial.println(inputPWD);
  if (inputPWD == PWD1 || inputPWD == PWD2) {
    Serial.println("Passwaord Ringht!");
    opening();
    scan = "";
  }
  else {
    scan = "";
    Serial.println("Password Error!");
    input_error++;
    Serial.print("Error number:");
    Serial.println(input_error);
    Buzzer(2);
  }
}[/mw_shl_code]
定时中断服务函数,用于清除输入的密码
[mw_shl_code=arduino,true]void clean() {
  scan = "";
  Serial.println("Clean all input");
  MsTimer2::stop();
}[/mw_shl_code]
检查输入错误密码次数,次数超过阈值用delay锁死程序
[mw_shl_code=arduino,true]void check_error_number() {
  if (input_error == 5) {
    MsTimer2::stop();
    for (int i = 0; i < dead_lock_time; i++) {
      delay(1000);
      Serial.print("Dead lock");
      Serial.print(dead_lock_time - i);
      Serial.println("seconds left");
    }
    input_error = 0;
  }
}[/mw_shl_code]
检测蓝牙串口信息函数,用于处理蓝牙数据
[mw_shl_code=arduino,true]void check_Serial() {
  if (BLE_Serial.available()) {
    if (BLE_Serial.read() == '5') {
      Serial.println("BLE Received Opening!");
      opening();
    }
    else {
      Serial.println("BLE Received RebootWiFi!");
      

    }
  }
}[/mw_shl_code]
自动校验函数,密码到达一定长度自动校对
[mw_shl_code=arduino,true]void automated_proof() {
  if (scan.length() == 4) {
    MsTimer2::stop();
    check();
  }
}[/mw_shl_code]

蓝牙软件可以使用任何可以发ascii码的,我使用官方软件,具体可以去谷歌商店下载
 楼主| 发表于 2019-9-6 21:25 | 显示全部楼层
库文件arduino库管理器下载即可
发表于 2021-7-10 20:16 | 显示全部楼层
  1. 首先引用库文件[mw_shl_code=arduino,true]#include <Servo.h>
  2. #include <Keypad.h>
  3. #include <MsTimer2.h>[/mw_shl_code]

  4. 舵机库驱动舵机开门
  5. 定时中断用于清除密码
  6. 键盘库处理矩阵键盘输入
  7. [mw_shl_code=arduino,true]#define PWD1 1234 //密码1
  8. #define PWD2 1234 //密码2
  9. #define lock 130 // 锁门舵机角度
  10. #define unlock 60 //开门舵机角度
  11. #define dead_lock_time 15 //输错锁死时间
  12. #define error_number 5 //多少次错误锁死
  13. #define BLE_Serial Serial //定义蓝牙连接串口[/mw_shl_code]
  14. 新建一些变量
  15. [mw_shl_code=arduino,true]String scan = ""; //储存输入的密码
  16. int input_error = 0; //记录输错次数
  17. const byte ROWS = 4; // 矩阵键盘大小
  18. const byte COLS = 4;[/mw_shl_code]
  19. 下面是矩阵键盘定义和引脚
  20. [mw_shl_code=arduino,true]char hexaKeys[ROWS][COLS] = {
  21.   {'1', '2', '3', '0'},
  22.   {'4', '5', '6', '0'},
  23.   {'7', '8', '9', '0'},
  24.   {'C', '0', '0', 'D'}
  25. };
  26. byte rowPins[ROWS] = {6, 7, 8, 9};
  27. byte colPins[COLS] = {2, 3, 4, 5};[/mw_shl_code]
  28. 实例矩阵键盘和舵机对象
  29. [mw_shl_code=arduino,true]Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

  30. Servo myservo;[/mw_shl_code]
  31. 下面是初始化蓝牙串口和声明舵机引脚
  32. [mw_shl_code=arduino,true]  Serial.begin(38400);
  33.   //  BLE_Serial.begin(38400);
  34.   myservo.attach(11);
  35.   pinMode(13, INPUT_PULLUP);//干簧管,检测门状态
  36.   pinMode(12, OUTPUT);
  37.   pinMode(10, OUTPUT);//蜂鸣器
  38.   digitalWrite(12, LOW);
  39.   MsTimer2::set(2500, clean);//此处启动定时中断,用于清除密码,因为定时器关系,此处中断实际时间为设置时间的两倍,单位ms
  40. [/mw_shl_code]
  41. loop内容
  42. [mw_shl_code=arduino,true]check_error_number();
  43.   check_Serial();//检查串口输入
  44.   char customKey = customKeypad.getKey();//检查键盘输入
  45. ///////////处理键盘输出
  46.   if (customKey) {
  47.     Buzzer(1);
  48. //处理正常输入
  49.     if (customKey != 'D' && customKey != 'C') {
  50.       scan += customKey;
  51.       Serial.print("INPUT:");
  52.       Serial.println(customKey);
  53.       MsTimer2::start();
  54.     }
  55. //没有自动校验的话,用于确认,即确认键
  56.     else if (customKey == 'D')
  57.     {
  58.       MsTimer2::stop();
  59.       check();
  60.     }
  61. //退格
  62.     else if (customKey == 'C')
  63.     {
  64.       MsTimer2::stop();
  65.       Buzzer(3);
  66.       int alter = scan.toInt();
  67.       scan = "";
  68.       scan += alter / 10;
  69.       Serial.println(scan);
  70.       MsTimer2::start();
  71.     }
  72.   }
  73. //达到位数自动校对密码
  74.   automated_proof();
  75. }[/mw_shl_code]
  76. 开门函数
  77. [mw_shl_code=arduino,true]
  78. void opening() {
  79. //do while 函数用于检测13号引脚,如果门没开,则一直循环开门
  80.   do {
  81.     Serial.println("OPENING!");
  82.     myservo.write(unlock);
  83.     delay(3000);
  84.     myservo.write(lock);
  85.   } while (digitalRead(13) == 1);
  86. }[/mw_shl_code]蜂鸣器函数,用于各种情况的蜂鸣器发声
  87. [mw_shl_code=arduino,true]void Buzzer(int  Type) {
  88.   if (Type == 1) {
  89.     tone(10, 3000);
  90.     delay(50);
  91.     noTone(10);
  92.   }
  93.   else if (Type == 2) {
  94.     tone(10, 500);
  95.     delay(1000);
  96.     noTone(10);
  97.   }
  98.   else if (Type == 3) {
  99.     tone(10, 2000);
  100.     delay(50);
  101.     noTone(10);
  102.   }
  103. }[/mw_shl_code]
  104. 检查函数,用于输入密码的校验
  105. [mw_shl_code=arduino,true]void check() {
  106.   int inputPWD = scan.toInt();
  107.   Serial.println(inputPWD);
  108.   if (inputPWD == PWD1 || inputPWD == PWD2) {
  109.     Serial.println("Passwaord Ringht!");
  110.     opening();
  111.     scan = "";
  112.   }
  113.   else {
  114.     scan = "";
  115.     Serial.println("Password Error!");
  116.     input_error++;
  117.     Serial.print("Error number:");
  118.     Serial.println(input_error);
  119.     Buzzer(2);
  120.   }
  121. }[/mw_shl_code]
  122. 定时中断服务函数,用于清除输入的密码
  123. [mw_shl_code=arduino,true]void clean() {
  124.   scan = "";
  125.   Serial.println("Clean all input");
  126.   MsTimer2::stop();
  127. }[/mw_shl_code]
  128. 检查输入错误密码次数,次数超过阈值用delay锁死程序
  129. [mw_shl_code=arduino,true]void check_error_number() {
  130.   if (input_error == 5) {
  131.     MsTimer2::stop();
  132.     for (int i = 0; i < dead_lock_time; i++) {
  133.       delay(1000);
  134.       Serial.print("Dead lock");
  135.       Serial.print(dead_lock_time - i);
  136.       Serial.println("seconds left");
  137.     }
  138.     input_error = 0;
  139.   }
  140. }[/mw_shl_code]
  141. 检测蓝牙串口信息函数,用于处理蓝牙数据
  142. [mw_shl_code=arduino,true]void check_Serial() {
  143.   if (BLE_Serial.available()) {
  144.     if (BLE_Serial.read() == '5') {
  145.       Serial.println("BLE Received Opening!");
  146.       opening();
  147.     }
  148.     else {
  149.       Serial.println("BLE Received RebootWiFi!");
  150.       

  151.     }
  152.   }
  153. }[/mw_shl_code]
  154. 自动校验函数,密码到达一定长度自动校对
  155. [mw_shl_code=arduino,true]void automated_proof() {
  156.   if (scan.length() == 4) {
  157.     MsTimer2::stop();
  158.     check();
  159.   }
  160. }[/mw_shl_code]

  161. 蓝牙软件可以使用任何可以发ascii码的,我使用官方软件,具体可以去谷歌商店下载
复制代码
发表于 2021-7-14 16:21 | 显示全部楼层
代码写的挺好的
建议楼主可以考虑使用blinker进行蓝牙接入
话说这个锁有照片视频参考一下吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:41 , Processed in 0.093612 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表