实训8——蓝牙修改开锁密码

2023-11-10 23:10

本文主要是介绍实训8——蓝牙修改开锁密码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

一、实验目的

通过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发送信息
通讯协议:
字段帧头标识校验和数据
长度2B1B1B16B

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

蓝牙修改按键密码
字段帧头标识校验和数据
内容55aa20006B修改密码

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

5) 测试结果

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

串口调试器

这篇关于实训8——蓝牙修改开锁密码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/385902

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Mysql8.0修改配置文件my.ini的坑及解决

《Mysql8.0修改配置文件my.ini的坑及解决》使用记事本直接编辑my.ini文件保存后,可能会导致MySQL无法启动,因为MySQL会以ANSI编码读取该文件,解决方法是使用Notepad++... 目录Myhttp://www.chinasem.cnsql8.0修改配置文件my.ini的坑出现的问题

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和