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

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

  1. Volf

    Volf Нерд

    У меня такой вопрос, что нужно прописать в скетче, чтобы при нажатии кнопки канал реле открывался на определенное кол-во времени, которое задавать будет пользователь?
     

    Вложения:

    • 0f6fXTW_fsc.jpg
      0f6fXTW_fsc.jpg
      Размер файла:
      227,9 КБ
      Просмотров:
      778
  2. Arduinщик

    Arduinщик Нерд

    Какой именно канал реле, при следующем нажатии открывать другой канал или тот же?
    Для чего вторая кнопка на фото?
     
  3. vvr

    vvr Инженерище

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

    Volf Нерд

    В общем, у меня такая ситуация, каждая кнопка открывает свой канал, первая открывает CH1, вторая, соответственно, CH2, и мне нужно написать программу, чтобы при однократном нажатии кнопки канал реле открывался на определенное кол-во времени, например, на 2 секунды. К каждому каналу реле в последствии будет подключен соленоид)
     
  5. Volf

    Volf Нерд

    честно говоря, я в этом деле новичок, и мало что понимаю))
     
  6. vvr

    vvr Инженерище

    Дык показывай свой код - будем помогать.
    Или за тебя надо весь нацарапать?
     
  7. Volf

    Volf Нерд

    Код (Text):
    const int button1 = 7;
    const int button2 = 6;
    int buttonState1 = 0;
    int buttonState2 = 0;
    const int relay1 = 3;
    const int relay2 = 4;
    int relayState1 = LOW;
    int relayState2 = LOW;

    void setup ()
    {
    pinMode (relay1, OUTPUT);
    pinMode (relay2, OUTPUT);
    pinMode (button1, INPUT);
    pinMode (button2, INPUT);
    }
    void loop ()
    {
      if (buttonState1 == HIGH)
      {
      digitalWrite (relayState1, HIGH);
    }
      else {
        digitalWrite (relayState1, LOW);
      }
        if (buttonState2 == HIGH)
      {
      digitalWrite (relayState2, HIGH);
    }
      else {
        digitalWrite (relayState2, LOW);
      }
    }
    пока это все, что есть у меня, это мне предлагали сделать через код для светодиода, когда он без паузы работает, но толком до конца не объяснили что и как
     
  8. vvr

    vvr Инженерище

    попробуй
    Код (Text):
    const int button1 = 7;
    const int button2 = 6;
    int buttonState1 = 0;
    int buttonState2 = 0;
    const int relay1 = 3;
    const int relay2 = 4;
    int relayState1 = LOW;
    int relayState2 = LOW;
    unsigned long currentMillis_1 = 0;
    unsigned long currentMillis_2 = 0;
    long interval_1 = 2000;    ///    задаёшь время срабатывания
    long interval_2 = 3000;

    void setup ()
    {
      pinMode (relay1, OUTPUT);
      pinMode (relay2, OUTPUT);
      pinMode (button1, INPUT);
      pinMode (button2, INPUT);
    }
    void loop ()
    {
      if (buttonState1 == HIGH)
      {
        currentMillis_1 = millis();
        relayState1 = HIGH;
      }
      if (millis() - currentMillis_1 >= interval_1)
      {
        currentMillis_1 =0;
       relayState1 = LOW;
      }

      if (buttonState2 == HIGH)
      {
        currentMillis_2 = millis();
        relayState2 = HIGH;
      }
      if(millis() - currentMillis_2 >= interval_2)
      {
        currentMillis_2 =0;
        relayState2 = LOW;
      }
    digitalWrite (relay1, relayState1);
    digitalWrite (relay2, relayState2);
    }

     
    только ещё надо добавить борьбу с дребезгом кнопок обязательно.
     
    Последнее редактирование: 19 фев 2015
  9. Volf

    Volf Нерд

    все равно не хочет работать(
     
  10. Arduinщик

    Arduinщик Нерд

    const int button1 = 7;
    const int button2 = 6;
    int buttonState1 = 0;
    int buttonState2 = 0;
    const int relay1 = 3;
    const int relay2 = 4;
    int relayState1 = LOW;
    int relayState2 = LOW;

    void setup ()
    {
    pinMode (relay1, OUTPUT);
    pinMode (relay2, OUTPUT);
    pinMode (button1, INPUT);
    pinMode (button2, INPUT);
    }
    void loop ()
    {
    if (buttonState1)
    {
    digitalWrite (relayState1, HIGH);
    delay(2000);
    }
    else {
    digitalWrite (relayState1, LOW);
    }
    if (buttonState2)
    {
    digitalWrite (relayState2, HIGH);
    delay(2000);
    }
    else {
    digitalWrite (relayState2, LOW);
    }
    }




    Ась?
     
  11. Volf

    Volf Нерд

    неа, все равно не хочет
     
  12. Volf

    Volf Нерд

    я хоть правильно все подключил?
     

    Вложения:

    • OtJQGA60iVo.jpg
      OtJQGA60iVo.jpg
      Размер файла:
      297,5 КБ
      Просмотров:
      710
    • y0GNVCMUjeI.jpg
      y0GNVCMUjeI.jpg
      Размер файла:
      328,7 КБ
      Просмотров:
      616
  13. vvr

    vvr Инженерище

  14. Volf

    Volf Нерд

    Возможность использовать резистор появится только завтра, тогда я завтра отпишусь по результату))
     
  15. Arduinщик

    Arduinщик Нерд

    const int button1 = 7;
    const int button2 = 6;
    bool buttonState1 ;
    bool buttonState2 ;
    const int relay1 = 3;
    const int relay2 = 4;
    int relayState1 = LOW;
    int relayState2 = LOW;

    void setup ()
    {
    pinMode (relay1, OUTPUT);
    pinMode (relay2, OUTPUT);
    pinMode (button1, INPUT);
    pinMode (button2, INPUT);
    }
    void loop ()
    {
    bool buttonState1 = digitalRead(button1);
    bool buttonState2 = digitalRead(button2);
    if (buttonState1 == 1)
    {
    digitalWrite (relayState1, HIGH);
    delay(2000);
    }
    else {
    digitalWrite (relayState1, LOW);
    }
    if (buttonState2 == 1)
    {
    digitalWrite (relayState2, HIGH);
    delay(2000);
    }
    else {
    digitalWrite (relayState2, LOW);
    }
    }




    Также потом в if попробуй gjvtyznm 1 на true.
     
  16. vvr

    vvr Инженерище

    можешь попробовать с внутренним подтягивающим резистором
     
  17. vvr

    vvr Инженерище

    Пример Ардуинщика не лучший вариант - там полно делеев, которые будут тормозить работу программы
     
  18. X-Dron

    X-Dron Гик

    Я бы написал так:
    Код (Text):
        #include <DI.h>        //подключаем библиотеку DI - обработка дискретного входа из набора библиотек от X-Dron
        #include <Timer_P.h>    //подключаем библиотеку Timer_P - работа с таямерами из набора библиотек от X-Dron

        #define Key_PIN 2      //PIN кнопки
        #define Relay_PIN 7    //PIN реле

        Timer_P Timer_R;            //создание и инициализация объекта класса Timer_P
        // Создание объектов типа "Дистретный вход" они посажены описанные выше пины. Фильтр антидребезга 30мс.
        DI Key_IN(Key_PIN, 30);        
        long Pulse;

        void setup() {
          //Режимы выходов
          pinMode(Relay_PIN, OUTPUT);
          //делать pinMode для входов не нужно. Они инициализируются при создании объекта класса DI
          //при работе со входами используется INPUT_PULLUP-режим. Значения входов нормализовываются во время обработки класса.
          //замкнутая кнопка - логическая 1.
        }

        void loop() {
          // Производится считывание с пинов дискретного входа и фильтрация через внутреннюю переменную класса.
          Key_IN.DI_Refresh();
     
          //Запускаем таймер по фильтрованной кнопке запуска таймера.
          //Сброс выполнения таймера - нет.
          //Режим работы таймера - Mode = 1 extended pulse
          //Время работы таймера - Pulse.
          //Результат работы таймера выводим на светодиод работы таймера
          digitalWrite(Relay_PIN, Timer_R.Timer(Key_IN.DI_Read(), 0, 1, Pulse));
        }
    Здесь комментариев больше, чем кода (в функциях всего 3 строчки).
    Подробнее о библиотеке и описание режима работы класса Timer_P здесь:
    http://forum.amperka.ru/threads/Таймеры-и-программный-антидребезг-входов.4280/

    Универсальный код на любое количество пар (в пределах адресного поля платы контроллера) кнопка-реле ниже. В данном случае на 4 пары.
    Код (Text):
    #include <DI.h>
    #include <Timer_P.h>
    #define COUNT 4 //задается количество пар

    int buttonPins[COUNT] = {2, 3, 4, 5}; //задаются пины кнопок
    int relaysPins[COUNT] = {6, 7, 8, 9};  //задаются соответствующие кнопкам пины реле
    DI Keys[COUNT]; //создание массива из класса DI - дискретный вход
    Timer_P RelayTimers[COUNT];
    long Pulse[COUNT] = {1000, 1000, 1000, 1000}; //задаются длительности импульсов по умолчанию

    void setup()
    {
      for (int i = 0; i < COUNT; i++) {
        pinMode(relaysPins[i], OUTPUT); //инициализация выходов реле
        Keys[i].Init(buttonPins[i], 10); //инициализация дискретных входов класса DI, антидребезг 10мс
      }
    }

    void loop()
    {
      for (int i = 0; i < COUNT; i++) {
        Keys[i].DI_Refresh();
        digitalWrite(relaysPins[i], RelayTimers[i].Timer(Keys[i].DI_Read(), 0, 1, Pulse[i]));
      }
    }
    кнопки подключаются как здесь
    [​IMG]
     
    Последнее редактирование: 20 фев 2015
    MESS нравится это.
  19. Volf

    Volf Нерд

    не могу понять, в чем причина отказа системы, я уже даже вручную пытался прописать саму библиотеку X-Dron_lib-master, но он почему-то не хочет импортировать её.
    upload_2015-2-24_0-59-37.png
     
  20. X-Dron

    X-Dron Гик

    содержимое скаченного архива нужно просто скопировать в папку "<документы пользователя>\Arduino\libraries".
    Скачай архив еще раз. До сегодняшнего утра на сервере была не самая актуальная версия. Для твоего случая разницы быть не должно, но лучше использовать обновленную.