Arduino - автоматическая дверь гаража с сенсорами.
- Войдите на сайт для отправки комментариев
Здравствуйте! В программирования я новичок, только начал вникать в работу самого процесса. Прошу помощи у знатоков как решить данный вопрос.
Начну с начала.
В гараж установил моторизированную дверь, установил датчик лазерного луча, который определяет движение при закрытия двери.
Например, если кто-то заходит через дверь при закрывание, то дверь автоматически переключается в режим открывания, дабы избежать увечья. =)
На концевик двери поставил вакуумную подушку, она нужна в случае закрытии двери если будет стоять машина или другой предмет который не будет попадать под зону лазерного луча, то прикосновения с объектам, дверь сразу останавливается дабы не нанести большого повреждения и не раздавить лишнего, также он служит как датчиком для определения закрытия двери.
С внутренней стороны гаража установлен пуль управления с тремя кнопками ВЕРХ, СТОП, ВНИЗ, на али купил Arduino Mini, RF радио модуль RF-5V с чистотой 433Mhz и ПДУ с тремя клавишами работающий на радио чистоте 433Mhz с тремя кнопками.
Написал небольшую программу для управления двери, сделал чтобы дверь также работала через ПДУ с привязанным кодом пульта.
Для обслуживания двери в случае неисправности под каждое действие написал строку которая отображается в мониторинге, упрощает поиск неисправности если дверь будет глюкать. В мотор двери установлен также термодатчик в случае перегрева мотора, (если дети будут баловаться с дверью) мотор останавливается и возвращается в рабочее состояние когда превышенная температура опустится до нормы.
Так-вот, основную работу двери у меня получилось сделать, вот только в написания правильного кода для лазерного датчика немного вошел в стопор.
Помогите пожалуйста правильно написать код для лазерного датчика (контакт размыкается). При разрыве лазерного луча опускании двери, функция закрывания меняется в положение открытии и дверь переводится в режим открывания и действие работает около 10 секунд (это действие можно остановить кнопкой стоп). Это действие не должно быть активна, когда не наблюдается активность мотора двери или дверь находится в закрытом положении. Можно учесть датчик концевика двери, когда датчик концевика двери активен, то лазерная занавеска при этом не работает. чтобы дверь сама не стала открываться если кто-то подойдет близко к двери.
Извиняюсь если не понятно что-то написал. Не так силен еще в написании кодов и всяких изюминок. Логические карты написать могу, а вот перевести в программный язык пока что набор знаний программирования еще маловат.
#include <RemoteReceiver.h>
// На второй пин ардуино подключается контакт с радио модуля
int pinrelayup = 11; //Реле на поднятия ворот пин 11
int pinrelaydown = 10; //Реле на опускания ворот пин 10
//int pinrelaydownStatus = LOW; //Первоначальный статус реле опускания двери
int pinpirzona = 5; //ПИР датчик занавесок дверей на 5 ноге ардуино
//int pinpirzonaStatus = LOW; //Первоначальный статус датчика занавесок выключен
int pinvacum = 8; //Датчик вакуума двери сидит на 8 ноге, всегда активен когда дверь поднята
int pinzasov = 4; //Засов дверей, активен когда засов открыт
int knopkaUP = 9; //Механическая кнопка поднятия двери на пине 9
int knopkadown = 3; //Механическая кнопка опускания двери на пине 3
int knopkastop = 6; //Механическая кнопка стопа двери на пине 6
int pinHot = 7; //Датчик определяет высокую температуру двигателя ворот
void setup() {
Serial.begin(9600);
RemoteReceiver::init(0, 3, showCode); //Загрузка радио модуля в активное состояния
pinMode(pinrelayup, OUTPUT); //Загрузка вывода реле вверх
pinMode(pinrelaydown, OUTPUT); //Загрузка вывода реле вниз
pinMode(pinpirzona, INPUT); //Загрузка занавесок настраиваем как "выход"
pinMode(pinvacum, INPUT); //Загрузка вакуумного датчика настраиваем как "выход"
pinMode(pinzasov, INPUT); //Загрузка засова настраиваем как "выход"
pinMode(knopkaUP, INPUT); //Загрузка кнопки поднятия двери настраиваем как "выход"
pinMode(knopkadown, INPUT); //Загрузка кнопки опускания двери настраиваем как "выход"
pinMode(knopkastop, INPUT); //Загрузка кнопки стоп настраиваем как "выход"
pinMode(pinHot, INPUT); //Перегрев двигателя
digitalWrite(pinrelayup, HIGH); //Загрузка реле поднятия двери в выключенное состояние
digitalWrite(pinrelaydown, HIGH); //Загрузка реле опускания двери в выключенное состояние
}
//********************************************************** Тут код для пульта управления **********************************************************
void showCode(unsigned long receivedCode, unsigned int period) {
Serial.print("Signal from remote: "); //для отладки Эта функция является для поиска кода нажатие кнопки с пульта на чистоте 433MHZ
//Serial.print(receivedCode); //для отладки Эта функция является для поиска кода нажатие кнопки с пульта на чистоте 433MHZ
//Serial.println(""); //для отладки Эта функция является для поиска кода нажатие кнопки с пульта на чистоте 433MHZ
//***************************** КНОПКА ПОДНЯТИЯ ДВЕРЕЙ *****************************
if (receivedCode == 459216) //Поступает сигнал с ПДУ с кодом 531387 REM1
{
Serial.println(receivedCode);
Serial.println("REM 1 BUTTON UP");
digitalWrite(pinrelayup, LOW); //Реле на поднятия ворот пин 11 включить
digitalWrite(pinrelaydown, HIGH); //Реле на опускания ворот пин 10 выключить
}
//***********************************************************************************
//***************************** КНОПКА ОПУСКАНИЯ ДВЕРЕЙ ****************************
if (receivedCode == 459192) //Поступает сигнал с ПДУ с кодом 531363 REM1
{
Serial.println(receivedCode);
Serial.println("REM 1 BUTTON DOWN");
digitalWrite(pinrelayup, HIGH); //Реле на поднятия ворот пин 11 выключить
digitalWrite(pinrelaydown, LOW); //Реле на опускания ворот пин 10 включить
}
//***********************************************************************************
//***************************** КНОПКА СТОП ДВЕРЕЙ **********************************
if (receivedCode == 459198) //Поступает сигнал с ПДУ с кодом 531369 REM1
{
Serial.println(receivedCode);
Serial.println("REM 1 BUTTON STOP");
digitalWrite(pinrelayup, HIGH); //Реле на поднятия ворот пин 11 выключить
digitalWrite(pinrelaydown, HIGH); //Реле на опускания ворот пин 10 выключить
}
//***********************************************************************************
//********************************************************** КОД ДЛЯ ПУ ЗАКОНЧЕН **********************************************************
}
void loop() {
//***************************** КОД ПЕРЕГРЕВА МОТОРА **********************************
if(digitalRead(pinHot)== HIGH) //Сигнал с датчика перегрева мотора, активен когда в нормальном режиме, разрывает цепь при перегрева мотораю.
{
Serial.println("DOOR MOTOR OVERLOAD!!!! WAIT 15MIN"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, HIGH); //Выключаем реле поднятия дверей
digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей
}
//***********************************************************************************
//***************************** КОД КНОПОКИ ВЕРХ ***********************************
if(digitalRead(knopkaUP)== LOW) //Когда на ногу кнопки поднятия двери поступает сигнал через 10 килоомный резистор
{
Serial.println("Signal from button panel, button UP"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, LOW); //Включаем реле поднятия дверей
digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей
delay(50); //Ждём 20 секунд и отключаем все реле
}
//***********************************************************************************
//***************************** КОД КНОПОКИ ВНИЗ ***********************************
if(digitalRead(knopkadown)== LOW) //Когда на ногу кнопки поднятия двери поступает сигнал.
{
Serial.println("Signal from button panel, button DOWN"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, HIGH); //Выключаем реле поднятия дверей
digitalWrite(pinrelaydown, LOW); //Включаем реле опускания дверей
delay(50); //Ждём 0,5 секунд и отключаем все реле
}
//***********************************************************************************
//***************************** КОД КНОПОКИ СТОП ***********************************
if(digitalRead(knopkastop)== LOW) //Когда на ногу кнопки поднятия двери поступает сигнал.
{
Serial.println("Signal from button panel, button STOP"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, HIGH); //Выключаем реле поднятия дверей
digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей
delay(50); //Ждём 0,5 секунд и отключаем все реле
}
//***********************************************************************************
//***************************** КОД КНОПОКИ ВЫКУМНОГО ДАТЧИКА ***********************************
if(digitalRead(pinvacum)== LOW) //Сигнал поступает от вакумного датчика торца двери.
{
Serial.println("Signal from vacum limit"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, HIGH); //Выключаем реле поднятия дверей
digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей
delay(50); //Ждём 0,5 секунд и отключаем все реле
}
//***********************************************************************************
//***************************** КОД ПИР ЗАНАВЕСКИ **********************************
if(digitalRead(pinpirzona)== LOW) //Сигнал поступает от вакуумного датчика торца двери.
{
Serial.println("Signal from PIR"); //Пишем в сериал откуда пришел сигнал
digitalWrite(pinrelayup, LOW); //Выключаем реле поднятия дверей
digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей
delay(10000); //Ждём 10 секунд и отключаем все реле
digitalWrite(pinrelayup, HIGH);
digitalWrite(pinrelayup, HIGH)
}
//***********************************************************************************
}
[quote=ApTyp]
не выход, а вход
//***************************** КОД ПИР ЗАНОВЕСКИ ********************************** if(digitalRead(pinpirzona)== LOW) //Сигнал поступает от вакумного датчика торца двери. { Serial.println("Signal from PIR"); //Пишем в сериал откуда пришел сигнал digitalWrite(pinrelayup, LOW); //Выключаем реле поднятия дверей digitalWrite(pinrelaydown, HIGH); //Выключаем реле опускания дверей delay(10000); //Ждём 10 секунд и отключаем все реле digitalWrite(pinrelayup, HIGH); } //***********************************************************************************ApTyp, не хочу вас разочаровывать, но ваш код никуда не годиться. Хотя бы из-за наличия delay. Потому что пока идет delay у вас программа глуха и слепа.
пс:http://arduino.ru/forum/proekty/avtomaticheskie-vorota-garazha
Это я уже понял, delay большой тормоз в этом когде тормозит весь процесс кода. За ссылочку спасибо буду смотреть вникать в судь скрипта. Дверь сейчас работают только без лазерной занавески