实训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

相关文章

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J