Introduction: Hot Plate Automatic Control System (HPACS)

This project aims at providing a simple intuitive way of understanding how to do Automatic PID tuning using a heater. What I have made is based on the Åström–Hägglund method for deriving parameters using bang-bang control to reveal system characteristics and subsequenctly chose parameters based on this knowledge. There is nothing secret to it and info can be found here: And for chosing parameters you can read a bit here:

To make it nice a Nextion 3.2" HMI interface is added for user input and displaying different variables real-time. BUT I also made a Serial terminal version of the library which makes the project way cheaper !

The real background story is that partly I promised my dad to make a temperature control for melting bees wax, partly I wanted to refresh my basic control theory and finally I wanted to look into auto tuning of PID controllers. On the side I also managed to use it for Sous Vide making nice steaks and Bearnaise sauce as part of the testing !


I am working with 230 V here which is dangerous if you do not know what you are doing ! I am an electrician and electronics engineer so I have some experience here - but DO NOT work with 230 V if you are not comfortable with it and take great care not to touch live wires ! Also, beware of the cheap SS-relays with regards to possible fire hazard as this has been seen by some people (not by me though).


  • A cheap WASCO Hot Plate (could be a better one - e.g. an Ikea induction plate)
  • A cheap SS-relay
  • A Dallas onewire temperature sensor
  • An Arduino Mega
  • (Optional) A Nextion 3.2" HMI interface/display
  • 5V power supply for the Arduino

Step 1: Assembly

I only built an enclosure for the HMI version of the project since this is what I ended up using. So, I made an enclosure for fitting relay, HMI and Arduino. I also made a clamp for the temperature sensor just because I could...

Step 2: Coding

All the code for HMI and Arduino is available at my Git repo for the project.

I commented a lot in the code to try making it easier to read and understand. But essentially I set up a really slow PWM for the hot-plate and a timer interrupt for the state-machine/control and that is really it.

Then there is of course the tuning routine and the control itself + HMI or Serial interface...

I do something that I'm not a big fan of in this code, and that is to use serial print in a timer interrupt. Serial print takes a lot of time and should really be avoided in a timer interrupt...

The tuning works as follows:

  1. Set PWM duty cycle to 40%
  2. Wait until setpoint temperature is reached
  3. Set PWM duty cycle to 0%
  4. Wait until temperature is below setpoint
  5. Repeat step 1-4 until e.g. 3 periods with almost same time and amplitude is seen
  6. Calculate paraemters for PID based on the above

Pretty simple ;)

Step 3: Testing !

Now that the coding is done its time for testing. In the former section I showed the tuning graphically from a test - so for that there's not much left to say. But a couple of tests using the obtained parameters is shown here.