#include #include #include #define PIN_INPUT A0 #define PIN_INPUT1 A1 #define PIN_OUTPUT 11 #define PIN_OUTPUT1 9 #define B 3950 // B-коэффициент #define SERIAL_R 100000 // сопротивление последовательного резистора, 100 кОм #define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм #define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм) double Setpoint, Setpoint1, Input, Input1, Output, Output1; double aggKp = 1.3, aggKi = 0.13, aggKd = 0.3; double consKp = 1.1, consKi = 0.13, consKd = 0.25; long lastTimeClick = 0; PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT); PID myPID1(&Input1, &Output1, &Setpoint1, aggKp, aggKi, aggKd, DIRECT); Servo myServo; TroykaButton button(2); void setup() { pinMode( PIN_INPUT, INPUT ); pinMode( PIN_INPUT1, INPUT ); Setpoint = 205; Setpoint1 = 205; myPID.SetMode(AUTOMATIC); myPID1.SetMode(AUTOMATIC); myServo.attach(5); myServo.write(0); button.begin(); } void loop() { button.read(); if (button.isClick()) { myServo.write(179); lastTimeClick = millis(); } if (millis() - lastTimeClick > 7000) { myServo.write(0); } long g = 0; for (int i = 0; i <= 10; i++) { g += analogRead( PIN_INPUT ); } g /= 10; Input = temperatureCalc(g); myPID.Compute(); analogWrite(PIN_OUTPUT, Output); g = 0; for (int i = 0; i <= 10; i++) { g += analogRead( PIN_INPUT1 ); } g /= 10; Input1 = temperatureCalc(g); myPID1.Compute(); analogWrite(PIN_OUTPUT1, Output1); Serial.println("INPUT = " + String(Input) + '\t' + "OUTPUT = " + String(Output) + '\t' + "INPUT1 = " + String(Input1) + '\t' + "OUTPUT1 = " + String(Output1)); } float temperatureCalc(int t) { float tr = 1023.0 / t - 1; tr = SERIAL_R / tr; float steinhart; steinhart = tr / THERMISTOR_R; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= B; // 1/B * ln(R/Ro) steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To) steinhart = 1.0 / steinhart; steinhart -= 273.15; return steinhart; }