Программирование автоматического открытия двери

Margosha
Offline
Зарегистрирован: 13.06.2016

Всем привет. Пытаюсь сделать один проект - автоматически открывающиеся двери, с использованием двух ПИР датчиков движения, двух моторов постоянного тока 12 вольт и двух тактовых кнопок. Оба мотора подключены к Arduino через два двухканальных реле, один мотор стоит на открытие/закрытие замка защелки, воторой мотор стоит на открытие/закрытия самой двери. Датчики движения стоят по обе стороны двери. Принцип работы такого проекта заключается в том, что: когда срабатывает один из датчиков движения, сигнал поступает в ардуино, а уже оттуда вначале на замок открытия, потом на мотор открытия самой двери. Когда дверь полностью открывается (достигает точки 90 градусов), она упирается в кнопку, которая должна отключить мотор, чтобы тот не толкал дверь дальше. С момента, когда дверь коснулась кнопки, должно пройти 15 секунд, после чего дверь должна начать закрываться.

Когда дверь доходит до конечной точки закрытия, она касается второй установленной кнопки и мотор выключается. По срабатыванию второй кнопки, на ардуино приходит сигнал 0, и система обновляется, чтобы потом вновь начать цикл с самого начала, когда датчики движения снова уловят присудствие человека.

Проблема заключается в написании кода для управления такой системой. Я не особо сильна в программировании, поэтому хотелось бы получит совета. Программу управления датчиками и моторами, я более менее написала (но там могут быть ошибки), а вот правильно вписать в программу кнопки уже не знаю как. По логике, пока кнопки не были нажаты, на них должен быть сигнал равный 1, а когда нажаты, должен быть 0.

Может кто-нибудь сможет помочь с этим делом?


int pirsensor1 = 13; // датчик движения 1
int pirsensor2 = 12 ; // датчик движения 2
int motor1A = 7; // Первый мотор - замок
int motor1B = 8;  
int motor2A = 4; //Второй мотор - на двери
int motor2B = 2; 
int button1 = 15; // кнопка 1
int button2 = 16; // кнопка 2
int value = 0; //переменная для хранения состояния датчика

void setup () 
{
  Serial.begin (9600);
  pinMode (pirsensor1,INPUT);
  pinMode (pirsensor2,INPUT);
  pinMode (motor1А, OUTPUT);
  pinMode (motor1В, OUTPUT);
  pinMode (motor2А, OUTPUT);
  pinMode (motor2В, OUTPUT);
  pinMode (button1, INPUT);
  pinMode (button2, INPUT);
}

void loop() 
{
  int val1=digitalRead(pirsensor1);
  int val2=digitalRead(pirsensor2);
  if (val1==HIGH) // когда датчик уловил появление человека
    {
digitalWrite(motor1А, HIGH); // включение первого мотора замка
delay(1000);// ждем одну секунду
digitalWrite(motor1В,LOW);// мотор останавливается
digitalWrite(motor2А, HIGH);// включение второго мотора двери
delay(5000); // ждем 5 секунд
digitalWrite(motor2В, LOW);// мотор останавлиается
delay(15000); //ждем 15 секунд, после чего дверь начинает закрываться.
// перед задержкой в 15 секунд надо вписать код работы кнопки
 digitalWrite(motor2В,HIGH); // включение второго мотора в обратную сторону
 delay(5000); // ждем 5 секунд
 digitalWrite(motor2А, LOW);  // мотор останавливается
 digitalWrite(motor1В, HIGH); // первый мотор замка включается
 delay(1000); //ждем 1 секунду
 digitalWrite(motor1А, LOW); // мотор останавливается
 delay(15000); // дверь закрылась
// код второй кнопки
}
if (val2==HIGH) // второй датчик движения уловил присудствие человека
    {
digitalWrite(motor1А, HIGH); 
delay(1000);
digitalWrite(motor1В,LOW);
digitalWrite(motor2А, HIGH);
delay(5000);
digitalWrite(motor2В, LOW);
delay(15000);

 digitalWrite(motor2В,HIGH);
 delay(5000);
 digitalWrite(motor2А, LOW); 
 digitalWrite(motor1В, HIGH);
 delay(1000); 
 digitalWrite(motor1А, LOW); 
 delay(15000);
}
}

 

 

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

С кнопками или так http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykh...
Или Титановый велосипед для тактовой кнопки.
А вообже код закрытия и открытия двери должен находица в цикле While - смотрите раздел программирование.
Тоесть закрывать пока не замкнется концевой выключатель и для открытия тоже самое.

While(дверь закрыта?){
Пока не закрыта закрываем и проверяем концевой
}

А если застряло чего? Надо по датчику тока ориентироваться как дожим на электрозадвижках.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

yul-i-an пишет:
А если застряло чего?

если застряло шея, то нужно дожимать.

*алё! ТС, кто будет сертифицировать безопасность твоей двери?

Margosha
Offline
Зарегистрирован: 13.06.2016

Клапауций 232 пишет:

yul-i-an пишет:
А если застряло чего?

если застряло шея, то нужно дожимать.

*алё! ТС, кто будет сертифицировать безопасность твоей двери?

Я немного поясню, проект делается для дипломной работы, соответсвенно собран макет двери (примерно 80 см высотой), так что никто свои шеи всовывать в проем не будет.

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Дожим имеется в виду - останов при встрече препятствия (конечного положения двери или чьейто конечности:))

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Margosha пишет:

Я немного поясню, проект делается для дипломной работы, соответсвенно собран макет двери (примерно 80 см высотой), так что никто свои шеи всовывать в проем не будет.

дипломная дверь может быть небезопасной?

дипломную дверь нужно разрабатывать самостоятельно для подтверждения своей квалификации или допустимо по тырнетам нисченствовать?

подайте на диплом, сами мы тупые - да?

Margosha
Offline
Зарегистрирован: 13.06.2016

Клапауций 232 пишет:

дипломная дверь может быть небезопасной?

дипломную дверь нужно разрабатывать самостоятельно для подтверждения своей квалификации или допустимо по тырнетам нисченствовать?

подайте на диплом, сами мы тупые - да?

Я никого не прошу написать программу и сделать диплом вместо меня, я лишь просила совета, как мне правильно прописать работу кнопок. Если у Вас, уважаемый Клапауций 232, нету совета, который может мне помочь, тогда попрошу обойтись без ваших замечаний по поводу моих знаний. И да, никто не запрещает, как вы выразились "нищенствовать" в просторах интеренета в поисках совета людей, разбирающихся в программировании.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Margosha пишет:

Я никого не прошу написать программу и сделать диплом вместо меня, я лишь просила совета, как мне правильно прописать работу кнопок. Если у Вас, уважаемый Клапауций 232, нету совета, который может мне помочь, тогда попрошу обойтись без ваших замечаний по поводу моих знаний. И да, никто не запрещает, как вы выразились "нищенствовать" в просторах интеренета в поисках совета людей, разбирающихся в программировании.

откуда, эти сцуко вежливые паразиты на теле человеческого общества берутся?

или заплати за диплом деньги или насоси себе диплом, а если ты бедная и страшная, то учись!

Margosha
Offline
Зарегистрирован: 13.06.2016

Клапауций 232 пишет:

 

откуда, эти сцуко вежливые паразиты на теле человеческого общества берутся?

или заплати за диплом деньги или насоси себе диплом, а если ты бедная и страшная, то учись!

Слушай ты, прыщь на теле человечества, захлопни свою вонючую варежку. Если твой мозг с размером в горошину, то сиди молча в своем грязном углу и не позорь себя. Не к тебе обращалясь за советом, так что иди своей дорогой и не засерай эту тему своими гнилыми выражениями!

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Margosha пишет:

Слушай ты, прыщь на теле человечества, захлопни свою вонючую варежку. Если твой мозг с размером в горошину, то сиди молча в своем грязном углу и не позорь себя. Не к тебе обращалясь за советом, так что иди своей дорогой и не засерай эту тему своими гнилыми выражениями!

вакансия: торговка палёным товаром на рынке - принята. :D

strarbit
Offline
Зарегистрирован: 12.06.2016

А Вы, какой применяете драйвер моторов

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Если Вы написали программу и у Вас есть макет то что Вас не устраивает в работе программы? На Клапауция не обращайте внимания, он вообще добрый, просто часто болеет...

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте такой код:


#define pirsensor1  10 // датчик движения 1
#define pirsensor2  11 // датчик движения 2
#define motor1a  7 // Первый мотор - замок
#define motor1b  8
#define motor2a  4 //Второй мотор - на двери
#define motor2b  2
#define button1  5 // кнопка 1
#define button2  6 // кнопка 2
int value = 0; //переменная для хранения состояния датчика
int f_motor = 0;
unsigned long prevMilis = 0;

void setup ()
{
  //Serial.begin (9600);
  pinMode(pirsensor1, INPUT);
  pinMode(pirsensor2, INPUT);
  pinMode(motor1a, OUTPUT);
  pinMode(motor1b, OUTPUT);
  pinMode(motor2a, OUTPUT);
  pinMode(motor2b, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
}

void loop()
{
  int val1 = digitalRead(pirsensor1);
  int val2 = digitalRead(pirsensor2);
  if (val1 == HIGH || val2 == HIGH) value = 1; // датчик уловил появление человека

  if (value == 1)
  {
    switch (f_motor) {
      case 0:
        digitalWrite(motor1a, HIGH); // включение первого мотора замка
        prevMilis = millis();//Засекаем время
        f_motor++;
        break;

      case 1:
        if (millis() - prevMilis >= 1000)//Проверяем - прошла ли секунда
        {
          digitalWrite(motor1a, LOW); // мотор останавливается
          digitalWrite(motor2a, HIGH);// включение второго мотора двери
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 2:
        if (digitalRead(button1) == LOW || millis() - prevMilis >= 5000)//Проверяем - нажатие кнопки или прошло время (Можно оставить только кнопу)
        {
          digitalWrite(motor2a, LOW);// мотор останавлиается
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 3:
        if (millis() - prevMilis >= 15000) {
          digitalWrite(motor2b, HIGH); // включение второго мотора в обратную сторону
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 4:
        if (digitalRead(button2) == LOW || millis() - prevMilis >= 5000)//Проверяем - нажатие кнопки или прошло время (Можно оставить только кнопу)
        {
          digitalWrite(motor2b, LOW);  // мотор останавливается
          digitalWrite(motor1b, HIGH); // первый мотор замка включается
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 5:
        if (millis() - prevMilis >= 1000) 
         {
	  value = 0;
          digitalWrite(motor1b, LOW); // мотор останавливается
          f_motor = 0;
         }
        break;
    }

  }
}

 

Margosha
Offline
Зарегистрирован: 13.06.2016

Mr.Privet пишет:

Если Вы написали программу и у Вас есть макет то что Вас не устраивает в работе программы? На Клапауция не обращайте внимания, он вообще добрый, просто часто болеет...

скажем так, что программа меня устраивает, только проблема в том, что работает не корректно. И я не имею ничего плохого по отношению к Клапауцию, но пусть он свои грубые замечания оставляет при себе.

Margosha
Offline
Зарегистрирован: 13.06.2016

vosara пишет:

Попробуйте такой код:


#define pirsensor1  10 // датчик движения 1
#define pirsensor2  11 // датчик движения 2
#define motor1a  7 // Первый мотор - замок
#define motor1b  8
#define motor2a  4 //Второй мотор - на двери
#define motor2b  2
#define button1  5 // кнопка 1
#define button2  6 // кнопка 2
int value = 0; //переменная для хранения состояния датчика
int f_motor = 0;
unsigned long prevMilis = 0;

void setup ()
{
  //Serial.begin (9600);
  pinMode(pirsensor1, INPUT);
  pinMode(pirsensor2, INPUT);
  pinMode(motor1a, OUTPUT);
  pinMode(motor1b, OUTPUT);
  pinMode(motor2a, OUTPUT);
  pinMode(motor2b, OUTPUT);
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
}

void loop()
{
  int val1 = digitalRead(pirsensor1);
  int val2 = digitalRead(pirsensor2);
  if (val1 == HIGH || val2 == HIGH) value = 1; // датчик уловил появление человека

  if (value == 1)
  {
    switch (f_motor) {
      case 0:
        digitalWrite(motor1a, HIGH); // включение первого мотора замка
        prevMilis = millis();//Засекаем время
        f_motor++;
        break;

      case 1:
        if (millis() - prevMilis >= 1000)//Проверяем - прошла ли секунда
        {
          digitalWrite(motor1a, LOW); // мотор останавливается
          digitalWrite(motor2a, HIGH);// включение второго мотора двери
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 2:
        if (digitalRead(button1) == LOW || millis() - prevMilis >= 5000)//Проверяем - нажатие кнопки или прошло время (Можно оставить только кнопу)
        {
          digitalWrite(motor2a, LOW);// мотор останавлиается
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 3:
        if (millis() - prevMilis >= 15000) {
          digitalWrite(motor2b, HIGH); // включение второго мотора в обратную сторону
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 4:
        if (digitalRead(button2) == LOW || millis() - prevMilis >= 5000)//Проверяем - нажатие кнопки или прошло время (Можно оставить только кнопу)
        {
          digitalWrite(motor2b, LOW);  // мотор останавливается
          digitalWrite(motor1b, HIGH); // первый мотор замка включается
          prevMilis = millis();
          f_motor++;
        }
        break;

      case 5:
        if (millis() - prevMilis >= 1000) 
         {
	  value = 0;
          digitalWrite(motor1b, LOW); // мотор останавливается
          f_motor = 0;
         }
        break;
    }

  }
}

 

Спасибо Вам большое за Вашу помощь в программе, обязательно попробую ее применить на своем макете :)