Установить длительность включенного состояния выхода

Тема в разделе "Arduino & Shields", создана пользователем MESS, 12 янв 2016.

  1. MESS

    MESS Гик

    Слепил скетч термометра -регулятора. Проверил в работе с вентилятором - все четко отрабатывает ( включил -выключил)
    Теперь мне нужно подключить его для управления приводом актуатора. ( проветривание большой теплицы). Актуатор работает очень медленно на винтовой паре. Примерно 3 минуты длится открытие при 12 Вольтовом питании. Несмотря на наличие концевиков, нельзя допустить чтобы сигнал включения длился дольше ( мало ли чего). Не получается у меня с Millis(); Поэтому прошу помочь.
    Вот работающий код
    Код (C++):
     //РЕГУЛЯТОР 18В20  с  5110  версия  от 10.01.2016   работает кроме Millis();
    #include <OneWire.h>
    #include <LCD5110_Basic.h>
    LCD5110 myGLCD(3,4,5,6,7);
    OneWire  ds(8);
    extern uint8_t BigNumbers[];
    extern uint8_t SmallFont[];

    #define FORTON 13   // выход для команды на  открытие  форточки
    #define FORTOFF 10  //   на  закрытие  форточки

    //  для  Millis    .........................................
    //long previousMillis = 0;      // храним время последнего переключения
    long interval = 180000;       // интервал между включение/выключением

    void setup(){
    myGLCD.InitLCD();
    pinMode(FORTON, OUTPUT);
    pinMode(FORTOFF, OUTPUT);
    }

    void loop(){
      byte addr[8];
    if ( !ds.search(addr)) { ds.reset_search(); }
       ds.reset();
       ds.select(addr);
       ds.write(0x44);   //0x44  провести измерение температуры и записать данные в оперативную память
     
      ds.reset();  //
      ds.select(addr);
      ds.write(0xBE);    //

      float temperature =  (ds.read() | (ds.read()<<8)) / 16.0  ;
      myGLCD.setFont( BigNumbers);
      myGLCD.printNumF(temperature, 2, CENTER, 0);

      //  для Millis .................................
      unsigned long currentMillis = millis();
      //проверяем не прошел ли нужный интервал, если прошел то
      //if(currentMillis - previousMillis > interval) {

        //previousMillis = currentMillis; // компилятор  дает ошибку в этой строке



      //  ОТКРЫТИЕ ФОРТОЧКИ ДЛЯ ПРОВЕТРИВАНИЯ
      if (temperature >26)  {
        digitalWrite(FORTON, 1);// форточку  начать  медленно открывать  в течениие 3 мин.
     
       myGLCD.setFont(SmallFont);
       myGLCD.print("OTKR", CENTER, 40);
    }
     
       // ЗАКРЫТИЕ ПРОВЕТРИВАНИЯ
      else if (temperature < 25,30 ) {                
        digitalWrite(FORTON, 0); //прекращаем открытие
        delay(500);
        digitalWrite(FORTOFF, 1);//форточку  начать закрывать
        myGLCD.setFont(SmallFont);
       myGLCD.print("ZAKR", CENTER, 40);
        //нужно сбросить команду закрытия и печать на дисплее, но как?
      }}

     
     
  2. vvr

    vvr Инженерище

    а как меняем направление вращения движка на актуаторе
     
  3. MESS

    MESS Гик

    c помощью Н-моста на двух реле. могу и на мосфетах слепить.

    пин13 -открыть
    пин10 -закрыть
     
    Последнее редактирование: 12 янв 2016
  4. vvr

    vvr Инженерище

    а нафига вам время открывания
    поставили драйвер на мотор
    сработал концевик - обесточили драйвер
     
  5. sanik

    sanik Гик

    Попробуй по таймеру запусти цикл While while (millis() - currentTime <= (булевая переменая + (timeOent * 60000))) // таймер прогрева крутим цыкл пока не выйдет время #define timeOen 3 // время прогрева минут
     
  6. MESS

    MESS Гик

    Я ведь об этом и сказал -(мало ли что). Концевик может не сработать в тяжелых условиях парника. Даже если я их несколько последовательно поставлю. Надо страховать привод.
    Мне нужно ограничить время включенного состояния. А драйвер ничем не не лучше моста- просто удобнее ( и дороже). А хороших реле и мосфетов у меня без огр.

    Я прошу помощи со скетчем.
     
    Последнее редактирование: 12 янв 2016
  7. sanik

    sanik Гик

    Попробуй по таймеру запусти цикл While while (millis() - currentTime <= (( unsigned long переменная) + (timeOent * 60000))) // таймер прогрева крутим цыкл пока не выйдет время #define timeOen 3 // время прогрева минут
     
  8. MESS

    MESS Гик

    булева переменая - у меня она где?
    Мне нужно конкретно что куда вставить в моем коде. я же не программист
     
    Последнее редактирование: 12 янв 2016
  9. sanik

    sanik Гик

    Ок попробую обьяснить
     
  10. vvr

    vvr Инженерище

    оказывается дураки делают всякие чпу с концевиками и без всяких таймеров:D

    да и условия в парнике оказывается тяжелее чем на производстве, колумб ты наш.....
     
  11. MESS

    MESS Гик

    Я знаю что такое производство и что такое парник. Мне 70 лет. Актуатор у меня самодельный: шуруповерт старый и шпилька М12. концевиками служат геркончики по 2шт последовательно. Потому и сказал мало ли что!
    Не нужно надо мной куражится - лучше помоги решить конкретный вопрос по скетчу.
     
  12. MESS

    MESS Гик

    [​IMG] [​IMG] Мне просто хочется на ардуине попробовать это сделать. До этого у меня был просто регулятор на термоключе DS1821 + мосфеты.
     
    Последнее редактирование: 12 янв 2016
  13. sanik

    sanik Гик

    Вот примерно как то так
    Код (C++):
     //РЕГУЛЯТОР 18В20  с  5110  версия  от 10.01.2016   работает кроме Millis();
    #include <OneWire.h>
    #include <LCD5110_Basic.h>
    LCD5110 myGLCD(3,4,5,6,7);
    OneWire  ds(8);
    extern uint8_t BigNumbers[];
    extern uint8_t SmallFont[];

    ///Переменные для таймера
    unsigned long currentTime;
    unsigned long OpenTime;// вместо OpenTime любое название которое тебе легче запомнить
    #define timeHeat 1 // время время открытия в минутах у меня поставлена одна

    #define FORTON 13   // выход для команды на  открытие  форточки
    #define FORTOFF 10  //   на  закрытие  форточки

    //  для  Millis    .........................................
    //long previousMillis = 0;      // храним время последнего переключения
    long interval = 180000;       // интервал между включение/выключением

    void setup(){
    myGLCD.InitLCD();
    pinMode(FORTON, OUTPUT);
    pinMode(FORTOFF, OUTPUT);
    }

    void loop(){
      byte addr[8];
    if ( !ds.search(addr)) { ds.reset_search(); }
       ds.reset();
       ds.select(addr);
       ds.write(0x44);   //0x44  провести измерение температуры и записать данные в оперативную память
      ds.reset();  //
      ds.select(addr);
      ds.write(0xBE);    //

      float temperature =  (ds.read() | (ds.read()<<8)) / 16.0  ;
      myGLCD.setFont( BigNumbers);
      myGLCD.printNumF(temperature, 2, CENTER, 0);
     
        currentTime = millis();         // считываем время, прошедшее с момента запуска программы
        OpenTime; = currentTime; // записываем новое время
      // Дальше условие при котором открывается форточка
      /*
      if(например температура такая то влажность такая то) //если услови выполнено то
      {
        while (millis() - currentTime <= (heatingTime + (timeHeat * 60000))) // таймер открытия крутим цыкл пока не выйдет время
        {
          // при входе в цикл while остальной код остановиться пока не откроется форточка то есть пока не выйдет время
          digitalWrite(FORTON, 1);// форточку  начать  медленно открывать  в течениие хоть десяти минут подберешь мин.
          если нужно еще что то делать пишем союда весь код с условиями и чем угодно
          пока паботает таймер будет выполняться только этот код который пропишешь здесь
        }
      }
    */

      //  для Millis .................................
      unsigned long currentMillis = millis();
      //проверяем не прошел ли нужный интервал, если прошел то
      //if(currentMillis - previousMillis > interval) {

        //previousMillis = currentMillis; // компилятор  дает ошибку в этой строке



      //  ОТКРЫТИЕ ФОРТОЧКИ ДЛЯ ПРОВЕТРИВАНИЯ
      if (temperature >26)  {
        digitalWrite(FORTON, 1);// форточку  начать  медленно открывать  в течениие 3 мин.
       myGLCD.setFont(SmallFont);
       myGLCD.print("OTKR", CENTER, 40);
    }
     
       // ЗАКРЫТИЕ ПРОВЕТРИВАНИЯ
      else if (temperature < 25,30 ) {              
        digitalWrite(FORTON, 0); //прекращаем открытие
        delay(500);
        digitalWrite(FORTOFF, 1);//форточку  начать закрывать
        myGLCD.setFont(SmallFont);
       myGLCD.print("ZAKR", CENTER, 40);
        //нужно сбросить команду закрытия и печать на дисплее, но как?
      }}
     
    MESS нравится это.
  14. sanik

    sanik Гик

    Только не забудь заменить heatingTime на OpenTime в общем можешь любые названия
     
  15. sanik

    sanik Гик

    Мне тоже не мало лет надо мной тоже не мало здесь глумились Но все таки есть люди благодаря которым я кое чему научился спасибо им!
     
  16. sanik

    sanik Гик

    Только вот не пойму зачем открывалке такая роскошь как LCD5110 достаточно для контроля пару светодиодов на время открытия синий и на время закрытия красный а когда сделано можно и зеленый)
     
  17. MESS

    MESS Гик

    Спасибо большое!
    поправил OpenTime = currentTime; и сразу загрузился! буду теперь вникать.
     
  18. vvr

    vvr Инженерище

    никто не куражится, да и я давно не пионер
    просто задача какая то не нужная...
    но это чисто моё мнение
     
  19. sanik

    sanik Гик

    Не за что зато теперь когда есть контроллер можно в него всунуть еще кучу автоматики!
     
  20. sanik

    sanik Гик

    Каждому свои задачи, я вот например вентиляцию делаю и тоже застрял не могу продвинуться вобщем пока на мертвой точке http://forum.amperka.ru/threads/Вопрос-знатокам-на-засыпку.7033/