Помогите пожалуйста переписать часть кода на ООП, дальше я пойму и разберусь сам. Вырезал все, что не касается данной части кода. Класс 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); }
Вы в курсе, что то что написано в цикле loop никогда не выполнится? Так как переменная on всегда равна 0 и первое условие никогда не выполнится. calibration_1 всегда равно 0 и второе условие тоже никогда не выполнится. И что вы хотите увидеть в классе?
В чем вам нужна помощь? В этом коде никаких обьектов нет, из чего вы собрались свой класс городить? И, главное, нафига вам тут ООП? Или это очередная курсовая?
Я просто не хотел, что бы вам пришлось разбирать весь код и сократил его. Надо допустим вынести всю часть Код (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; } } }
Пытался сделать как-то так: Код (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 в объекте недоступен. В общем опыта нет, сделайте правильно, а дальше я сам.
Василиск, вы процедуру с классом не путаете? Что мешает ваш void calibration() просто вынести в другой файл. без всяких классов?
Код (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; }; };
'AccelStepper' does not name a type Да, вы наверное правы. Сделаю пока как b707 предложил. Когда будет время, буду разбираться.
При ООП надо 1- грамотно описать техническую задачу 2- грамотно спроектировать программу 3- разумеется руководствуясь результатами 1 и 2 написать код. Опять же ООП это написание программы сверху-вниз, но ни как не снизу-вверх( "начать писать код а потом война план подскажет"). И да в этой теме я не наблюдаю грамотно написанную техническую задачу.