First I'd start the tuning process just using P term. Find the value at which oscillation is triggered and back off 25% or so. This sets a basic loop gain.
Then start increasing I (probably only a tiny bit is needed for I), until instability starts again.
Back off P and I say 10% each, that'll probably give fairly close control, but may be rather slow to heat up.
Adding D allows faster convergence (you have to add D, then see if P can be increased while maintaining
stability). The D term allows higher loop gain without overshooting so much - ie more rapid heating at start up.
You may not care about this for this application.
Too much D will lead to random fluctuations dominating, knock it back if that happens.
Basically fiddle with the parameters for the best performance (edge of stability), then take the values down a small amount to stop any tendency to oscillate.
Too much I will cause oscillation, too little will mean very slow convergence to exact final temperature.
I = 0 means the set point will never be reached, the error cannot be driven down to zero without I.
Too much D will cause random fluctuations, too little gives less performance than optimal.
Too much P will cause oscillation, too little will mean slower change, and if I=0 will mean more temperature
error at steady state.
Thermal control has some extra issues - usually heating and cooling have different rates - this is a form of non-linearity, which means control is more difficult. You will need a PID library that supports some form of integral-wind-up limiting. (You almost always need this, its seldom mentioned in introductory explanations of PID control).
Its also very time-consuming to tune, because everything is so slow (compared to motor controller PID).
(BTW what temperature sensor are you using? It needs to have a resolution well below 0.2C)