Подскажите пожалуйста Смогу ли я по примеру приведенному здесь управлять двумя серво с двух разных датчиков ( второй датчик у меня DHT) справиться ли библиотека PID_v1.h с такой задачей? Что нужно для этого предпринять? Рассматриваются возможности поочередного управления Например поставив флаги пока обрабатывается один датчик второй бездействует. Или же может такой вариант завести второй регулятор Код (C++): double Setpoint2, Input2, Output2; PID myPID2(&Input2, &Output2, &Setpoint2,1,0.4,90, DIRECT); Будет ли работать такой вариант? Если возможно такое объясните пожалуйста что нужно добавить ? Код (C++): //Автомобильный климат контроль, по принципу управления заслонкой //www.bigbarrel.ru #include <Servo.h> #include <PID_v1.h>//пид регулятор #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float tempC;//текущая температура float temp_old = 0;//старое значение текущей температуры int val; //угол поворота мотора int val_old;//старый угол поворота мотора Servo myservo;//серво привод double Setpoint, Input, Output;//переменные для пид регулятора PID myPID(&Input, &Output, &Setpoint,1,0.4,90, DIRECT);//пид регулятор. Очень важно правильно подобрать коэффициенты пид регулятора void setup() { sensors.begin(); myPID.SetOutputLimits(1, 255);//устанавливаем пределы для выходного сигнала пид регулятора myservo.attach(3,2540,640);//устанавливаем пин управления servo/устанавливаем границы поворота сервы val_old=-100; } int sp(){ return map(analogRead(1),255,1023,15,27);//читаем положение регулятора температуры(потенциометр) } void loop() { if (digitalRead(1)==HIGH){ sensors.requestTemperatures(); tempC =sensors.getTempCByIndex(0); //получаем температуру с датчика if (abs(tempC-temp_old)>0.1){ Input = tempC; temp_old=tempC; } else { Input=temp_old; } if (Setpoint!=sp()){ Setpoint=sp(); } myPID.Compute(); delay(20); if (!Output==0.00){ val=map(Output, 1, 255, 0, 180); if (abs(val-val_old)>4){ val_old=val; myservo.write(val);//управляем мотором delay(200); } }else{ val=val_old; } } else { delay(10000); } }
Код проверил по второму варианту компилируется но будет ли работать нормально? Проверить не могу пока так как нет ардуинки.
С данной библиотекой не знаком, PID обычно делаю сам. Но, судя по всему, никто не мешает сделать несколько экземпляров класса, как это обычно делается в таких случаях. И работать они должны независимо и одновременно. Впрочем, гарантировать не могу, результат сильно зависить от кривизны библиотеки.