实训3——按键开锁

实训三 : 密码开锁

一、实验目的

通过ESP32,按键模块和SG90舵机,实现从键盘输入正确密码后,ESP32能控制舵机转动

二、实验内容

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 15

BLECharacteristic *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 keypad

Keypad 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进制发送
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){
            op=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:{ //设置密码
          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 service
  pServer->getAdvertising()->start();// Start advertising
  Serial.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){  //匹配成功,开锁
            toggle = true; 
            keys_len=0;
        }
        break;
      }
      case '*':{ //回退键
        if(keys_len >0)
          keys_len--;
        break;
      }
      default:{ //默认数字键0-9
        pw[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) 测试结果

键盘分配0-9,*为回退键,#为确认键
代码烧录成功后,从键盘输⼊123456 #(确定)
如果密码不正确,则需显示密码错误;
如果密码正确,则会控制舵机转动来实现开锁操作

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值