ООП в Arduino

Тема в разделе "Arduino & Shields", создана пользователем Vasilisk, 6 июл 2018.

  1. Vasilisk

    Vasilisk Нуб

    Помогите пожалуйста переписать часть кода на ООП, дальше я пойму и разберусь сам. Вырезал все, что не касается данной части кода. Класс calibration должен быть отдельным файлом.

    Код (C++):
    AccelStepper Stepper1(1,25,24);

    int on = 0;
    int dir = -1;
    int calibration_1 = 0;
    int calibration_2 = 0;


    void setup() {
      Stepper1.setMaxSpeed (2000);
      Stepper1.setAcceleration(2000);
    }

    ISR (TIMER1_COMPA_vect) // Функция прерывания таймера
    {
      Stepper1.run();
    }

    void loop() {

      if  (calibration_1 == 0 && on == 1){
        Stepper1.move(100*dir);
      }
      if  (calibration_1 == 1 && calibration_2 == 0){
        calibration_2 = 1;
        dir=1;
        Stepper1.move(calibrationR*dir);
      }
     
  2. Mitrandir

    Mitrandir Гуру

    Вы в курсе, что то что написано в цикле loop никогда не выполнится?

    Так как переменная on всегда равна 0 и первое условие никогда не выполнится.

    calibration_1 всегда равно 0 и второе условие тоже никогда не выполнится.

    И что вы хотите увидеть в классе?
     
  3. b707

    b707 Гуру

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

    И, главное, нафига вам тут ООП? Или это очередная курсовая?
     
  4. Vasilisk

    Vasilisk Нуб

    Я просто не хотел, что бы вам пришлось разбирать весь код и сократил его. Надо допустим вынести всю часть
    Код (C++):
      if  (calibration_1 == 0 && on == 1){
        Stepper1.move(100*dir);
      }
      if  (calibration_1 == 1 && calibration_2 == 0){
        calibration_2 = 1;
        dir=1;
        Stepper1.move(calibrationR*dir);
      }
    В класс. Я посмотрю реализацию и все остальное сделаю. Вот весь код (потом и его буду оптимизировать, для начала в ООП запишу):
    Код (C++):
    #include <AccelStepper.h>
    #include <max6675.h>
    #include <Nextion.h>

    Nextion myNextion(Serial1, 115200);
    MAX6675 thermocouple(30, 32, 31);

    // Двигатель каретки
    AccelStepper Stepper1(1,25,24);

    // Двигатель экструзии
    AccelStepper Stepper2(1,22,23);

    // Двигатель протяжки
    AccelStepper Stepper3(1,27,26);

    // ДВигатель намотки
    AccelStepper Stepper4(1,51,50);


    int debugMessage = 0;

    int pot = A0;
    int on = 0;
    int onn = 1;
    int ont = 0;
    int onb = 0;
    int onp = 0;
    int progress = 0;
    int stepperKatFlag = 0;
    int namotka = 0;
    int calibration_1 = 0;
    int calibration_2 = 0;
    const int buttonPin = 33;
    const int rele = 40;
    long interval = 20;
    long intervalmax6675 = 500;
    long previousMillis = 500; ///////////////////////////////////////////////////////////Разобраться с интервалами!
    long previousMillis2 = 500;
    unsigned long currentMillis = 0;

    int f = 0;
    int calibrationR = 2000; // Расстояние калибровки
    long shagN = 6400; // Оборот катушки
    long StepperTime = 0; // Счетчик шагов катушки
    int KatR = 1; // Счетчик оборотов катушки
    int shag = 150; // Количество шагов каретки на толщину нити
    int shagKol = 5; // Количество диаметров нити на ширину катушки - шагов каретки
    int tempn = 0;
    int temp = 230;
    int spe = 300;
    int spen = 0;
    int spep = 300;
    int page = 0;
    int stepperKat = 0;

    int FlagN = 0;
    int shagK = 0;

    int dir = -1;
    int dir2 = 1;

    void setup() {
      noInterrupts (); // отключить все прерывания
      TCCR1A = 0;
      TCCR1B = 0;
      TCNT1 = 0;
      OCR1A = 125; // сравнить регистр 16 МГц / 256/500 Гц (2ms=125)
      TCCR1B |= (1 << WGM12); // Режим СТС
      TCCR1B |= (1 << CS12); // 256 делитель
      TIMSK1 |= (1 << OCIE1A ); // включить таймер сравнить прерываний
      interrupts(); // включить все прерывания

      Serial.begin(9600);
      Serial1.begin(9600);
      myNextion.init();
      myNextion.sendCommand("baud=115200");
      Serial1.end(); // закрытие порта
      Serial1.begin(115200); // открытие порта на новой скорости
      myNextion.sendCommand("baud=115200");

      pinMode(pot, INPUT);
      pinMode(buttonPin, INPUT);
      pinMode(rele, OUTPUT);
      Stepper1.setMaxSpeed (2000);
      Stepper1.setAcceleration(2000);
      Stepper2.setMaxSpeed(2000);
      Stepper3.setMaxSpeed(2000);
      Stepper4.setMaxSpeed(2000);
      Stepper4.setAcceleration(2000);



    }

    ISR (TIMER1_COMPA_vect) // Функция прерывания таймера
    {
      if(digitalRead(buttonPin)==1){
        calibration_1 = 1;
      }

      Stepper1.run();

      if (onb == 1){
        Stepper2.runSpeed();
      }

      if (onp == 1){
        Stepper3.runSpeed();
      }

      if (onn == 1 && spen > 0){
        Stepper4.move(1);
      }
      Stepper4.setSpeed(spen);

      Stepper4.run();



    }

    void loop() {

    // Калибровка каретки направляющей нити намотки

      if  (calibration_1 == 0 && on == 1){
        Stepper1.move(100*dir);
      }
      if  (calibration_1 == 1 && calibration_2 == 0){
        calibration_2 = 1;
        dir=1;
        Stepper1.move(calibrationR*dir);
      }









    // Намотка нити




      if(Stepper4.targetPosition()>=StepperTime+shagN){
          StepperTime = StepperTime+shagN;
          KatR++;
          // Работа каретки направляющий нити намотки
          Stepper1.move(shag*dir2);
          shagK++;
          if (shagK >= shagKol){
            shagK = 0;
            dir2 = dir2*-1;
          }
        }





      // Установка скорости экструзии
      Stepper2.setSpeed(spe);

      // Установка скорости протяжки
      Stepper3.setSpeed(spep);


      // Управление скоростью намотки
      if (analogRead(pot)>450){
        spen = 15*(analogRead(pot)-450);
      }
      else{
        spen = 0;
      }




      // Управление температурой

      if (ont == 1 && tempn<temp){
        digitalWrite(rele, HIGH);
      }
      else {
        digitalWrite(rele, LOW);
      }



      // Работа с экраном

      String message = myNextion.listen(); //check for message
      // Запуск станка
      if(message == "65 0 2 1 ffff ffff ffff"){ // if a message is received...
        on = 1;
        ont = 1;
        page = 1;
      }
      // Настройки температуры и скорости экструзии
      else if(message == "65 1 4 1 ffff ffff ffff"){ // if a message is received...
        page = 2;
      }
      // Выход из настроек температуры и скорости экструзии
      else if(message == "65 2 6 1 ffff ffff ffff"){ // if a message is received...
        page = 1;
      }
      // Запуск экструзии
      else if(message == "65 1 3 1 ffff ffff ffff" && calibration_2 == 1 && tempn>=temp){ // if a message is received...
        onb=1;
      }
      // Температура +1
      else if(message == "65 2 2 1 ffff ffff ffff"){ // if a message is received...
        temp = temp - 1;
      }
      // Температура -1
      else if(message == "65 2 4 1 ffff ffff ffff"){ // if a message is received...
        temp = temp + 1;
      }
      // Скорость экструзии +
      else if(message == "65 2 3 1 ffff ffff ffff"){ // if a message is received...
        spe = spe - 50;
      }
      // Скорость экструзии -
      else if(message == "65 2 5 1 ffff ffff ffff"){ // if a message is received...
        spe = spe + 50;
      }
      // Настройка скорости прокатки
      else if(message == "65 1 5 1 ffff ffff ffff"){ // if a message is received...
        page = 3;
        onp = 1;
      }
      // Скорость прокатки + 1
      else if(message == "65 3 3 1 ffff ffff ffff"){ // if a message is received...
        spep = spep + 1;
      }
      // Скорость прокатки - 1
      else if(message == "65 3 2 1 ffff ffff ffff"){ // if a message is received...
        spep = spep - 1;
      }
      // Страница прогресса
      else if(message == "65 3 4 1 ffff ffff ffff"){ // if a message is received...
        onn = 1;
        page = 4;
      }
      //
      //
      if(message != "" && debugMessage == 1){ // if a message is received...
        Serial.println(message); //...print it out
      }


      currentMillis = millis();

      if (currentMillis - previousMillis2 > intervalmax6675){ // Вместо 10000 подставьте нужное вам значение паузы
        previousMillis2 = currentMillis;
        tempn = thermocouple.readCelsius();
              Serial.println(Stepper4.targetPosition());
    //    Serial.println(digitalRead(buttonPin));
    //    Serial.println(tempn);
    //      Serial.println(shagK);
    }
       
        //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval) {
        if (debugMessage == 1){
          Serial.println(page); //...print it out
        }
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
        if (FlagN == 0){
          if (page == 1){
            myNextion.setComponentText("t0", String(tempn));
            Serial.println(tempn); //...print it out
          }
        FlagN = 1;
        }
        else if (FlagN == 1){
          if (page == 2){
            myNextion.setComponentText("t1", String(temp));
          }
        FlagN = 2;
        }
        else if (FlagN == 2){
          if (page == 2){
            myNextion.setComponentText("t2", String(spe));
          }
        FlagN = 3;
        }
        else if (FlagN == 3){
          if (page == 3){
            myNextion.setComponentText("t3", String(spep));
          }
        FlagN = 4;
        }
        else if (FlagN == 4){
          if (page == 4){
            myNextion.setComponentText("t4", String(progress));
          }
        FlagN = 0;
        }
      }
    }
     
  5. Vasilisk

    Vasilisk Нуб

    Пытался сделать как-то так:
    Код (C++):
    class Carriage{

        void calibration(int calibration_1, int on, int calibrationR, int calibration_2){
              if  (calibration_1 == 0 && on == 1){
                StepperCarriage.move(100*-1);
              }
              if  (calibration_1 == 1 && calibration_2 == 0){
                calibration_2 = 1;
                StepperCarriage.move(calibrationR*1);
              }
              return calibration_2;
        };

    };
    Но StepperCarriage в объекте недоступен. В общем опыта нет, сделайте правильно, а дальше я сам.
     
  6. Mitrandir

    Mitrandir Гуру

    Ну так передайте ссылку на StepperCarriage в класс через конструктор
     
  7. b707

    b707 Гуру

    Василиск, вы процедуру с классом не путаете? Что мешает ваш void calibration() просто вынести в другой файл. без всяких классов?
     
  8. Vasilisk

    Vasilisk Нуб

    Хочу сразу нормально сделать, что бы потом продолжить разработку.
    Можно примерчик?
     
  9. Mitrandir

    Mitrandir Гуру

    Код (C++):
    class Carriage{
      private:
        AccelStepper *myStp;
      public:
        Carriage(AccelStepper *stp) {
          this-> myStp= stp;
    }
        void calibration(int calibration_1, int on, int calibrationR, int calibration_2){
              if  (calibration_1 == 0 && on == 1){
                this->myStp->move(100*-1);
              }
              if  (calibration_1 == 1 && calibration_2 == 0){
                calibration_2 = 1;
                this->myStp->move(calibrationR*1);
              }
              return calibration_2;
        };

    };
     
  10. Mitrandir

    Mitrandir Гуру

    Как можно сделать нормально, если не знаете как пользоваться инструментом?
     
  11. Vasilisk

    Vasilisk Нуб

    'AccelStepper' does not name a type

    Да, вы наверное правы. Сделаю пока как b707 предложил. Когда будет время, буду разбираться.
     
  12. parovoZZ

    parovoZZ Гуру

    А классы в МК - они для чего???
     
  13. Mitrandir

    Mitrandir Гуру

    Для организации кода, но вот в плане эффективности работы они имхо только навредят
     
  14. qwone

    qwone Гик

    При ООП надо 1- грамотно описать техническую задачу 2- грамотно спроектировать программу 3- разумеется руководствуясь результатами 1 и 2 написать код. Опять же ООП это написание программы сверху-вниз, но ни как не снизу-вверх( "начать писать код а потом война план подскажет").
    И да в этой теме я не наблюдаю грамотно написанную техническую задачу.
     
    parovoZZ и Mitrandir нравится это.