автоматика ворот

Тема в разделе "Arduino & Shields", создана пользователем Адам, 11 мар 2017.

?

Как правильно?

Голосование закрыто 11 ноя 2018.
  1. Скетч?

    100,0%
  2. Скейч?

    0 голосов
    0,0%
  3. Скретч?

    0 голосов
    0,0%
  4. Скрейтч?

    0 голосов
    0,0%
  1. Адам

    Адам Нерд

    помогите скейчом , для ворот " 1 рас нажал закрытиеворот, плюс мигалка светодиода, 2 нажал пауза, стоп мигания светодиода, 3рас нажал открытиеворот , плюс мигание свето диеда, 4 нажал пауза, стоп мигания светодиода и обратно
     
    Последнее редактирование модератором: 11 мар 2017
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Где ваши наработки по скетчу?
     
  3. alekseev2017

    alekseev2017 Нерд

    Учебник по C++ в помощь.
     
  4. qwone

    qwone Гик

    Можно воспользоваться этой программой. Полный скетч здесь https://yadi.sk/d/U_gtAoSN3AtYSM
    Код (C++):
    /* class_Led.ino
      #1 светодиод ->13
      #2 кнопка 1 -> 2 вкл светодиод
      #3 кнопка 2 -> 3 выкл светодиод
      #4 кнопка 3 -> 4 светодиод мигает
    */

    // #1 светодиод
    #include "Cl_led.h"
    const byte led1_pin = 13;
    Cl_led Led1(led1_pin, 1); // создать
    // #2 кнопка
    #include "Cl_do_btn.h"
    const byte btn1_pin = 2;
    void Do_Btn1() {
      Led1.ON();
    }
    Cl_do_btn Btn1(btn1_pin, 0,    // пин кнопки, уровень при наж кнопки
                   & Do_Btn1   );  // какую функцию надо сделать
    // #3 кнопка
    const byte btn2_pin = 3;
    void Do_Btn2() {
      Led1.OFF();
    }
    Cl_do_btn Btn2(btn2_pin, 0,    // пин кнопки, уровень при наж кнопки
                   & Do_Btn2   );  // какую функцию надо сделать
    // #4 кнопка
    const byte btn3_pin = 4;
    void Do_Btn3() {
      Led1.blink();
    }
    Cl_do_btn Btn3(btn3_pin, 0,    // пин кнопки, уровень при наж кнопки
                   & Do_Btn3   );  // какую функцию надо сделать
    void setup() {
      Led1.setup();
      Led1.T_blink = 500;// мигать 0.5 горит -0.5 нет
      Btn1.setup();
      Btn2.setup();
      Btn3.setup();
    }

    void loop() {
      Led1.loop();
      Btn1.loop();
      Btn2.loop();
      Btn3.loop();
    }
     
  5. Адам

    Адам Нерд

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

    я конченный чайник но хотелось бы сделать ворота на ардуине уно
     
    Последнее редактирование модератором: 3 ноя 2019
  6. qwone

    qwone Гик

  7. Адам

    Адам Нерд

    там готовые ворота
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    А почему концевик только один?
     
  9. Адам

    Адам Нерд

    мне надо только одну створку ворот открыть и закрыть
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

    Концевик должен быть и на полностью открытое положение, и на полностью закрытое. Иначе как узнать когда пора остановиться?
     
  11. qwone

    qwone Гик

    Вот и выходит 4 пина надо задействовать. (1)- мотор вперед (2) мотор назад (3) концевик на открытые ворота (4) концевик на закрытые ворота . Ну и еще 2 - (5) кнопка управления (6) лампочка которая мигает.
     
  12. Адам

    Адам Нерд

    ну и скетч не могу сделать голова дура

    int svet=0;// Заводим целочисленную переменную для хранения состояния светодиода

    void setup() {
    pinMode(6,OUTPUT); // мегалка
    pinMode(8,OUTPUT); //светодиод № 1 вперд стоп
    pinMode(7,OUTPUT); // светодиод № 2 назад стоп
    pinMode(11,INPUT); // пульт
    pinMode(12,INPUT); // концевик
    }
    void loop() {
    if (digitalRead(11)==1 && svet ==0) //Если с кнопки есть сигнал И светодиод выключен
    {
    digitalWrite(8,HIGH); //Зажигаем светодиод
    {
    digitalWrite(6, HIGH); //мигалка ключит ЗАКРЫТЬ
    delay(1000);
    digitalWrite(6, LOW);
    delay(1000);
    }
    svet =1; // Записываем новое состояние
    while (digitalRead(11)) // Ждем когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(12)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(8,LOW); // то выключаем 8й пин КОНЦЕВИК
    digitalWrite(6,LOW); //мигалку выключить
    svet =0;
    while (digitalRead(11)) // Ждем когда отпустят кнопку
    delay(50);

    }
    if (digitalRead(11)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(8,LOW); //Гасим светодиод
    digitalWrite(6, LOW); //мигалка выключить ПАУЗА
    svet =0; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(11)==1 && svet ==0) //Если с нопки есть сигнал И светодиод выключен
    {
    digitalWrite(7,HIGH);//Зажигаем светодиод
    {
    digitalWrite(6,HIGH); //мигалку ключит ОТКРЫТЬ
    delay(1000);
    digitalWrite(6, LOW);
    delay(1000);
    }
    svet =1; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(12)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(7,LOW); // то выключаем 7й пин КОНЦЕВИК
    digitalWrite(6, LOW); //мигалка выключить
    svet =0;
    while (digitalRead(11)) // Ждем когда отпустят кнопку
    delay(50);
    }


    if (digitalRead(11)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(7,LOW); //Гасим светодиод
    digitalWrite(6, LOW); //мигалка выключить ПАУЗА
    svet =0; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);



    }


    }

    как добавить сюда мигалку например

    long previousMillis =0;
    int val=0;

    void setup()
    {

    pinMode(13, OUTPUT);


    }

    void loop()

    {
    if(digitalRead(14)==HIGH)//если кнопка нажата ...
    {

    if(millis()-previousMillis >500)
    {
    previousMillis = millis();
    val++;
    }
    }
    else
    {
    val=0;
    }

    if(val>=5)
    {
    digitalWrite(13,!digitalRead(13));//инвертируем состояние пина
    val=0;
    }


    }

    // Таймер
    #define TIME_LED_OFF 3000 // 3 сек
    unsignedlongint time_led_off;
    // Таймер для обработки кнопки
    #define TIME_BUTTON 500 // 500 мс
    unsignedlongint time_button;

    int state;

    void setup()
    {
    pinMode(12, OUTPUT);// светодиод 1
    pinMode(13, OUTPUT);// светодиод 2
    pinMode(11, INPUT);// кнопка
    }

    void loop()
    {
    // Нажимаем кнопку, опрос кнопки будет происходить раз в 500 мс
    if(millis()- time_button > TIME_BUTTON)
    {
    if(digitalRead(11)== HIGH)
    {
    state +=1;
    // сбрасываем таймеры
    time_led_off = millis();
    time_button = millis();
    }
    }
    // первое нажатие включает светодиод 1
    if(state ==1)
    {
    digitalWrite(12, HIGH);
    // выключает по таймеру
    if(millis()- time_led_off > TIME_LED_OFF)
    {
    digitalWrite(12, LOW);
    state =2;
    }
    }
    // второе нажатие - досрочно выключает первый светодиод
    if(state ==2)
    {
    digitalWrite(12, LOW);
    }
    // третье нажатие включает второй светик
    if(state ==3)
    {
    digitalWrite(13, HIGH);
    // отключает его по таймеру
    if(millis()- time_led_off > TIME_LED_OFF)
    {
    digitalWrite(13, LOW);
    state =0;
    }
    }
    // четвертое нажатие отключает светик досрочно
    if(state ==4)
    {
    digitalWrite(13, LOW);
    state =0;// возвращаемся в начало
    }
    }

    вот нашел но он с таймером и без мигалки и концевиков

    кто ни будь смог бы помочь написать скетч по моему поводу
     
    Последнее редактирование модератором: 3 ноя 2019
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    Помочь или написать за вас?
    Помочь пытались несколько раз, вы не вникаете в ответы, вместо этого накидываете чужие куски кода, даже не понимая что там происходит.
    P.S. оформляйте код правильно.
     
  14. Адам

    Адам Нерд

    вернее написать скетч если не трудно, пытаюсь но не получается у меня

    заранее был бы благодарен

    int svet=0; // Заводим целочисленную переменную для хранения состояния светодиода
    void setup() {
    pinMode(6,OUTPUT); // мегалка
    pinMode(8,OUTPUT); //светодиод № 1 вперд стоп
    pinMode(7,OUTPUT); // светодиод № 2 назад стоп
    pinMode(11,INPUT); // пульт
    pinMode(12,INPUT); // концевик
    }
    void loop() {
    if (digitalRead(11)==1 && svet ==0) //Если с кнопки есть сигнал И светодиод выключен
    {
    digitalWrite(8,HIGH); //Зажигаем светодиод
    {
    digitalWrite(6, HIGH); //мигалка ключит ЗАКРЫТЬ
    delay(1000);
    digitalWrite(6, LOW);
    delay(1000);
    }
    svet =1; // Записываем новое состояние
    while (digitalRead(11)) // Ждем когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(12)==1) //Если на 12 пине есть сигнал
    {
    digitalWrite(8,LOW); // то выключаем 8й пин КОНЦЕВИК
    digitalWrite(6,LOW); //мигалка выключить

    }
    if (digitalRead(11)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(8,LOW); //Гасим светодиод
    digitalWrite(6, LOW); //мигалка выключить ПАУЗА
    svet =0; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(11)==1 && svet ==0) //Если с нопки есть сигнал И светодиод выключен
    {
    digitalWrite(7,HIGH);//Зажигаем светодиод
    {
    digitalWrite(6,HIGH); //мигалка ключит ОТКРЫТЬ
    delay(1000);
    digitalWrite(6, LOW);
    delay(1000);
    }
    svet =1; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);
    }

    if (digitalRead(12)==1) //Если на 12 пине есть сигнал
    {
    digitalWrite(7,LOW); // то выключаем 7й пин КОНЦЕВИК
    digitalWrite(6, LOW); //мигалка выключить

    }


    if (digitalRead(11)==1 && svet ==1) //Если с нопки есть сигнал И светодиод горит
    {
    digitalWrite(7,LOW); //Гасим светодиод
    digitalWrite(6, LOW); //мигалка выключить ПАУЗА
    svet =0; // Записываем новое состояние
    while (digitalRead(11)) // Ждем, когда отпустят кнопку
    delay(50);



    }


    }

    вот мой скетч но он нефига не работает

    помогите бедному чайнику
     
    Последнее редактирование модератором: 3 ноя 2019
  15. qwone

    qwone Гик

    У вас даже не проблема со скетчем. У вас отсутсвует даже понимание проблемы.
    Полный скетч здесь https://yadi.sk/d/a7ok1SxN3FWeN7
    Код (C++):
    /*Class_do_btn_4mode.ino
      #1 светодиод ->13
      #2 кнопка 1 -> 2 выбор режима
    */

    // #1 светодиод
    #include "Cl_led.h"
    const byte led1_pin = 13;
    Cl_led Led1(led1_pin, 1); // создать
    // #2 кнопка
    #include "Cl_do_btn_4mode.h"
    const byte btn1_pin = 2;
    void Do1_Btn1() {
      Serial.println("Open Door");
      Led1.blink();
    }
    void Do2_Btn1() {
      Serial.println("Pause");
      Led1.OFF();
    }
    void Do3_Btn1() {
      Serial.println("Close Door");
      Led1.blink();
    }
    void Do4_Btn1() {
      Serial.println("Pause");
      Led1.OFF();
    }
    Cl_do_btn_4mode Btn1(btn1_pin, 0,    // пин кнопки, уровень при наж кнопки
                   & Do1_Btn1, & Do2_Btn1, & Do3_Btn1, & Do4_Btn1   ); // какую функцию надо сделать

    void setup() {
      Serial.begin(9600);
      Led1.setup();
      Led1.T_blink = 500;// мигать 0.5 горит -0.5 нет
      Btn1.setup();
    }

    void loop() {
      Led1.loop();
      Btn1.loop();
    }
     
  16. Tomasina

    Tomasina Сушитель лампочек Модератор

    оформляйте код правильно.
    Ну нет никакого желания разбирать в этой каше какая скобка куда относится :confused:
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    вот примерная архитектура скетча:
    Код (C++):
    #define LED_FLASH       6     // мигалка
    #define MOTOR_OPEN      8     // выход на драйвер управления мотором
    #define MOTOR_CLOSE     7     // выход на драйвер управления мотором
    #define BUTTON          11    // кнопка или сигнал с пульта
    #define SWITCH_OPENED   12    // концевик полностью открытых ворот
    #define SWITCH_CLOSED   10    // концевик полностью закрытых ворот
    #define BLINK_TIME      250   // скорость моргания мигалки
    #define DEBOUNCE        50    // задержка для антидребезга кнопки
    enum {STOP, OPEN, CLOSE};     // возможные состояния системы
    byte state;                   // текущее состояние системы
    byte lastDir;                 // предыдущее направление открытия ворот

    void checkSwitches(void);
    void ledsManager(void);
    void motor(void);
    void readButton(void);

    void setup()
    {
      pinMode(LED_FLASH, OUTPUT);
      pinMode(MOTOR_OPEN, OUTPUT);
      pinMode(MOTOR_CLOSE, OUTPUT);
      pinMode(BUTTON, INPUT);
      pinMode(SWITCH_OPENED, INPUT);
      pinMode(SWITCH_CLOSED, INPUT);
      state = STOP;                   // исходное состояние после включения питания
      lastDir = CLOSE;
    }

    void loop()
    {
      readButton();       // проверка кнопок
      checkSwitches();    // проверка концевиков, при коллизиях подавляет команду от кнопки
      ledsManager();      // световая индикация
      motor();            // управление двигателем
    }

    void readButton()
    {
      if (digitalRead(BUTTON)) // если нажата кнопка
      {
        if (state == STOP && lastDir == CLOSE)         // даем команду на открытите
        {
          // lastDir = state;
          state = OPEN;
        }
        else if (state == STOP && lastDir == OPEN)     // даем команду на закрытите
        {
          // lastDir = state;
          state = CLOSE;
        }
        else if (state == OPEN || state == CLOSE)      // даем команду на остановку
        {
          lastDir = state;
          state = STOP;
        }
      }
    }

    void checkSwitches()
    {
      if (digitalRead(SWITCH_OPENED) && state == OPEN)         // отмена команды Открыть при полностью открытой двери
      {
        lastDir = state;
        state = STOP;
      }
      else if (digitalRead(SWITCH_CLOSED) && state == CLOSE)   // отмена команды Закрыть при полностью закрытой двери
      {
        lastDir = state;
        state = STOP;
      }
    }

    void motor()
    {
      switch (state)
      {
        case STOP:
          digitalWrite(MOTOR_OPEN, LOW);
          digitalWrite(MOTOR_CLOSE, LOW);
          break;

        case OPEN:
          digitalWrite(MOTOR_OPEN, HIGH);
          digitalWrite(MOTOR_CLOSE, LOW);
          break;

        case CLOSE:
          digitalWrite(MOTOR_OPEN, LOW);
          digitalWrite(MOTOR_CLOSE, HIGH);
          break;
      }
      delay(DEBOUNCE); // простейший антидребезг кнопки
    }

    void ledsManager()
    {
      boolean ledState;
      static unsigned long timestamp = millis();
      if (state == STOP)
      {
        digitalWrite(LED_FLASH, LOW);
      }
      else
      {
        if (millis() - timestamp > BLINK_TIME)
        {
          ledState = LOW;
          timestamp = millis();
        }
        else ledState = HIGH;
        digitalWrite(LED_FLASH, ledState);
      }
    }
     
    Проверять не на чем, да и лень при таком отношении.
     
    Последнее редактирование: 11 мар 2017
  18. qwone

    qwone Гик

    Я тоже не претендую на полностью рабочий без шерховатости код . Кому интересно пусть посмотрит здесь https://yadi.sk/d/uUFRJOUe3FX7z7
    Код (C++):
    /*Gate_A.ino
      #1 светодиод ->13
      #2 дверь
           мотор +          -> 3 (Motor1_Open_pin)  0 вкл / 1 выкл
           мотор -          -> 4 (Motor1_Close_pin) 0 вкл / 1 выкл
           кончник открытия -> 5 (Gate1_Open_pin)   1 сработал / 0 нет
           кончник закрытия -> 6 (Gate1_Close_pin)  1 сработал / 0 нет
      #3 кнопка 1 -> 2 выбор режима
    */

    // #1 светодиод
    #include "Cl_led.h"
    const byte led1_pin = 13;
    Cl_led Led1(led1_pin, 1); // создать
    // #2 дверь
    #include "Cl_motor.h"
    const byte Motor1_Open_pin  = 3;   // двигатель 1 откр   0 вкл / 1 выкл
    const byte Motor1_Close_pin = 4;   // двигатель 1 закр   0 вкл / 1 выкл
    const byte Gate1_Open_pin   = 5;   // концевик  откр     1 сработал / 0 нет
    const byte Gate1_Close_pin  = 6;   // концевик  закр     1 сработал / 0 нет
    Cl_motor Motor1(Motor1_Open_pin, Motor1_Close_pin, Gate1_Open_pin, Gate1_Close_pin,
                    0, 0); // 0-уровень на вкл моторе // 0-уровень на вкл концевике
    // #3 кнопка
    #include "Cl_do_btn_4mode.h"
    const byte btn1_pin = 2;
    void Do1_Btn1() {
      Serial.println("Open Door");
      Led1.blink();
      Motor1.Open();
    }
    void Do2_Btn1() {
      Serial.println("Pause");
      Led1.OFF();
      Motor1.Stop();
    }
    void Do3_Btn1() {
      Serial.println("Close Door");
      Led1.blink();
      Motor1.Close();
    }
    void Do4_Btn1() {
      Serial.println("Pause");
      Led1.OFF();
      Motor1.Stop();
    }
    Cl_do_btn_4mode Btn1(btn1_pin, 0,    // пин кнопки, уровень при наж кнопки
                         & Do1_Btn1, & Do2_Btn1, & Do3_Btn1, & Do4_Btn1   ); // какую функцию надо сделать

    void setup() {
      Serial.begin(9600);
      Led1.setup();
      Led1.T_blink = 500;// мигать 0.5 горит -0.5 нет
      Motor1.setup();
      Btn1.setup();
    }

    void loop() {
      Led1.loop();
      Motor1.loop();
      Btn1.loop();
    }
     
    Tomasina нравится это.
  19. Адам

    Адам Нерд

    ОШИБКА КОМПИЛЯЦИИ ГОВОРИТ
     
  20. qwone

    qwone Гик

    Ну там же пакет, а не один файл. Опять же у меня среда Ардуино 1.8.0. Если меньше, то компиляция не проходит.