unsigned long millisPre=0;
unsigned long millisPreLoop;
unsigned long millisDelay=1000;
unsigned long millisCycle=5000;
int P,I,D,U,Kp,Ki,Kd;
int degSet,degCur;
int preP,duty,dt;
int pinRelay=A2;
boolean stateHeat=0;
unsigned long millisPreCycle;
void setup() {
Serial.begin(115200);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,OUTPUT);
}
void loop() {
if(digitalRead(A1)==0){
stateHeat=!stateHeat;
delay(200);
}
if(millisPre+millisDelay<millis()){
Serial.print("display");Serial.println(stateHeat);
millisPre=millis();
}
PID();
}
void PID(){
if(stateHeat==1){
if(millisPre+millisDelay<millis()){
Serial.print("ON");
dt=(millis()-millisPre);
P=degSet-degCur; //偏差電圧をPに代入 5Vmax
I=I+((degSet-degCur)*dt);// 5Vmax
D=(P-preP)*dt;
preP=P;
U=(Kp/10*P)+(Ki/10*I)+(Kd/10*D);//あくまでKpは意味のない定数なので、5Vmaxを255に変換する必要はない。
duty=duty+U;//本チャンはこれに戻す
//Serial.print(",U=");Serial.print(U);//この行を有効にしたらLoop動かない
Serial.print(",duty=");Serial.print(duty);
Serial.print(",P=");Serial.print(P);
Serial.print(",I=");Serial.print(I);
Serial.print(",D=");Serial.println(D);
if(duty>100){
duty=100;
}
if(duty<0){
duty=0;
}
if(millisPre+(millisCycle*duty/100)){//duty分のON時間が過ぎてないとき//ってことは頻繁にPIDに入らないとできない。
digitalWrite(pinRelay,HIGH);
}
else{//duty分のON時間が過ぎた時
digitalWrite(pinRelay,LOW);
degCur=degCur-10;
}
millisPreCycle=millis()/1000;
}
}
else{
}
}