Друзья, нужна помощь с реле.

Тема в разделе "Arduino & Shields", создана пользователем Volf, 19 фев 2015.

  1. vvr

    vvr Инженерище

    у меня всё работает.
     
  2. Volf

    Volf Нерд

    с такой программой не работает(
     
  3. Volf

    Volf Нерд

     

    Вложения:

    • Dj0jHwKQLsw.jpg
      Dj0jHwKQLsw.jpg
      Размер файла:
      240,9 КБ
      Просмотров:
      682
  4. vvr

    vvr Инженерище

    разберись со схемой своей
     
  5. X-Dron

    X-Dron Гик

  6. Volf

    Volf Нерд

  7. Volf

    Volf Нерд

    а если вместо реле поставить транзистор, он будет с этим же кодом работать?
     
  8. vvr

    vvr Инженерище

    Будет, только правильно подключи его:)
     
  9. Demos

    Demos Нуб

    Добрый день! Помогите пожалуйста, очень прошу! уже больше недели не могу победить скетч. Необходимо подавать сигнал на 1 канал 2-х канального реле на 5сек, через 2 часа (чтоб проверить указал 10 сек, в главном коде время будет задаваться переменной) включать оба канала на 5 сек, потом опять пауза на 2 часа и по новой.
    Мне посоветовали такой код, но он не работает :( Может получиться через конструкцию if else, мне хоть как-то чтоб работало. Хотел из вышеописанного кода убрать чтение кнопок но тоже не вышло(

    Код (Text):

    #define channel1pin 6
    #define channel2pin 5
    #define work_interval 5000 // время работы канала
    #define idle_interval 10000 // время между включениями каналов

    unsigned long prevMillis = 0;
    byte state = 0;

    void setup()
    {
      pinMode(channel1pin, OUTPUT);
      pinMode(channel2pin, OUTPUT);
      digitalWrite(channel1pin, HIGH);
      digitalWrite(channel2pin, HIGH);
    }

    void loop()
    {
      if(!state)
        digitalWrite(channel1pin, LOW);
      unsigned long currentMillis = millis();
      if((currentMillis - prevMillis > work_interval) && (state==0 || state==2))
      {
        prevMillis = currentMillis;
        switch(state)
        {
          case 0:      
            digitalWrite(channel1pin, HIGH);
            state = 1;
            break;
          case 2:
            digitalWrite(channel1pin, HIGH);
            digitalWrite(channel2pin, HIGH);
            state = 0;
            break;
        }
      }
      currentMillis = millis();
      if(currentMillis - prevMillis > idle_interval && state==1)
      {
        prevMillis = currentMillis;
        digitalWrite(channel1pin, LOW);
        digitalWrite(channel2pin, LOW);
        state = 2;
      }
    }
     
  10. X-Dron

    X-Dron Гик

    Начало меандра к чему-нибудь привязывается, или от включения контроллера?
     
  11. Demos

    Demos Нуб

    от включения
    upd. Мне понравилась Ваша библиотека и примеры смотрел но так и не понял если честно) один канал включал примером, а второй подключить не смог
     
  12. X-Dron

    X-Dron Гик

    Первое, что пришло в голову. Приду домой попробую через подсчет включений первого канала, тогда генерить второй меандр не нужно. Код будет попроще. Сейчас ужу времени нет.
    Код (Text):
    #define channel1pin 6
    #define channel2pin 5
    #define work_interval 5000 // время работы канала
    #define idle_interval 10000 // время между включениями каналов

    long doptime1, doptime2;

    void setup()
    {
      pinMode(channel1pin, OUTPUT);
      pinMode(channel2pin, OUTPUT);
    }

    void loop()
    {
      doptime1 = millis() % idle_interval;
      if (doptime1 < work_interval){
        digitalWrite(channel1pin, HIGH);
      }else{
        digitalWrite(channel1pin, LOW);
      }
      doptime2 = millis() % (idle_interval * 2);
      if (doptime2 >= idle_interval && doptime2 < idle_interval+work_interval){
        digitalWrite(channel2pin, HIGH);
      }else{
        digitalWrite(channel2pin, LOW);
      }
    }
    Тоже самое, но в 4 строки в loop.
    Код (Text):
    #define channel1pin 6
    #define channel2pin 5
    #define work_interval 5000 // время работы канала
    #define idle_interval 10000 // время между включениями каналов

    long doptime1, doptime2;

    void setup()
    {
      pinMode(channel1pin, OUTPUT);
      pinMode(channel2pin, OUTPUT);
    }

    void loop()
    {
      doptime1 = millis() % idle_interval;
      digitalWrite(channel1pin, doptime1 < work_interval);
      doptime2 = millis() % (idle_interval * 2);
      digitalWrite(channel2pin, doptime2 >= idle_interval && doptime2 < idle_interval+work_interval);
    }
     
    Последнее редактирование: 4 мар 2015
  13. Demos

    Demos Нуб

    Спасибо, сейчас попробую
     
  14. X-Dron

    X-Dron Гик

    Так тоже должно работать
    Код (Text):
    #define channel1pin 6
    #define channel2pin 5
    #define work_interval 5000 // время работы канала
    #define idle_interval 10000 // время между включениями каналов

    boolean ReleOn = 0, ReleOn_Old = 0;
    byte OnCounter;
    long doptime;

    void setup()
    {
      pinMode(channel1pin, OUTPUT);
      pinMode(channel2pin, OUTPUT);
    }

    void loop()
    {
      doptime = millis() % idle_interval; // Эти 2 строки формируют меандр
      ReleOn = doptime < work_interval;
      if (ReleOn && !ReleOn_Old) OnCounter++; // Счетчик включений реле
      ReleOn_Old=ReleOn;
      digitalWrite(channel1pin, ReleOn); //Вывод первого реле каждый цикл меандра
      digitalWrite(channel2pin, ReleOn && (OnCounter%2 == 0)); //Вывод второго реле через цикл меандра
    }
    }
     
    Последнее редактирование: 4 мар 2015
  15. Demos

    Demos Нуб

    Спасибо еще раз! первый код работает, вставил в основной скетч, сначала было затруднение - для проверки выбрал малые значения- выставил бОльший интервал между включениями и все отлично!
     
  16. X-Dron

    X-Dron Гик

    Я там вставил укороченную версию, попробуйте ее.
     
  17. Demos

    Demos Нуб

    Дело в том что в работе с реле идет инверсия, т.е. в первом Вашем коде я менял LOW на HIGH, а как поменять в сокращенном не представляю, может поменять idle_interval и work_interval ?
     
  18. X-Dron

    X-Dron Гик

    Код (Text):
    void loop()
    {
      doptime1 = millis() % idle_interval;
      digitalWrite(channel1pin, !(doptime1 < work_interval));
      doptime2 = millis() % (idle_interval * 2);
      digitalWrite(channel2pin, !(doptime2 >= idle_interval && doptime2 < idle_interval+work_interval));
    }
     
  19. Demos

    Demos Нуб

    Видимо из-за моей криворукости нормально работает только первый вариант кода.
     
  20. X-Dron

    X-Dron Гик

    Специально собрал схему проверил все 3 варианта. 1й и 2й полностью рабочие, по предложенному алгоритму. В 3-м была пропущена одна строка в loop, вставил.
    Если получается так, что требуется инверсия выхода, то или катушка реле подключена некорректно, или у самого реле используете NC контакты вместо NO.
    Фотку реле с подключением нагрузки в студию.