Управление ролл воротами

Тема в разделе "Глядите, что я сделал", создана пользователем imMan, 19 янв 2016.

  1. imMan

    imMan Нерд

    В связи с тем, что я обзавелся автоматическими ролл воротами DoorHan с электрическим приводом RollHan
    решил сделать управление с пульта. При покупке ворот оригинальный блок управления не брал специально в целях экономии, цена стартует от 3000р.
    В наличии были:
    arduino nano - 150р
    Обучаемое двухканальное реле 433Mhz Ebay - 400р
    Relay shield с обратной логикой Ebay - 140р
    Пульт для реле Ebay - 180р

    Итого 870р

    Обучаемое реле выполняет роль кнопок, его наверное можно заменить модулем 433Mhz для Arduino, у меня его нет, как придет попробую тогда все еще станет дешевле

    логика работы простая нажали кнопку открытия на пульте, реле открытия включается на заданный промежуток времени( у меня это 30 сек), если повторно нажать кнопку открытия реле отключится не дожидаясь 30 сек. (Спасибо Sindbad).
    Код (C++):
    #include <Bounce.h>

    #define led 13          //Индикатор работы
    #define btnOpen 2       //Кнопка открытия
    #define btnClose 3      //Кнопка закрытия
    #define RelayOpen 10    //Реле открытия
    #define RelayClose 11   //Реле закрытия
    #define OpenTimer 30000 //Время открытия или закрытия

    Bounce bouncer_btnOpen = Bounce(btnOpen,5);  
    Bounce bouncer_btnClose = Bounce(btnClose,5);

    void setup()
    {
      pinMode(led, OUTPUT);
      pinMode(RelayOpen, OUTPUT);
      pinMode(RelayClose, OUTPUT);
      digitalWrite(RelayOpen,HIGH);
      digitalWrite(RelayClose,HIGH);
    }

    void loop()
    {
        if ( bouncer_btnOpen.update() )
          {
              if ( bouncer_btnOpen.read() == HIGH)
                {            
                        digitalWrite(RelayOpen,LOW);
                        unsigned long timer = millis();
                        unsigned long led_timer = millis();
                        while (millis()-timer < OpenTimer)
                        {              
                          if(millis()-led_timer >= 1000)
                              {
                                digitalWrite(led,!digitalRead(led));
                                led_timer = millis();
                              }                                            
                         if ( bouncer_btnOpen.update() )
                          {
                            if ( bouncer_btnOpen.read() == HIGH)
                              {  
                                    break;
                                    digitalWrite(led,LOW);
                              }
                          }  
                        }
                        digitalWrite(RelayOpen ,HIGH);
                        digitalWrite(led,LOW);            
              }
        }



       if ( bouncer_btnClose.update() )
          {
              if ( bouncer_btnClose.read() == HIGH)
                {            
                        digitalWrite(RelayClose,LOW);
                        unsigned long timer = millis();
                        unsigned long led_timer = millis();
                        while (millis()-timer < OpenTimer)
                        {              
                          if(millis()-led_timer >= 1000)
                              {
                                digitalWrite(led,!digitalRead(led));
                                led_timer = millis();
                              }                                            
                         if ( bouncer_btnClose.update() )
                          {
                            if ( bouncer_btnClose.read() == HIGH)
                              {  
                                    break;
                                    digitalWrite(led,LOW);
                              }
                          }  
                        }
                        digitalWrite(RelayClose ,HIGH);
                        digitalWrite(led,LOW);            
              }
        }                  
    }
    пока все работает на столе, как придет макетная плата спаяю в бой.
    так все сейчас выглядит [​IMG]
    как приедет GSM модуль реализую открытие по смс.
    можете кидать камнями,
    сразу скажу, что я не программист
     
    Марк2005, Mestniy и ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    А что кидать, работает - знаит все отлично.
    А зачем управление воротами по СМС?
     
  3. imMan

    imMan Нерд

    бывает ситуация меня нет дома, а например другу надо прицеп забрать или просто пульт забыл-потерял
     
  4. Mestniy

    Mestniy Гуру

    То есть вы хотите номера всех своих друзей вбить? А если она будет работать с любым номером, то любой кто знает номер sim на GSM может ворота открыть! Или я чего-то не понимаю? Как такая ситуация?
     
  5. Mestniy

    Mestniy Гуру

    А в целом проект - очень хорош! Просто молодец!!!
     
  6. imMan

    imMan Нерд

    Зачем всех друзей))) только свой, друг подъехал позвонил, я открыл-закрыл
     
  7. Mestniy

    Mestniy Гуру

    Все отстал. Неправильно понял. Простите!:oops::oops::oops::oops:
     
  8. ИгорьК

    ИгорьК Гуру

  9. imMan

    imMan Нерд

  10. imMan

    imMan Нерд

    Сделал еще управление одной кнопкой, вдруг новичкам как мне пригодится)
    Код (C++):
    #include <Bounce.h>
    #include <EEPROM.h>

    #define led 13          //Индикатор работы
    #define btn 2       //Кнопка открытия / закрытия
    #define RelayOpen 10    //Реле открытия
    #define RelayClose 11   //Реле закрытия
    #define OpenTimer 30000 //Время открытия или закрытия

    Bounce bouncer_btn = Bounce(btn,5);
    int eeprom_address = 0;

    void setup()
    {
      pinMode(led, OUTPUT);
      pinMode(RelayOpen, OUTPUT);
      pinMode(RelayClose, OUTPUT);
      digitalWrite(RelayOpen,HIGH);
      digitalWrite(RelayClose,HIGH);
    }

    void loop()
    {
        if ( bouncer_btn.update() )
          {
              if ( bouncer_btn.read() == HIGH)
                {        
                      int eeprom_val;
                      eeprom_val = EEPROM.read(eeprom_address);                
                      if(eeprom_val == 0) // Закрыто
                       {
                          digitalWrite(RelayOpen,LOW);
                          EEPROM.update(eeprom_address, !eeprom_val);
                          unsigned long timer = millis();
                          unsigned long led_timer = millis();
                     
                          while (millis()-timer < OpenTimer)
                          {            
                            if(millis()-led_timer >= 1000)
                                {
                                  digitalWrite(led,!digitalRead(led));
                                  led_timer = millis();
                                }                                          
                           if ( bouncer_btn.update() )
                            {
                              if ( bouncer_btn.read() == HIGH)
                                {
                                      break;
                                      digitalWrite(led,LOW);
                                }
                            }
                          }
                          digitalWrite(RelayOpen ,HIGH);
                          digitalWrite(led,LOW);
                     
                       }

                   
                      if(eeprom_val == 1) // Открыто
                       {
                          digitalWrite(RelayClose,LOW);
                          EEPROM.update(eeprom_address, !eeprom_val);
                          unsigned long timer = millis();
                          unsigned long led_timer = millis();

                          while (millis()-timer < OpenTimer)
                          {            
                            if(millis()-led_timer >= 1000)
                                {
                                  digitalWrite(led,!digitalRead(led));
                                  led_timer = millis();
                                }                                          
                           if ( bouncer_btn.update() )
                            {
                              if ( bouncer_btn.read() == HIGH)
                                {
                                      break;
                                      digitalWrite(led,LOW);
                                }
                            }
                          }
                          digitalWrite(RelayClose ,HIGH);
                          digitalWrite(led,LOW);
                     
                       }          
              }
        }
    }
     
    Последнее редактирование: 25 янв 2016
  11. Begemot

    Begemot Нерд

    ИМХО, управление приводом ворот по временному интервалу - не есть гуд... Купите недорогие концевики на крайние положения (открыто/закрыто), добавьте в схему и измените код - будет правильнее..
     
    Tomasina нравится это.
  12. imMan

    imMan Нерд

  13. kovian

    kovian Нуб

    Вполне с вами согласен не всегда ворота открываются -закрываются за одно и то-же время погода в наших широтах бывает крайне разная
     
  14. imMan

    imMan Нерд

    в данном случае время выставлено с запасом, таймер можно выставить хоть на 5 мин
     
  15. imMan

    imMan Нерд

    Приехал ко мне с китайщины приемник 433Mhz, в связи с этим переделан код
    теперь устройство обучаемо, пульты хранит на microSD.

    Arduino Nano v3 - 180р
    433Mhz receiver - 80р
    SD Shield - 80р
    Relay Shield - 110р.
    2 пульта - 180р
    Потенциометр 1шт
    Тактовая кнопка 3шт
    Резистор 4,7Ком 3шт
    Светодиод 3шт
    microSD карточка 1шт

    Принцип работы:
    Обучение:
    Удерживаем кнопку обучения открытия и нажимаем кнопку открытия на пульте,загорелся
    светодиод отпустили кнопку, светодиод погас пульт на открытие добавлен.
    Закрытие аналогично
    Сброс пультов: нажать и удерживать кнопку сброса 5 секунд, загорелся светодиод отпустили кнопку
    работа:
    Нажали на пульте кнопку открытия, сработало реле открытия на установленный период(устанавливается потенциометром), прервать можно нажав кнопку закрытия. Закрытие аналогично.
    Устройство рассчитано на применение с роллворотами, рольставнями, любыми приводами
    оборудованными концевиками.

    Ну и быдлокод прилагается

    Код (C++):
    #include <RCSwitch.h>
    #include <Bounce.h>
    #include <SD.h>
    #include <SPI.h>

    const int CS = 4;                 // Выход CS на шилде (Chip Select)
    RCSwitch receiver = RCSwitch();

    #define reset_Btn 7

    #define learningLed A2
    #define learning_openBtn 5        // Кнопка обучения открывания
    #define learning_closeBtn 6       // Кнопка обучения закрывания
    #define errorCard A3               // Светодиод ошибки карты памяти
    #define openRelay 8               // Выход реле открытия
    #define closeRelay 9              // Выход реле закрытия
    #define resetLed A4
    int timerPin = A0;                // Аналоговый вход потенциометра установки таймера
    unsigned long OpenTimer;          // Переменная таймера работы
    unsigned long reset_timer = 5000; // таймер сброса

    Bounce openKey = Bounce(learning_openBtn,5);
    Bounce closeKey = Bounce(learning_closeBtn,5);
    Bounce resetKey = Bounce(reset_Btn,5);


    String openCodes;
    String closeCodes;


    void setup()
    {
      Serial.begin(9600);
      receiver.enableReceive(0);  // pin 2 (DATA)
      pinMode(openRelay,OUTPUT);
      pinMode(closeRelay,OUTPUT);
      digitalWrite(openRelay,HIGH);
      digitalWrite(closeRelay,HIGH);
      pinMode(learning_openBtn,INPUT);
      pinMode(learning_closeBtn,INPUT);
      pinMode(errorCard,OUTPUT);
      pinMode(timerPin,INPUT);
      pinMode(learningLed,OUTPUT);
      pinMode(resetLed,OUTPUT);

          if (!SD.begin(CS)) {                // Если карта памяти недоступна    
            digitalWrite(errorCard,HIGH);             // Зажикаем светодиод
            return;
          }
        //////////////// OPEN KEYS ////////////////////       Читаем файл с ключами открытия
           File openFile = SD.open("open.txt");
           char temp_opencodes;
       
              while (openFile.available())
                {
                   temp_opencodes = openFile.read();    
                   openCodes += temp_opencodes;
                }        
              openFile.close();      
        //////////////////////////////////////////////
     
        ////////////////// CLOSE KEYS ////////////////        Читаем файл с ключами закрытия
           File closeFile = SD.open("close.txt");
           char temp_closecodes;  
              while (closeFile.available())
                {
                   temp_closecodes = closeFile.read();    
                   closeCodes += temp_closecodes;
                }        
              closeFile.close();      
        //////////////////////////////////////////////
    }
    void(* resetFunc) (void) = 0;




    void loop()
    {
     
        unsigned long rawReading = analogRead(timerPin);
        OpenTimer = (rawReading/30)*5000;
     
    ///////////////////  удаляем все пульты  //////////////////////////

       if ( resetKey.update() )
          {
              if ( resetKey.read() == HIGH)
                 {              
                     unsigned long reset_timer_millis = millis();
                        while(digitalRead(reset_Btn)==HIGH)                            // Пока нажата кнопка
                            {      
                                if(millis() - reset_timer_millis > reset_timer)        // Если кнопка нажата 5 секунд
                                    {
                                       digitalWrite(resetLed,HIGH);                    // Зажигаем светодиод
                                       SD.remove("open.txt");                          // Удаляем файс с ключами открытия
                                       SD.remove("close.txt");                         // Удаляем файс с ключами закрытия              
                                       delay(3000);                                    // Делаем паузу
                                       digitalWrite(resetLed,LOW);                     // гасим светодиод
                                       resetFunc();                                    // Перезапускаем программу
                                    }      
                            }
                  }
          }
                 
    /////////////////////////////////////////////////////////////

      if (receiver.available())
        {
            //////////////   Обучаем на открытие  ///////////////////////
         
            if ( openKey.update() )
                  {    
                      if ( openKey.read() == HIGH)
                         {                                    
                               unsigned long LgettingCode = receiver.getReceivedValue();
                               String Lcode = String(LgettingCode);
                                 digitalWrite(learningLed,HIGH);                        
                                  ////// Пишем полученный код в файл  ///////////
                                  File learning_open_dataFile = SD.open("open.txt", FILE_WRITE);
                                  learning_open_dataFile.print(Lcode += ",");
                                  learning_open_dataFile.close();
                                  ///////////////////////////////////////////////                        
                                 delay(3000);
                                 digitalWrite(learningLed,LOW);
                                 resetFunc();                                                                  
                         }            
                  }
            /////////////////////////////////////////////////////
                 
         
            //////////////   Обучаем на закрытие  ///////////////////////
            if ( closeKey.update() )
                  {    
                      if ( closeKey.read() == HIGH)
                         {              
                               unsigned long LgettingCode = receiver.getReceivedValue();
                               String Lcode = String(LgettingCode);
                                 digitalWrite(learningLed,HIGH);                          
                                  ////// Пишем полученный код в файл  ///////////
                                  File learning_close_dataFile = SD.open("close.txt", FILE_WRITE);
                                  learning_close_dataFile.print(Lcode += ",");
                                  learning_close_dataFile.close();
                                  ///////////////////////////////////////////////                        
                                 delay(3000);
                                 digitalWrite(learningLed,LOW);
                                 resetFunc();                                            
                        }                                          
                   }
            /////////////////////////////////////////////////////
                               
                    Serial.println();  // Без этого НЕ РАБОТАЕТ!!!
                    unsigned long gettingCode = receiver.getReceivedValue();
                    String code = String(gettingCode);    
                    if(openCodes.indexOf(code) != -1)    
                      {            
                          digitalWrite(openRelay,LOW);
                          delay(1000);
                          unsigned long timer = millis();
                          while (millis()-timer < OpenTimer)
                          {
                            unsigned long gettingCode = receiver.getReceivedValue();
                            String code = String(gettingCode);                  
                                   if(closeCodes.indexOf(code) != -1)
                                    {                        
                                        break;
                                     }
                           }
                         digitalWrite(openRelay,HIGH);
                         delay(1000);
                      }
                       else if(closeCodes.indexOf(code) != -1)
                      {    
                          digitalWrite(closeRelay,LOW);
                          delay(1000);
                          unsigned long timer = millis();
                          while (millis()-timer < OpenTimer)
                          {
                            unsigned long gettingCode = receiver.getReceivedValue();
                            String code = String(gettingCode);
                                   if(openCodes.indexOf(code) != -1)
                                    {
                                        break;
                                     }
                           }
                         digitalWrite(closeRelay,HIGH);
                         delay(1000);
                      }                    
        }
      receiver.resetAvailable();          
    }


     
     
  16. kovian

    kovian Нуб

    Всё равно думаю с концевиками будет надёжнее. А так идея очень интересная и главное жинеспособная
     
  17. imMan

    imMan Нерд

    У меня концевики штатные стоят
     
  18. kovian

    kovian Нуб

    А вы их подключили к контроллеру ?
     
  19. imMan

    imMan Нерд

  20. kovian

    kovian Нуб

    Ну если такая схема то тогда всё в полном порядке