实训九 : 蓝牙修改开锁密码

一、实验目的

通过ESP32,按键模块和SG90舵机,实现蓝牙发送相应的命令修改按键密码

二、实验内容

1.连接ESP32和按键模块的引脚,以及ESP32和SG90舵机的引脚
2.从键盘输入密码,ESP32获取到所输入的密码并判断是否正确
3.密码验证正确后,ESP32控制舵机的转动

三、实验设备

1.ESP32-WROOM-32D 开发板
2. 3*4按键模块
3.SG90舵机
4.杜邦线

四、实验步骤

1) 连接引脚

3*4矩阵键盘

引脚依次为: 7 6 5 4 3 2 1(从左往右)

SG90 舵机

SG90 舵机的引脚图

引脚依次为:
1.VCC
2.PWM : 脉冲宽度调制
3.GND

连接图

2) 环境配置

1.下载适用于ESP32的电机驱动的库 Servo.h,下载链接:**https://github.com/RoboticsBrno/ESP32-Arduino-Servo-Library **
2.打开Arduino IDE,选择左上角 工具–开发板,选择对应的开发板(ESP32 Dev Module)
3.选择 工具–端口 , 选择对应的端口

3) 测试代码

#include <dummy.h>
#include <Servo.h>
#include <BLEDevice.h>
#include <BLE2902.h>
#include <String.h>
#include <Keypad.h>
#define SERVO_PIN 15BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
#define SERVICE_UUID           "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
#define openInterval  5000
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}
};
byte rowPins[ROWS] = {33, 27, 14, 12}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 0, 2}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ble_rx_buffer[20]; //接收蓝牙指令
byte verfi_code[6] = {0x31,0x32,0x33,0x34,0x35,0x36};//初始密码
byte init_pw[6] = {1,2,3,4,5,6};//初始按键密码
Servo myservo;
int pos=0;
bool toggle; //开锁判断位
void locker(bool toggle) { //开锁myservo.attach(SERVO_PIN); if (toggle) {myservo.write(90); // 开锁} else {myservo.write(0); // 关锁}delay(250); // 等马达转到定位myservo.detach();
}
class MyServerCallbacks: public BLEServerCallbacks {void onConnect(BLEServer* pServer) {deviceConnected = true;};void onDisconnect(BLEServer* pServer) {deviceConnected = false;}
};
/*相应的命令帧例子* 55aa1000313233343536 蓝牙发送开门指令,hex 16进制发送* 55aa2000363534333231 蓝牙修改密码指令
*/
class MyCallbacks: public BLECharacteristicCallbacks {void onWrite(BLECharacteristic *pCharacteristic) {std::string rxValue = pCharacteristic->getValue(); byte op;for (int i = 0; i < rxValue.length(); i++){ble_rx_buffer[i] = rxValue[i];Serial.print(rxValue[i]);}if(ble_rx_buffer[0] == 0x55 && ble_rx_buffer[1] == 0xaa){ //匹配帧头55aaop=ble_rx_buffer[2];switch(op){ //标识位case 0x10:{ //蓝牙开门if(memcmp(ble_rx_buffer+4,verfi_code,6) == 0){ //匹配成功toggle = true;  Serial.println("开门成功");     }else{Serial.println("密码错误");}break;}case 0x20:{ //设置按键密码static byte temp_pw[6]; //临时密码for(byte i=0;i<6;i++){ if(ble_rx_buffer[i+4]<=0x39 && ble_rx_buffer[i+4]>=0x30){ //保证密码在0-9之间 temp_pw[i]=ble_rx_buffer[i+4]-0x30; }else{ //无效字符break;}if(i==5){ //密码修改完成Serial.println("密码修改完成");memcpy(init_pw,temp_pw,6); }}break;}case 0x30:{ //查看指纹break;}case 0x31:{//添加指纹break;}case 0x32:{ //删除指纹break;}}//locker(toggle);}}
};void setupBLE(String BLEName){           //连接蓝牙const char *ble_name = BLEName.c_str();       BLEDevice::init(ble_name);                    BLEServer *pServer = BLEDevice::createServer(); //创建服务pServer->setCallbacks(new MyServerCallbacks());BLEService *pService = pServer->createService(SERVICE_UUID);    pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX,BLECharacteristic::PROPERTY_NOTIFY);  pCharacteristic->addDescriptor(new BLE2902());  //添加描述BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE);pCharacteristic->setCallbacks(new MyCallbacks());  //receive message callback  pService->start();// Start the servicepServer->getAdvertising()->start();// Start advertisingSerial.println("Waiting a client connection to notify...");
}void compare_pw(char key){static byte pw[20];static byte keys_len = 0;if(key){Serial.println(key);switch(key){case '#':{ //确认键if(keys_len == 6 && memcmp(pw,init_pw,6)==0){  //匹配成功,开锁Serial.println("开门成功");toggle = true; }else{Serial.println("密码错误");}keys_len=0; //清零break;}case '*':{ //回退键if(keys_len >0)keys_len--;break;}default:{ //默认数字键0-9pw[keys_len++]=key-'0';if(keys_len>19){Serial.println("OverSize");keys_len=0;}break;}}}
}
void setup() { Serial.begin(115200);setupBLE("ESP32 Device");//设置蓝牙名称myservo.attach(SERVO_PIN); //引脚12为PWM脚
}
void loop() {static unsigned long toggle_time = millis();static bool lock_back_flag=false;compare_pw(keypad.getKey()); //比对按键输入密码if(toggle){ //开门计时locker(toggle); //开锁toggle = false;lock_back_flag = true;toggle_time = millis();}if(millis() - toggle_time > openInterval && lock_back_flag){  //回锁时间lock_back_flag = false;locker(toggle);//回锁}
}

4)手机APP发送信息

通讯协议:
字段 帧头 标识 校验和 数据
长度 2B 1B 1B 16B

帧头:55aa
标识:
10 : 蓝牙开门
20:设置密码
30:查看指纹
31:添加指纹
32:删除指纹
检验和:目前不做校验,填00即可
数据: 16字节,可以不填满

蓝牙修改按键密码

字段 帧头 标识 校验和 数据
内容 55aa 20 00 6B修改密码

蓝牙修改按键密码发送消息案例:55aa2000363534333231
ps:都是以16进制发送,对应相应的ASCII码

5) 测试结果

键盘分配0-9,*为回退键,#为确认键
代码烧录成功后,蓝牙发送55aa2000363534333231,修改密码为654321
键盘输入6 5 4 3 2 1 #(确认键)
如果密码不正确,则需显示密码错误;
如果密码正确,则会控制舵机转动来实现开锁操作

实训9——蓝牙修改开锁密码相关推荐

  1. 实训4——RFID刷卡开锁

    实验六:RFID刷卡开锁实验 一.实验目的 通过ML-RC522读取S50IC卡的用户身份证明信息使用SPI通信协议传送给ESP32,ESP32接受到信息后与自身设定的可用的用户身份证明信息进行对比, ...

  2. CSDN实训 - 通过Java修改游戏存档

    文章目录 前言 一.实现思路 二.项目准备 1. 创建maven工程 2. 导入依赖 ①. JSON依赖 ②. Lombok依赖 ③. Junit4单元测试 三.核心代码 1. 使用的对象 2. 读取 ...

  3. 笔记本电脑忘记开锁密码怎么办?(超详细教程,只适用于2013年以后生产的笔记本电脑,且为win10操作系统)

    1.首先,用一台电脑,百度搜索"大白菜",找到官网,点击进入 2.下载以下版本 3.上一步下载时间较长需要耐心等待以下,待下载完成后,解压该文件 4.解压完成后,插入u盘(该u盘空 ...

  4. 中职计算机实训室管理规定,中高职智慧实训室管理系统

    中高职智慧实训室管理系统 利用物联网.互联网技术,通过智能数据控制终端设备获取前端数据资源,结合实训室管控软件平台的支撑,将实训室智能门禁.实训室视频监控.实训室远程电控.实训室温湿度检测.智慧电子门 ...

  5. html5网页制作实训日志,网页制作实训日志X.doc

    实训日志 日期:2012-6-11(1-4)地点:信2-501机房实训内容:构思网页,确立主题构思的问题,没有一个初步的想法,对于资料的寻找也没有方向.所以,开始时我并没有急于去查找资料,而是先画出了 ...

  6. Android定制化自己的开锁界面

    android 在4.0以前,解锁界面是采用横滑的方式,在4.0之后,就采用了中心圆环的解锁方式,4.0和4.1都是有三个图标的,分别是:向上的google搜索应用,向左的拍照应用以及向右的正常解锁功 ...

  7. 电气安装与维修实训设备

    ZN-123A电气安装与维修实训设备 一.概述: ZN-123A电气安装与维修实训设备是根据国内工厂电气安装和室内电气安装等维修电工和建筑电气安装工实训鉴定要求开发的一种通用实训平台.电气安装与维修调 ...

  8. 项目实训答辩经典对话

    测试空间旗下大头针出品 今天的107答辩了,加班加点的日子终于过完了.在项目实训的过程中,每一位组员都积极主动,勇于承担,互帮互助.平时都自愿加班加点做项目.还记得很久前对这些学员的要求:信心,耐心, ...

  9. 51单片机ESP8266WIFI远程门禁密码锁可修改密码APP开锁查看密码

    实践制作DIY- GC003-WIFI远程门禁密码 一.功能说明:   基于51单片机设计-WIFI远程门禁密码锁 二.功能介绍:  1.基于STC89C52RC,有一个LCD1602显示器显示信息, ...

最新文章

  1. Python中enumerate用法详解
  2. Linux学习—vim大全
  3. SAP S4HANA的product搜索的动态SQL语句的拼接原理
  4. IOS 5 中@synthesize window = _window是什么意思呢
  5. fifo算法_缓存算法FIFO、LFU、LRU
  6. “动态规划”这词太吓人,其实可以叫“状态缓存”
  7. Analytical.Graphics.STK.Pro.v8.11
  8. VCPKG 包下载失败解决思路
  9. 改变世界面貌的十个数学公式
  10. win10通过ping命令来检测网速
  11. Servlet共享数据域cookie、session ;监听器;过滤器
  12. 面试的时候,如何自我介绍?
  13. Oracle用OEM和命令行方式创建用户及表空间
  14. 最强悍的围棋人机对战程序 MoGo !
  15. csdn过滤广告谷歌浏览器插件
  16. java年份判断_java怎么判断年份是否是闰年
  17. 爬虫数据分析实战——腾讯视频《奔跑吧》第九季弹幕数据分析
  18. python plt输出eps图片打开后显示空白
  19. 对自适应拉普拉斯机制的理解
  20. 使用决策树(decision-tree)预测隐形眼镜类型(标签二值化(LabelBinarizer)复原输出)

热门文章

  1. 运算器和控制器在计算机的作用,运算器和控制器合称为什么
  2. 短线操盘的10种方法、
  3. HBuilder的下载与使用(详细步骤)
  4. loadrunner之virtual user generator的使用
  5. 傅里叶变换及其在opencv中图像去噪的实现
  6. Linux云计算架构-docker容器命名和资源配额控制(2)
  7. DWZ表单验证规则一览表
  8. TexturePacker命令行拉起参数
  9. java 解密pdf_Java 加密和解密 PDF
  10. 2022陕西清北录取人数排名,西工大附中遥遥领先,高新一中40人