Помогите объединить два и более скетчей в один

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем CasperSimfer, 7 дек 2014.

  1. roni

    roni Нерд

    дает правильно :)
     
  2. roni

    roni Нерд

    ТОЛЬКО НЕ ЗНАЮ КАК БУДЕТ РАБОТАТЬ
     
  3. Alex19

    Alex19 Гуру

    Не понял, компилируется?

    Так, проверьте.
    Должно как в 1 скетче + как в исправленном 2 (2-ой был с ошибками).
     
  4. roni

    roni Нерд

    НЕТ НЕ РАБОТАЕТ
     
  5. roni

    roni Нерд

    У МЕНЯ ПЕРВЫИ СКЕЧЬ РАБОТАЕТ ПРАВИЛЬНО - СКЕЧЬ ДЛЯ СЕРВО ПОДНИМАЕТ И ОТПУСКАЕТ ПУШКУ ВТОРОИ СКЕЧЬ ХОЧЮ ДОБОВЛЯТЬ ДЛЯ ТОГО ЧТОБ КОГДА НАЖЫМАЮ ВТОРУЮ КНОПКУ ПУЛЬТА ПУШКА СТРЕЛЯЕЕТ
     
  6. Alex19

    Alex19 Гуру

    У Вас во 2-ом скетче.

    Он не был рабочим, поэтому правил его. Зачем тогда
    Код (C++):
    if (digitalRead(RECEIVE_PIN) == LOW)
      {
        // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
        eventTime = millis();

        digitalWrite(timer, HIGH);
      }

      // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
      if (millis() - eventTime > 100)
      {
        digitalWrite(timer, LOW);
        digitalWrite(L13, LOW);
      }
     
  7. Alex19

    Alex19 Гуру

    Ладно, у Вас не выпытаешь:), вот код.
    Ваша стилистика сохранена.

    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    unsigned long eventTime = 0;

    //индикация таймера

    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

    }

    void loop() {

      if (digitalRead(RECEIVE_PIN) == LOW)

      // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);

      eventTime=millis(),digitalWrite(timer, HIGH);

      // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)

      if(millis()-eventTime>100) digitalWrite(timer, LOW)

      // и вЫключаем все

      ,digitalWrite(L13, LOW);

      if (irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if (results.value == 0xFDA857 && stepCycle == 0) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);
      }

      if (stepCycle > 0)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }
      else
      {
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }

     
     
  8. roni

    roni Нерд

     
  9. roni

    roni Нерд

    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    unsigned long eventTime = 0;

    //индикация таймера

    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

    }

    void loop() {

      if (digitalRead(RECEIVE_PIN) == LOW)

      // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);

      eventTime=millis(),digitalWrite(timer, HIGH);

      // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)

      if(millis()-eventTime>100) digitalWrite(timer, LOW)

      // и вЫключаем все

      ,digitalWrite(L13, LOW);

      if (irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if (results.value == 0xFDA857 && stepCycle == 0) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);
      }

      if (stepCycle > 0)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }
      else
      {
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }

     
     
  10. roni

    roni Нерд


    КОД НАПИСАН ПРАВИЛЬНО ТОЛЬКО НЕ РАБОТАЕТ
     
  11. Alex19

    Alex19 Гуру

    Последний код, который я прислал, башня опускается подымается?

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

    Мне не нравиться код, читается плохо.
    Код (C++):
    if(millis()-eventTime>100) digitalWrite(timer, LOW)

      // и вЫключаем все

      ,digitalWrite(L13, LOW);
    Пишется так
    Код (C++):
    if(millis()-eventTime>100)
    {
      digitalWrite(timer, LOW);

      // и вЫключаем все

      digitalWrite(L13, LOW);
    }
     
  12. roni

    roni Нерд

  13. Alex19

    Alex19 Гуру

    Ок, сейчас гляну.

    Последний код, который я прислал, башня опускается подымается?
     
  14. roni

    roni Нерд

    ПЕРВЫИ СКЕЧЬ РАБОТАЕТ ТАК НАЖЫМАЮ КНОПКУ FD00FF ПУШКА ПОДНИМАЕТСЯ , ЕСЛИ ВТОРОИ РАЗ НАЖЫМАЮ ПУШКА ОТПУСКАЕТ,

    СЕИЧЯС Я ХОЧЮ ДОБОВЛЯТЬ КНОПКУ FD807F-КОГДА НАЖЫМАЮ ПУШКА СРЕЛЯЕТ КОГДА ОТПУСКАЮ КНОПКУ ПУШКА ОСТАНАВЛИВАЕТСЯ СТЕЛЯТЬ
     
  15. roni

    roni Нерд

    НЕТ ПУШКА ОСТАЕТСЯ НЕПОДВИЖНОИ
     
  16. Alex19

    Alex19 Гуру

    Спасибо.

    Так, попробуйте последний код на сегодня. Если будут проблемы пишите, тогда завтра соберу макет, сегодня не дома, даже ардуины нет.
    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    unsigned long eventTime = 0;

    //индикация таймера

    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

    }

    void loop() {
      // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
      if (digitalRead(RECEIVE_PIN) == LOW)
      {
        // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
        eventTime=millis();
       
        digitalWrite(timer, HIGH);
      }

      //  Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
      if(millis()-eventTime>100)
      {
        //  и вЫключаем все
        digitalWrite(timer, LOW);
        digitalWrite(L13, LOW);
      }
     
      if (irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if (results.value == 0xFDA857 && stepCycle == 0) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
      }

      if (stepCycle > 0)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }

      irrecv.resume(); // Receive the next value
    }

     
    Отпишите, что работает, что нет.
     
  17. roni

    roni Нерд

    БОЛЬШОЕ СПОСИБО
     
  18. Alex19

    Alex19 Гуру

    Пока не за что.

    Вы отпишите, заработает ли башня.
    Завтра часов в 16.00 буду дома, вроде все есть соберу и проверю.
    До завтра.
     
  19. roni

    roni Нерд

    OK До завтра.:)
     
  20. roni

    roni Нерд