来看看单片机学生有多卷,基于esp32的简易宿舍开门神器

2022-04-15     大方老师单片机

原标题:来看看单片机学生有多卷,基于esp32的简易宿舍开门神器

来看看单片机学生有多卷,esp32的简易宿舍开门神器

相信很多人都有忘带钥匙的经历,我也经常看到有同学因为忘带钥匙而不得不在宿舍门口当门神。在入门esp32后,自然而然地就想利用这款集成wifi和蓝牙还便宜的芯片解决这个生活中的痛~

这个应该很多人都做过,我看过有arduino开发板结合射频模块做的,有stm32做指纹的,甚至还有做人脸识别的。可以说八仙过海,各显神通了。

我的方案就没啥技术了(太菜~

开门具体方案是esp32控制一12V减速电机拉动扶手(试过舵机,拉不~

.所需材料:

1.esp32-Wroom开发板20元左右)

2.12v双路继电器6块钱)

3.升压模块3块钱)

4.面包板3元)

5.12v直流减速电机13元)

6.充电(容量越大越好)

(杜邦线若干,电烙铁等常见工具)

.原理

一开始我是想esp32web局域网页开门RC522刷卡开门,但是功耗和稳定性感~

于是wifi改用蓝牙了,发现传统蓝牙功耗感~

BLE低功耗蓝牙,发现功耗依旧感人,于是把刷卡开门功能阉~

esp32作为主控,通讯方式BLE低功耗蓝牙,手机端连接至服务端并向服务端发送信息,服务端接收到信息后执行开门代码,控制电机开门。

完整的原理图

需要注意的是我这里是用充电宝供电,所以尽可能降低功耗来增加续航。

关于电机控制,我试过L298n来控制,失败了(理论上是可以的,不知为什么),后来用双路继电器来控制正反转原理如下图

关于电机我采用的25GA370直流减速电机12v60转每分钟),淘宝上一搜就能看到。实测下来扭力说是够了但缺点是转的太慢~电机长这个样~

.代码:开发环境arduino

[code]

int Buzzer = 5; //GPIO5蜂鸣器,提示音

long int ww = 0;

/*************************************************************************/

void servo(){

digitalWrite(2,HIGH);

delay(12500);

digitalWrite(2,LOW);

digitalWrite(Buzzer, 1);

delay(1000);

digitalWrite(Buzzer, 0);

delay(2000);

digitalWrite(4,HIGH);

delay(8000);

digitalWrite(4,LOW);

}

/***********************蓝牙配********************/

#include

#include

#include

#include

#include

#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"

bool deviceConnected = false;

BLECharacteristic *pCharact_TX;

class ServerCallbacks: public BLEServerCallbacks {

void onConnect(BLEServer* pServer) {

deviceConnected = true;

};

void onDisconnect(BLEServer* pServer) {

deviceConnected = false;

Serial.println("连线中");

BLEDevice::startAdvertising(); //重新发出广告

}

};

class RXCallbacks: public BLECharacteristicCallbacks {

void onWrite(BLECharacteristic *pCharact) {

std::string rxVal = pCharact->getValue();

Serial.printf("收到输入值%s\n", rxVal.c_str());

if (rxVal == "on") {

Serial.println("");

servo();

} else if (rxVal == "off") {

Serial.println("");

ESP.restart();

}

}

};

class TXCallbacks: public BLECharacteristicCallbacks {

void onStatus(BLECharacteristic *pCharact, Status s, uint32_t code) {

Serial.printf("状态码%d\n", s);

Serial.printf("code%d\n", code);

}

};

void printDeviceAddress() {

const uint8_t* point = esp_bt_dev_get_address();

for (int i = 0; i < 6; i++) {

char str[3];

sprintf(str, "%02X", (int)point[i]);

Serial.print(str);

if (i < 5){

Serial.print(":");

}

}

}

void setup() {

// put your setup code here, to run once:

/******************串口初始*******************/

Serial.begin(9600);

/*********************蓝牙初始************************/

BLEDevice::init("ESP32LED");

BLEServer *pServer = BLEDevice::createServer();

pServer->setCallbacks(new ServerCallbacks());

//建立服务

BLEService *pService = pServer->createService(SERVICE_UUID);

//建立特征

pCharact_TX = pService->createCharacteristic(

CHARACTERISTIC_UUID_TX,

BLECharacteristic::PROPERTY_NOTIFY |

BLECharacteristic::PROPERTY_READ

);

pCharact_TX->addDescriptor(new BLE2902());

pCharact_TX->setCallbacks(new TXCallbacks());

BLECharacteristic *pCharact_RX = pService->createCharacteristic(

CHARACTERISTIC_UUID_RX,

BLECharacteristic::PROPERTY_WRITE

);

pCharact_RX->setCallbacks(new RXCallbacks());

BLEDescriptor *pDesc = new BLEDescriptor((uint16_t)0x2901);

pDesc->setValue("控制板内LED的开");

pCharact_RX->addDescriptor(pDesc);

//启动服务

pService->start();

//开始广播

pServer->getAdvertising()->start();

Serial.println("等待用户端连线");

printDeviceAddress();

/*****************引脚初始***********************************************/

pinMode(Buzzer, OUTPUT);

pinMode(2,OUTPUT);//此引脚高电平正转

pinMode(4,OUTPUT);//此引脚高电平反S

}

/********************************蜂鸣器音***********************************/

void Di(int a)

{

for (int i = 0; i < a; i++)

{

digitalWrite(Buzzer, 1);

delay(250);

digitalWrite(Buzzer, 0);

delay(50);

}

}

void loop() {

// put your main code here, to run repeatedly:

/*******************************定时重********************************/

ww = millis(); //给开机时间赋值

if (ww >= 240*1000)//定时重启函数

{

ESP.restart();

return;

}

/*******************蓝牙开**************************/

if (deviceConnected) {

int hallVal = hallRead();

char buffer[5];

itoa(hallVal, buffer, 10);

pCharact_TX->setValue(buffer);

pCharact_TX->notify();

Serial.printf("送出 %d\n", hallVal);

}

delay(500);

}

[/code]

BLE低功耗蓝牙代码比传统蓝牙要复杂太多~

我的室友再也不用担心我没带钥匙~

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,私信我就可以~点我头像黑色字体加我也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比///

文章来源: https://twgreatdaily.com/zh-hans/f120f0dcce1aecb7ccfd7495f4e4b3f6.html