1663|4

274

帖子

8

TA的资源

纯净的硅(初级)

楼主
 

【无接触的人脸识别门禁系统】+ 4-门控制部分的实现 [复制链接]

 

不得不说,Arduino真的和适合快速开发,有很多库能够直接使用。上一次已经实现了蓝牙BLE的功能,现在需要对外设进行控制,主要包括:

一、控制舵机

通过舵机控制门的开关,舵机的控制使用servo库。 servo.attach(pin) 绑定舵机的控制引脚 servo.write(angle) 控制舵机的角度

二、加入定时任务

要实现门开启3s后自动关闭的功能,需要引入定时的库。这里使用的'Ticker'库, Ticker timer1(closeDoor, 3000, 1); 创建一个定时器 timer1.update(); 在主循环中调用这个函数,用于刷新定时器的值 timer1.start(); 启动定时器

三、读取门磁开关

通过门磁开关判断门当前是否为开启状态,用的是磁性的接近开关。

这个是一个开关量信号,当两边接近的时候,通过磁性吸合内部的开关,否则内部的开关断开,因此将IO口设置成上拉输入,当读取到低电平的时候,意味着门闭合了。

四、读取手势传感器 ADPS-9960

ADPS-9960是一个手势传感器,也可以当成接近开关来使用,通过'Adafruit_APDS9960' 库来完成操作。 apds.readProximity(); 读取接近开关检测到的距离。

五、演示视频

MyVideo_1

 

六、代码

#include <ArduinoBLE.h>
#include "Ticker.h"
#include <Servo.h>
#include "Adafruit_APDS9960.h"

const int ledPin = LED_BUILTIN; // set ledPin to on-board LED
const int buttonPin = 4; // set buttonPin to digital pin 4
const int switchPin = 7; 
const int INT_PIN = 2;
BLEService doorService("19B10010-E8F2-537E-4F6C-D104768A1214"); // create service

// create switch characteristic and allow remote device to read and write
BLEByteCharacteristic ledCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);
// create button characteristic and allow remote device to get notifications
BLEByteCharacteristic buttonCharacteristic("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify);
BLEByteCharacteristic apds9960Characteristic("19B10013-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify);
void closeDoor();
Ticker timer1(closeDoor, 3000, 1);
Servo myservo;
int pos = 0;
Adafruit_APDS9960 apds;

void setup() {
  // Serial.begin(9600);
  // while (!Serial);
  pinMode(INT_PIN, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT); // use the LED as an output
  pinMode(buttonPin, INPUT); // use button pin as an input
  pinMode(switchPin, INPUT_PULLUP);
  if(!apds.begin()){
    // Serial.println("failed to initialize device! Please check your wiring.");
  }
  // else Serial.println("Device initialized!");

  //enable proximity mode
  apds.enableProximity(true);

  // //set the interrupt threshold to fire when proximity reading goes above 175
  // apds.setProximityInterruptThreshold(0, 175);

  // //enable the proximity interrupt
  // apds.enableProximityInterrupt();
  myservo.attach(9);
  myservo.write(0);
  // begin initialization
  if (!BLE.begin()) {
    // Serial.println("starting Bluetooth® Low Energy module failed!");

    while (1);
  }

  // set the local name peripheral advertises
  BLE.setLocalName("Door_ctrl");
  // set the UUID for the service this peripheral advertises:
  // BLE.setAdvertisedService(doorService);

  // add the characteristics to the service
  doorService.addCharacteristic(ledCharacteristic);
  doorService.addCharacteristic(buttonCharacteristic);
  doorService.addCharacteristic(apds9960Characteristic);
  // add the service
  BLE.addService(doorService);

  ledCharacteristic.writeValue(0);
  buttonCharacteristic.writeValue(0);
  apds9960Characteristic.writeValue(0);
  // start advertising
  BLE.advertise();

  // Serial.println("Bluetooth® device active, waiting for connections...");
}

void loop() {
  // poll for Bluetooth® Low Energy events
  BLE.poll();
  timer1.update();
  // read the current button pin state
  char buttonValue = digitalRead(buttonPin);

  // has the value changed since the last read
  bool buttonChanged = (buttonCharacteristic.value() != buttonValue);

  if (buttonChanged) {
    // button state changed, update characteristics
    ledCharacteristic.writeValue(buttonValue);
    buttonCharacteristic.writeValue(buttonValue);
  }

  if (ledCharacteristic.written() || buttonChanged) {
    // update LED, either central has written to characteristic or button state has changed
    if (ledCharacteristic.value()) {
      Serial.println("LED on");
      // digitalWrite(ledPin, HIGH);
      myservo.write(70);
      timer1.start();
      // Serial.println("Start timer!");
    } else {
      Serial.println("LED off");
      // digitalWrite(ledPin, LOW);
    }
  }
  int switchState = digitalRead(switchPin);
  if (switchState == LOW) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
  int value = apds.readProximity();
  if(value > 100){
    if(apds9960Characteristic.value() != 1){
      apds9960Characteristic.writeValue(1);      
    }    
  }else{
    if(apds9960Characteristic.value() != 0){
      apds9960Characteristic.writeValue(0);    
    }
  }
  
}

void closeDoor() {
  // Serial.println("Timer end!");
  myservo.write(0);
}

 

 

最新回复

门开的倒是很溜,前面的这个搭建不知道有没有视频学习下   详情 回复 发表于 2022-10-23 12:01
点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

这个小门控制的还很听话,效果不错 

点评

谢谢  详情 回复 发表于 2022-10-14 09:31
 
 
 

回复

274

帖子

8

TA的资源

纯净的硅(初级)

板凳
 
Jacktang 发表于 2022-10-14 07:54 这个小门控制的还很听话,效果不错 

谢谢

 
 
 

回复

6802

帖子

0

TA的资源

五彩晶圆(高级)

4
 

用Arduino环境开发确实比较快速,资源多

 
 
 

回复

4854

帖子

3

TA的资源

版主

5
 

门开的倒是很溜,前面的这个搭建不知道有没有视频学习下

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表