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]
не выход, а вход
ApTyp, не хочу вас разочаровывать, но ваш код никуда не годиться. Хотя бы из-за наличия delay. Потому что пока идет delay у вас программа глуха и слепа.
пс:http://arduino.ru/forum/proekty/avtomaticheskie-vorota-garazha
Это я уже понял, delay большой тормоз в этом когде тормозит весь процесс кода. За ссылочку спасибо буду смотреть вникать в судь скрипта. Дверь сейчас работают только без лазерной занавески