Arduino - автоматическая дверь гаража с сенсорами.

ApTyp
Offline
Зарегистрирован: 16.06.2017

Здравствуйте! В программирования я новичок, только начал вникать в работу самого процесса. Прошу помощи у знатоков как решить данный вопрос.

Начну с начала.

В гараж установил моторизированную дверь, установил датчик лазерного луча, который определяет движение при закрытия двери.

Например, если кто-то заходит через дверь при закрывание, то дверь автоматически переключается в режим открывания, дабы избежать увечья. =)

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

С внутренней стороны гаража установлен пуль управления с тремя кнопками ВЕРХ, СТОП, ВНИЗ, на али купил 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)
   }
//***********************************************************************************

}

 

ApTyp
Offline
Зарегистрирован: 16.06.2017

[quote=ApTyp]

 

pinMode(pinpirzona, INPUT);           //Загрузка занавесок настраиваем как "выход"
pinMode(pinvacum, INPUT);             //Загрузка вакуумного датчика настраиваем как "выход"
pinMode(pinzasov, INPUT);             //Загрузка засова настраиваем как "выход"
pinMode(knopkaUP, INPUT);             //Загрузка кнопки поднятия двери настраиваем как "выход"
pinMode(knopkadown, INPUT);           //Загрузка кнопки опускания двери настраиваем как "выход"
pinMode(knopkastop, INPUT);           //Загрузка кнопки стоп настраиваем как "выход"

не выход, а вход

ApTyp
Offline
Зарегистрирован: 16.06.2017
Сейчас застопарился в написание этой части кода

 

//***************************** КОД ПИР ЗАНОВЕСКИ  **********************************
if(digitalRead(pinpirzona)== LOW)                                                //Сигнал поступает от вакумного датчика торца двери.
  {
    Serial.println("Signal from PIR");                                           //Пишем в сериал откуда пришел сигнал
    digitalWrite(pinrelayup, LOW);                                               //Выключаем реле поднятия дверей
    digitalWrite(pinrelaydown, HIGH);                                            //Выключаем реле опускания дверей
    delay(10000);                                                                //Ждём 10 секунд и отключаем все реле
    digitalWrite(pinrelayup, HIGH);
   }
//***********************************************************************************
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ApTyp, не хочу вас разочаровывать, но ваш код никуда не годиться. Хотя бы из-за наличия delay. Потому что пока идет delay у вас программа глуха и слепа.

пс:http://arduino.ru/forum/proekty/avtomaticheskie-vorota-garazha

ApTyp
Offline
Зарегистрирован: 16.06.2017

Это я уже понял, delay большой тормоз в этом когде тормозит весь процесс кода. За ссылочку спасибо буду смотреть вникать в судь скрипта. Дверь сейчас работают только без лазерной занавески