Программирование автоматического открытия двери
- Войдите на сайт для отправки комментариев
Всем привет. Пытаюсь сделать один проект - автоматически открывающиеся двери, с использованием двух ПИР датчиков движения, двух моторов постоянного тока 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);
}
}
С кнопками или так http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykh...
Или Титановый велосипед для тактовой кнопки.
А вообже код закрытия и открытия двери должен находица в цикле While - смотрите раздел программирование.
Тоесть закрывать пока не замкнется концевой выключатель и для открытия тоже самое.
While(дверь закрыта?){
Пока не закрыта закрываем и проверяем концевой
}
А если застряло чего? Надо по датчику тока ориентироваться как дожим на электрозадвижках.
если застряло шея, то нужно дожимать.
*алё! ТС, кто будет сертифицировать безопасность твоей двери?
если застряло шея, то нужно дожимать.
*алё! ТС, кто будет сертифицировать безопасность твоей двери?
Я немного поясню, проект делается для дипломной работы, соответсвенно собран макет двери (примерно 80 см высотой), так что никто свои шеи всовывать в проем не будет.
Дожим имеется в виду - останов при встрече препятствия (конечного положения двери или чьейто конечности:))
Я немного поясню, проект делается для дипломной работы, соответсвенно собран макет двери (примерно 80 см высотой), так что никто свои шеи всовывать в проем не будет.
дипломная дверь может быть небезопасной?
дипломную дверь нужно разрабатывать самостоятельно для подтверждения своей квалификации или допустимо по тырнетам нисченствовать?
подайте на диплом, сами мы тупые - да?
дипломная дверь может быть небезопасной?
дипломную дверь нужно разрабатывать самостоятельно для подтверждения своей квалификации или допустимо по тырнетам нисченствовать?
подайте на диплом, сами мы тупые - да?
Я никого не прошу написать программу и сделать диплом вместо меня, я лишь просила совета, как мне правильно прописать работу кнопок. Если у Вас, уважаемый Клапауций 232, нету совета, который может мне помочь, тогда попрошу обойтись без ваших замечаний по поводу моих знаний. И да, никто не запрещает, как вы выразились "нищенствовать" в просторах интеренета в поисках совета людей, разбирающихся в программировании.
Я никого не прошу написать программу и сделать диплом вместо меня, я лишь просила совета, как мне правильно прописать работу кнопок. Если у Вас, уважаемый Клапауций 232, нету совета, который может мне помочь, тогда попрошу обойтись без ваших замечаний по поводу моих знаний. И да, никто не запрещает, как вы выразились "нищенствовать" в просторах интеренета в поисках совета людей, разбирающихся в программировании.
откуда, эти сцуко вежливые паразиты на теле человеческого общества берутся?
или заплати за диплом деньги или насоси себе диплом, а если ты бедная и страшная, то учись!
откуда, эти сцуко вежливые паразиты на теле человеческого общества берутся?
или заплати за диплом деньги или насоси себе диплом, а если ты бедная и страшная, то учись!
Слушай ты, прыщь на теле человечества, захлопни свою вонючую варежку. Если твой мозг с размером в горошину, то сиди молча в своем грязном углу и не позорь себя. Не к тебе обращалясь за советом, так что иди своей дорогой и не засерай эту тему своими гнилыми выражениями!
Слушай ты, прыщь на теле человечества, захлопни свою вонючую варежку. Если твой мозг с размером в горошину, то сиди молча в своем грязном углу и не позорь себя. Не к тебе обращалясь за советом, так что иди своей дорогой и не засерай эту тему своими гнилыми выражениями!
вакансия: торговка палёным товаром на рынке - принята. :D
А Вы, какой применяете драйвер моторов
Если Вы написали программу и у Вас есть макет то что Вас не устраивает в работе программы? На Клапауция не обращайте внимания, он вообще добрый, просто часто болеет...
Попробуйте такой код:
#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; } } }Если Вы написали программу и у Вас есть макет то что Вас не устраивает в работе программы? На Клапауция не обращайте внимания, он вообще добрый, просто часто болеет...
скажем так, что программа меня устраивает, только проблема в том, что работает не корректно. И я не имею ничего плохого по отношению к Клапауцию, но пусть он свои грубые замечания оставляет при себе.
Попробуйте такой код:
#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; } } }Спасибо Вам большое за Вашу помощь в программе, обязательно попробую ее применить на своем макете :)