开启左侧

智能门禁系统——陈章华、张梅娟

[复制链接]
发表于 2017-8-24 00:46:58 | 显示全部楼层 |阅读模式
制作人:张梅娟、陈章华
创意来源:生活中我们经常看见在小区、商场、医院等地方都会有门禁,小区或人进出小区的时候大多都是通过保安来开门、关门,这样增加了人工劳动力,因此我们就想解放人类,减少劳动成本,制作出了智能门禁系统。
作品简介:智能门禁系统由两块arduino的Uno主板,两块寻迹模块、四个电机、一个超声波、一个舵机、电池、若干电线组成。一块主板、四个电机、两块寻迹模块、电池、若干电线组成寻迹 小车,另外一块主板通过超声波测距控制舵机转动来达到开门关门的功能。


作品代码:
门禁模块:
#include <Servo.h>  // 舵机库
const int TrigPin = 3; //超声波触发引脚连接UNO引脚3
const int EchoPin = 2;    //超声波接受引脚连接UNO引脚2
const int distMin = 10;    //定义响应的范围下限
const int distMax = 30;    //定义响应的范围上限
Servo servoLeft;  //定义舵机库对象 servoLeft
const int servoLeftPin = A3;  //左侧舵机连接UNO引脚A3
int distance;  //全局变量,保存当前超声波返回的距离
void getDistance() {  // ❼
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  distance = pulseIn(EchoPin, HIGH) / 58.0;
  //delay(200);
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  servoLeft.attach(servoLeftPin);


  servoLeft.write(20);  // ❶舵机初始状态为90度,向下
  delay(100);
}


void loop() {
  // put your main code here, to run repeatedly:
  getDistance();  //获取当前超声波返回的距离值
  Serial.println(distance);
  if (distance <= 15) {
    servoLeft.write(90);
    delay(1000);
    servoLeft.write(0);
  }
}





寻迹小车模块:
#include <IRremote.h>
#include <Voice.h>
const byte inPin1 = 4; //L298N in1 引脚
const byte inPin2 = 3; //L298N in2 引脚
const byte inPin3 = 7; //L298N in3 引脚
const byte inPin4 = 8; //L298N in4 引脚
const byte enA_Pin = 5; //L298N ENA 引脚
const byte enB_Pin = 6; //L298N ENB 引脚

const int trackLeft = 11;  //左侧循迹模块D0连接引脚10
const int trackRight = 10;  //右侧循迹模块D0连接引脚9
const int distMin = 10;    //定义响应的范围下限
const int distMax = 30;    //定义响应的范围上限

const byte Rst = A3; //6;
const byte Data = A2; //7; 片选
const byte Busy = A1; //8; 语音

const int trigPin = 12;   //超声波trigle引脚
const int echoPin = 13;   //超声波echo引脚
Voice voice(A3, A2, A1);
int adjustTime = 10;
int intSpeed = 80;
int angle = 90;
int motorSpeed = 150;
int dist = 0;
int swingFlag = 0; // 0 stop;  1 swing
int servoStep = 5;

int speedPWM = 110;    //小车的起始速度
int speedStep = 15;    //小车的速度调整幅度
int minSpeedPwm = 80; //小车的最慢速度
int maxSpeedPwm = 150; //小车的最快速度
int currentStatus = 1; //小车当前的状态,0  运动  1 停止
int trailingFlag = 1;    //寻迹 0 关闭  1 打开
int preDist = 0;  //用于保存先前的距离状态,用于判断是靠近还是远离
int nearOrLeft = 0;  //状态变量:0-靠近  1-远离

void setup() {
  // put your setup code here, to run once:
  pinMode(inPin1, OUTPUT);
  pinMode(inPin2, OUTPUT);
  pinMode(inPin3, OUTPUT);
  pinMode(inPin4, OUTPUT);
  pinMode(Rst, OUTPUT);
  pinMode(Data, OUTPUT);
  pinMode(Busy, INPUT);

  //初始化超声波传感器
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  trailingDrive();

}

void forward()
{
  digitalWrite(inPin1, HIGH);    // 左轮前进
  digitalWrite(inPin2, LOW);
  digitalWrite(inPin3, HIGH);    // 右轮前进
  digitalWrite(inPin4, LOW);
}
void turnLeft()
{
  digitalWrite(inPin1, HIGH);    // 左轮前进
  digitalWrite(inPin2, LOW);
  digitalWrite(inPin3, LOW);    // 右轮后退
  digitalWrite(inPin4, HIGH);
}
void pause()
{
  digitalWrite(inPin1, LOW);   //左轮停止
  digitalWrite(inPin2, LOW);
  digitalWrite(inPin3, LOW);   //右轮停止
  digitalWrite(inPin4, LOW);
}
void turnRight()
{
  digitalWrite(inPin1, LOW);    // 左轮前进
  digitalWrite(inPin2, HIGH);
  digitalWrite(inPin3, HIGH);    // 右轮前进
  digitalWrite(inPin4, LOW);
}
void trailingDrive() {
  int intTrackLeft = digitalRead(trackLeft); //读取左侧引脚值
  int intTrackRight = digitalRead(trackRight); //读取右侧引脚值

  analogWrite(enA_Pin, speedPWM); //设定左侧马达的速度
  analogWrite(enB_Pin, speedPWM); //设定右侧马达的速度

  if ((intTrackLeft == 0) && intTrackRight == 0) {  //❶正常
    forward();  //如果
  } else if  ((intTrackLeft == 1) && intTrackRight == 0) { //右偏
    while (digitalRead(trackLeft)) {  //❷
      turnLeft();
      delay(adjustTime);
    }
  } else if ((intTrackLeft == 0) && intTrackRight == 1) { //左偏
    while (digitalRead(trackRight)) {
      turnRight();
      delay(adjustTime);
    }
  } else if  ((intTrackLeft == 1) && intTrackRight == 1) { //双偏
    pause();
  }

}

  void getDistance()     //分别返回左右超声波传感器的距离 当no=0 左侧  n=1 右侧
  {
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    dist = pulseIn(echoPin, HIGH) / 58.0;
  }


QQ图片20170823233251.jpg
QQ图片20170823233222.jpg
QQ图片20170823233243.jpg

门禁系统视频.mp4

26.09 MB, 下载次数: 0

zuopin.ino

1.16 KB, 下载次数: 0

xunji.ino

3.51 KB, 下载次数: 0

回复

使用道具 举报

发表于 2017-8-27 14:02:03 | 显示全部楼层
可以试试用RFID卡的门禁
回复 支持 反对

使用道具 举报

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

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )