Многозадачность на Arduino

Тема в разделе "Arduino & Shields", создана пользователем ImrDuke, 19 дек 2016.

  1. ImrDuke

    ImrDuke Гик

    Каким образом можно во время исполнения программы менять интервал?

    Код (C++):
    #include <Servo.h>
    class Sweeper
    {
      Servo servo; // сервопривод
      int pos; // текущее положение сервы
      int increment; // увеличиваем перемещение на каждом шаге
      int updateInterval; // промежуток времени между обновлениями
      unsigned long lastUpdate; // последнее обновление положения
      public:
      Sweeper(int interval)
      {
        updateInterval = interval;
        increment = 1;
      }
      void Attach(int pin)
      {
        servo.attach(pin);
      }
      void Detach()
      {
        servo.detach();
      }
      void Update()
      {
        if((millis() - lastUpdate) > updateInterval) // время обновлять
        {
          lastUpdate = millis();
          pos += increment;
          servo.write(pos);
          Serial.println(pos);
          if ((pos >= 180) || (pos <= 0)) // конец вращения
          {
            // обратное направление
            increment = -increment;
          }
       }
    }
    };
    Sweeper sweeper1(15);
    void setup()
    {
      Serial.begin(9600);
      sweeper1.Attach(9);
    }
    void loop()
    {
      sweeper1.Update();
    }
     
  2. qwone

    qwone Гик

    не понял. Расскажите что вы хотите сделать?
    Если вы решились занятся многопоточным программированием , расписывайте код внятне.
    да и реализацию функций класса выведете из самого класса.
     
    Последнее редактирование: 19 дек 2016
  3. Igor68

    Igor68 Гуру

    Простите!... а где многозадачность???
     
  4. ostrov

    ostrov Гуру

    Видимо подразумевается, что таких экземпляров класса можно сделать несколько и дергать их по очереди. Но вряд ли это можно назвать многозадачностью.
     
    Igor68 нравится это.
  5. ImrDuke

    ImrDuke Гик

    Sweeper sweeper1(15); можно вместо "15" в цикле менять значение?
    Я прекрасно понимаю что это не многозадачность.

     
  6. ostrov

    ostrov Гуру

    Я бы сделал переменную в классе которую бы менял снаружи если что, например так: sweeper1.pause = 10;
     
  7. rkit

    rkit Гуру

    Опять "напишите за меня элементарный код"
     
  8. rkit

    rkit Гуру

    Выведите соответствующую переменную в публичные, да изменяйте замечательным оператором "="
     
  9. ImrDuke

    ImrDuke Гик

    В каком месте я так написал? Я спросил как грамотно изменять переменную во время выполнения программы.
     
  10. ostrov

    ostrov Гуру

    Вот сюда:
    Код (C++):
     public:
      Sweeper(int interval)
      {
    добавить например unsigned int pause;
     
  11. rkit

    rkit Гуру

    Да. Вот просто спросили вещь, которую рассказывают в первые пять минут введения в язык.
     
  12. qwone

    qwone Гик

    Вот поправил (для своего понимания ваш код).
    Код (C++):

    /*
    серво ->15 (servo_pin)
    */

    #include <Servo.h>
    class Cl_Sweeper {
      private:
        Servo servo; // сервопривод
        int pos =0      ; // текущее положение сервы
        const int pos_min=0;
        const int pos_max=180;
        int step_pos=10 ; // величина шага поворота сервы
        int time_interval; // промежуток времени между обновлениями 200 милисек
        unsigned long past = 0; // последнее обновление положения
      public:
        Cl_Sweeper(int interval);
        void Attach(int pin) ;
        void Detach() ;
        void STEP() ;
    };
    Cl_Sweeper::Cl_Sweeper(int time) {
      time_interval = time;
      step_pos = 0;
    }
    void Cl_Sweeper::Attach(int pin) {
      servo.attach(pin);
    }
    void Cl_Sweeper::Detach() {
      servo.detach();
    }
    void Cl_Sweeper::STEP() {
      if ((millis() - past) > time_interval) { // если пришло время
        past = millis(); // сохранить его
        pos += step_pos; // сделать шаг
        if ((pos >= pos_max) || (pos <= pos_min)) { // конец вращения
          step_pos = -step_pos; // обратное направление
          pos += step_pos;
        }
        servo.write(pos); // поставить серву
        Serial.println(pos); // отправить положение
      }
    }
    //#1
    const int servo_pin = 9; // нога серво
    const int time = 200; // временной шаг сервы
    Cl_Sweeper Sweeper1(time);
    void setup() {
      Serial.begin(9600);
      //#1
      Sweeper1.Attach(servo_pin);
    }
    void loop() {
      //#1
      Sweeper1.STEP();// сделать шаг
    }
     
    Ну а дальше надо вводить еще один поток, с помощью которого вы будете управлять сервой
     
    ImrDuke нравится это.
  13. ImrDuke

    ImrDuke Гик

    Согласитесь это немного разные вещи, написать целиком программу или подсказать один нюанс?..
     
  14. ostrov

    ostrov Гуру

    Вот упрощенный вариант для понимания:
    Код (C++):
    class PoD {
        unsigned long timerPrint;
        public: unsigned int pause;
        void Update (byte a) {
          if (millis() > timerPrint) {
            Serial.print(a);
            Serial.print(" - ");
            Serial.println("yes");
            timerPrint = millis() + pause;
          }
        }
    };

    PoD t1;
    PoD t2;

    void setup() {
      Serial.begin(9600);
      // put your setup code here, to run once:
      t1.pause = 500;
      t2.pause = 2500;
    }

    void loop() {
      // put your main code here, to run repeatedly:
      t1.Update(1);
      t2.Update(2);
    }
    Если в теле программы менять t1.pause, то будет меняться и частота выполнения условия в классе.

    Впрочем, в вашем случае мне кажется использование класса не вполне оправданным, мне кажется проще и нагляднее было бы сделать простой автомат для нескольких задач.
     
    ImrDuke нравится это.
  15. ImrDuke

    ImrDuke Гик

    Этот кусок кода я привел для примера. У меня задача не с сервоприводом связана - делаю контроллер для аквариума. А это было для понимания как реализовать рассвет-закат.
     
  16. rkit

    rkit Гуру

    "Как изменять переменную" - это теперь нюанс. Ладно, как скажете. Ответ был дан.
     
  17. ImrDuke

    ImrDuke Гик

    Внутри класса - да.

    Всем спасибо, работает так, как я хотел.
     
  18. qwone

    qwone Гик

    Многопоточность используется для упрощеного совмещения разнородных скетчей, но есть 2 нюанса.
    1 совмещать можно скетчи которые организованы для такого совмещения. Что попало совмещать не получится. 2 этот прием очень сложен если во многом не разбираешься.
     
  19. ImrDuke

    ImrDuke Гик

    Пока получается. Показывает температуру, время и плавно зажигаются светодиоды.
     
  20. qwone

    qwone Гик

    Скорее всего у вас "неявная" многопоточность. Многопоточность она больше для программистов, для лучшего понимания работы в сложных программах. С точки зрения процессора, то он тупо выполняет код.