使用Blinker蓝牙控制Arduino开宿舍门

2 篇文章 0 订阅
2 篇文章 0 订阅

前提条件与思路

我的宿舍门是这种旋转锁舌式的,所以可以通过舵机拉动门锁旋转即可完成开门动作。不是这种门锁的也可以参考一下。

如图为锁的样式

硬件部分

  1. 设备采用两节18650电池供电。
  2. 蓝牙模块连在Arduino上,Arduino通过一个小型的继电器控制舵机电源的连接,舵机的PWM引脚连在Arduino上。
  3. 舵机不能连在Arduino的板载5V上,因为舵机电流太大,会把Arduino开发板烧坏。
  4. 其次,需要在开门动作完成后就将舵机电源断开,不然舵机在通电的情况下会一直处于保持状态,不能通过外力转动,而且在外力作用下,舵机为了保持角度,容易电流过大烧坏。

硬件准备

参考链接仅供参考,请自行选择

物品数量
arduino nano一个
JDY-18蓝牙模块一个
舵机一个
小型固态继电器一个
小面包板一个
跳线、杜邦线若干

Arduino
JDY-18
在这里插入图片描述
在这里插入图片描述

硬件连接

蓝牙模块的连接

JDY-18Arduino
RXDTXD
TXDRXD
VCC3V
GNDGDN
STATP4

注意:

文章使用硬串口,在烧录程序的时候记得将RXD、TXD断开,否则不能烧录程序。
自己可以改为使用软串口,就可以不断开蓝牙模块的连接烧录。

舵机的连接

连接是自由的,只要连在Arduino上可以输出PWM的引脚就行,哪几个可以输出PWM自行查找。同时,引脚号与程序中的统一即可。

舵机Arduino
VCC3-7.2V(继电器)
GNDGND(继电器)
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);
}

代码补充

  1. 目前状态下,用两节18650电池供电,可续航7天左右。为降低功耗,可使用Arduino的省电模式,将蓝牙STAT引脚连到Arduino的INT中断pin上,然后在空闲时,Arduino睡眠,STAT为高电平时唤醒。如此可以进一步提升续航。需要省电模式可以参考
  2. 代码中的记录工作时间的功能可以自己去掉。
  3. 代码中展示的蓝牙连接状态的LED灯的引脚连接比较简单,所以硬件部分没有说,看代码应该知道怎么连。

手机端blinker的使用

具体的连接与使用参考Blinker官网的文档。安装好Blinker后,连接设备。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

连接好设备后在布局中创建两个按钮。按钮的ID需要与代码中的一致。即“btn-abc”与“btn-abd”。

BlinkerButton Button1(“btn-abc”);//开门
BlinkerButton Button2(“bin-bad”);//更新数据

Blinker的具体使用可以参考官网文档:
blinker的使用

最终实现效果

在这里插入图片描述

在这里插入图片描述

指纹开门

下一篇,将分享指纹开门。已经做好了,还没写,需要的可以关注一下。(新人初来乍到)
在这里插入图片描述

  • 14
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
以下是在 Arduino 环境下,利用 Blinker 蓝牙控制 ESP32 实现 WS2812B 切换颜色以及功能的代码: ```c++ #include <Blinker.h> #include <FastLED.h> #define LED_PIN 27 // WS2812B 灯带接 ESP32 的 GPIO27 引脚 #define LED_NUM 10 // 灯带上 LED 的数量 CRGB leds[LED_NUM]; WidgetLED rgb_led1("rgb_led1"); void setColor(uint8_t red, uint8_t green, uint8_t blue) { for (int i = 0; i < LED_NUM; i++) { leds[i].setRGB(red, green, blue); } FastLED.show(); } void initColor() { setColor(255, 0, 0); // 初始颜色为红色 } void setup() { Serial.begin(115200); // 初始化 BlinkerBlinker.begin("ESP32_LED", "Your device key"); // 请替换为自己的设备密钥 // 初始化 WS2812B 灯带 FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_NUM); // 初始化颜色 initColor(); } void setColorCallback(const String &color) { Serial.println(color); // 将颜色字符串转换成 RGB 值 uint8_t red = (uint8_t) strtol(&color[1], NULL, 16); uint8_t green = (uint8_t) strtol(&color[3], NULL, 16); uint8_t blue = (uint8_t) strtol(&color[5], NULL, 16); // 设置灯带颜色 setColor(red, green, blue); } void blinkCallback(const String &state) { Serial.println(state); // 设置闪烁效果 if (state == BLINKER_CMD_ON) { rgb_led1.blink(); } else { rgb_led1.off(); } } void loop() { // 处理 Blinker 接收到的消息 Blinker.run(); // 延迟 10ms,降低 CPU 占用率 delay(10); } ``` 在 Blinker 库中,`WidgetLED` 类可以帮助我们控制灯的状态。在上面的代码中,我们使用 `rgb_led1` 对象来控制一个 LED 灯的闪烁效果。 在 `setup()` 函数中,我们初始化了 Blinker 库和 WS2812B 灯带,并设置了初始颜色。 在 `setColorCallback()` 函数中,我们解析了从 Blinker 发来的颜色字符串,并调用 `setColor()` 函数来设置灯带颜色。 在 `blinkCallback()` 函数中,我们根据 Blinker 发来的消息来控制 LED 灯的闪烁效果。 最后,在 `loop()` 函数中,我们调用 `Blinker.run()` 函数来处理 Blinker 接收到的消息,并在每次循环结束后延迟 10ms,以降低 CPU 占用率。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白眼果蝇摩尔根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值