Microcontroller code#

⚠️ Code is not yet properly refactored! The used microcontroller is a raspberry pi pico W. However, the code can also be used with any other microcontroller after changing the pico specific parts.

Getting started#

When initially connecting the flashed pico to the power, it will create an access point, which can be accessed using: 192.168.4.1:88. The access point also provides the endpoint /pico/wifi, which lets you set the wifi credentials for your home network. This can be done using a PUT request like so:

curl -X PUT http://192.168.4.1:88/pico/wifi
    -H "Content-Type: application/json" 
    -d '{
          "wlan_pw": "password",
          "wlan_ssid": "ssid"
        }'" 

or by using any other framework to fire http request. When the request was successful and the provided data is correct, the pico should automatically connect to the provided network (A successful connection will be indicated by a permanently shining LED).

On the initial startup, the pico will also write a config.json file, which then stores the config values of the pico configured through the app.

Once the pico is connected to the network provides the following endpoints:

  • GET /pico/health: standard health endpoint, returns status code 200, if the pico is up and running

  • GET /pico/status: returns a frontend/src/model/pico-status-dto.ts holding the current pico time and all the devices with the respective status

  • GET /pico/on: turns the main cycle on, which results in starting the PID control such as starting the heating if necessary

  • GET /pico/brew: Starts the brewing process either single or double depending on the given request parameter

  • DELETE /pico/brew: Forces the stopping of the current brewing process

  • GET /pico/temperature: returns a frontend/src/model/temperature-dto.ts containing the current temperature of the boiler temperature sensor

  • GET /pico/ref-temperature: returns a frontend/src/model/temperature-dto.ts containing the current temperature of the reference temperature sensor

  • GET /pico/config: returns a frontend/src/model/pico-config-dto.ts containing the current config values stored on the pico.

  • PUT /pico/config: accepts a frontend/src/model/pico-config-dto.ts to configure the current pico config. The config values are stored in the config.json file on the pico.

  • GET /devices/status: returns an array of frontend/src/model/device-status-dto.ts containing the status of all the devices connected to the pico.

  • PUT /devices/status: accepts a frontend/src/model/device-status-dto.ts and sets the status of the device on the pico accordingly.

Configuration#

The main configuration variables for an initial setup are already set to proper values and should work out of the box. However, the following can be configured directly in the pico/config.py file. The configurable values are:

basic configuration#

  • print_to_console: if true, the log output of the pico is also printed to the pico’s console

  • main_loop_delay: the wait time between consequent main loop cycles. This has to account for the conversion time of the temperature within the temperature sensor based on the respective sensor resolution

  • pid_pom: If this is set to true, the PID controller uses proportional on measurement, which tries to avoid overshoot. See https://simple-pid.readthedocs.io/en/latest/user_guide.html#proportional-on-measurement for more information.

  • PICO_AP_SSID: The SSID for the pico before it has been connected to any WIFI network

  • PICO_AP_PW: The password to access the access point provided by the pico

  • PICO_HOSTNAME: The hostname under which the pico will show up in the local network

  • mqtt_broker_ip: The IP address of the mqtt broker, if you want to use this feature

  • mqtt_broker_topic: The topic for the messages delivered to the mqtt broker

  • temp_sensor_resolution: The resolution for the temperature sensors. The values can be 9, 10, 11, 12. The main_loop_delay has to be set accordingly. See the following table and the sensor datasheet for more detail.

resolution

conversion time (=main_loop_delay)

9

93.75ms

10

187.5ms

11

375ms

12

750ms

  • The default values for P, I, and D components such as the brewing temperature can also be configured.

  • cold_start_threshold: Temperature threshold for detecting a cold start of the machine (if temp_tank-temp_ref < threshold -> coldstart)

  • cold_start_temp_diff: In case of a detected coldstart the PID values will be reset, when the tank temperature reaches a temperature difference of this value from the brewing temperature temperature

pin configuration#

  • pin_io: The pin number of the pin used to turn on and off the machine

  • pin_pump: The pin number of the pin used to turn on and off the pump (brewing)

  • pin_heat: The pin number of the pin used to turn on and off the heating

  • pin_tank: The pin number of the pin used to determine the sensor status inside the water tank

  • pin_sensor_tank: The pin number of the pin used for the tank temperature sensor

  • pin_sensor_ref: The pin number of the pin used for the reference temperature sensor

PID control#

The PID control works based on the configurable P, I, and D values. Besides, a crude cold-start detection is implemented based on cold_start_threshold and cold_start_temp_diff. These values can only be configured by flashing the PICO software. When the tank temperature has a difference >= cold_start_threshold, a cold start is detected by the software. In this case the machine will keep heating up until the tank temperature is within a range of cold_start_temp_diff from the anticipated brewing temperature and then reset the pid. This results in a pretty smooth temperature curve and very short heating times of the machine up to reaching the anticipated brewing temperature.

Logging#

The logging can take place at two different stages depending on your needs

  • print to the pico console if configured

  • send log messages via MQTT if configured

Any combination of the both is possible.

Further errors are logged to a day specific error.log file in order to help with debugging.