前提条件与思路
我的宿舍门是这种旋转锁舌式的,所以可以通过舵机拉动门锁旋转即可完成开门动作。不是这种门锁的也可以参考一下。
硬件部分
- 设备采用两节18650电池供电。
- 蓝牙模块连在Arduino上,Arduino通过一个小型的继电器控制舵机电源的连接,舵机的PWM引脚连在Arduino上。
- 舵机不能连在Arduino的板载5V上,因为舵机电流太大,会把Arduino开发板烧坏。
- 其次,需要在开门动作完成后就将舵机电源断开,不然舵机在通电的情况下会一直处于保持状态,不能通过外力转动,而且在外力作用下,舵机为了保持角度,容易电流过大烧坏。
硬件准备
参考链接仅供参考,请自行选择
物品 | 数量 |
---|---|
arduino nano | 一个 |
JDY-18蓝牙模块 | 一个 |
舵机 | 一个 |
小型固态继电器 | 一个 |
小面包板 | 一个 |
跳线、杜邦线 | 若干 |
硬件连接
蓝牙模块的连接
JDY-18 | Arduino |
---|---|
RXD | TXD |
TXD | RXD |
VCC | 3V |
GND | GDN |
STAT | P4 |
注意:
文章使用硬串口,在烧录程序的时候记得将RXD、TXD断开,否则不能烧录程序。
自己可以改为使用软串口,就可以不断开蓝牙模块的连接烧录。
舵机的连接
连接是自由的,只要连在Arduino上可以输出PWM的引脚就行,哪几个可以输出PWM自行查找。同时,引脚号与程序中的统一即可。
舵机 | Arduino |
---|---|
VCC | 3-7.2V(继电器) |
GND | GND(继电器) |
PWM信号线 | P9 |
整体连接图
软件部分
基本思路
借助Blinker平台,可以比较方便快捷地搭建控制平台。使用Blinker通过蓝牙连接设备,按下开门按钮,控制舵机打开门。
具体代码
#define BLINKER_PRINT Serial
#define BLINKER_BLE
#include <Servo.h>
#include <Blinker.h>
//定义引脚号
#define pin_bluetooth_stat 4
#define pin_led 6
#define pin_servo 9
#define servoPWM 8
//舵机变量
Servo s;
// 新建组件对象
BlinkerButton Button1("btn-abc");//开门
BlinkerButton Button2("btn-abd");//更新数据
BlinkerNumber NUM("num-abc");
BlinkerNumber NUM1("num-tim1");
BlinkerNumber NUM2("num-tim2");
BlinkerNumber NUM3("num-tim3");
BlinkerNumber NUM4("num-num");
unsigned int a,b,c;
unsigned int tims=0;
byte t;
void setup()
{
// 初始化串口与引脚
Serial.begin(9600);
pinMode(pin_bluetooth_stat,INPUT);
pinMode(pin_led,OUTPUT);
pinMode(servoPWM,OUTPUT);
// 初始化blinker
Blinker.begin(0,1,9600);
Button1.attach(button1_callback);
Button2.attach(button2_callback);
//初始化舵机引脚
s.attach(pin_servo);
s.write(45);
}
void loop()
{
//判断蓝牙是否连接(蓝牙连接时为高)
while(!digitalRead(pin_bluetooth_stat))
{
t=1;
digitalWrite(pin_led,LOW);
digitalWrite(servoPWM,LOW);//关闭舵机电源
}
digitalWrite(pin_led,HIGH);
digitalWrite(servoPWM,HIGH);//打开舵机电源
Blinker.run();
if(digitalRead(pin_bluetooth_stat)&&t==1)
{
delay(1000);
freshData();
}
t=0;
}
// 按下按键即会执行该函数(开门)
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
Open();
}
//更新数据
void button2_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
freshData();
}
//开门动作
void Open()
{
Serial.println("Welcome!");
tims=tims+1;
freshData();
s.write(180); //开门的角度与延时需按照实际情况调试
delay(500);
s.write(45);
delay(500);
}
//更新数据(计算运行时间,可以去掉)
void freshData()
{
NUM3.print((a=millis()/60000)%60);
NUM2.print((b=a/60)%24);
NUM1.print(c=b/24);
NUM4.print(tims);
}
代码补充
- 目前状态下,用两节18650电池供电,可续航7天左右。为降低功耗,可使用Arduino的省电模式,将蓝牙STAT引脚连到Arduino的INT中断pin上,然后在空闲时,Arduino睡眠,STAT为高电平时唤醒。如此可以进一步提升续航。需要省电模式可以参考。
- 代码中的记录工作时间的功能可以自己去掉。
- 代码中展示的蓝牙连接状态的LED灯的引脚连接比较简单,所以硬件部分没有说,看代码应该知道怎么连。
手机端blinker的使用
具体的连接与使用参考Blinker官网的文档。安装好Blinker后,连接设备。
连接好设备后在布局中创建两个按钮。按钮的ID需要与代码中的一致。即“btn-abc”与“btn-abd”。
BlinkerButton Button1(“btn-abc”);//开门
BlinkerButton Button2(“bin-bad”);//更新数据
Blinker的具体使用可以参考官网文档:
blinker的使用
最终实现效果
指纹开门
下一篇,将分享指纹开门。已经做好了,还没写,需要的可以关注一下。(新人初来乍到)