Arduino · Automation · Espresso · Gravimetric · Hack · volumetric · Zhng

Gravimetric espresso mod – project updates #1

After a long hiatus, I finally found some time to update this blog. I’ve been really busy with multiple projects. Few of the projects are coffee gadgets related which I shall unveil when they near ready.

Today I’d like to share the progress of the espresso machine mod I mentioned in an earlier post Espresso Machine Zhng. My home espresso machine is now capable of gravimetric espresso extraction, and it can be programmed easily through an mobile app. Like all good experiment report, I shall start with the problem statement.

Problem statement: My home espresso machine, the Bezzera BZ13 is manual push-button machine. It is reliable for home usage but it is primitive and lacks features. Higher-end machine comes with programmable feature which allows limited espresso recipe to be dialed-in. These recipes are either based on extraction time or volume of water which flowed through the pump. Ben Kaminsky highlighted in this article that weight-based dosage produces more consistent coffee vs time-based dosage. Matt Perger conducted similar experiment in a busy cafe setting and the video can be found here.

Solution: To implement a low-cost weight-based dosage feature into home machine which is programmable through an mobile app, hence the espresso recipe will be virtually limitless.

The following images show the interfaces of the espresso controller mobile app I wrote. The image on the left shows the flow rate, espresso extracted and the total volume of water used in extraction. The graph gets updated in real-time during extraction and the extraction profile can be saved for reference. I’ll get a video demo up when i’ve the time. The image on the right shows the interface which allows the espresso dosage and target brew ratio to be dialed in.


When I started the project, I was using 2 flow sensors shown in the following diagram. Similar to espresso machines marketed with the ‘volumetric dosing’ feature, flow sensors are used to detect the espresso yield, either at the pump in-let or group head. For cost-reason and the fear of working directly with high heat high pressure, I opt-ed for flow sensors in the pump inlet and OPV outlet.

Flow sensor 1 measures water the pump draws, and flow sensor 2 measure the water that returns to the tank through the over pressure valve (OPV)

The flow sensor has a impeller which spins when water flows through it.

Image credit:

The impeller generates pulses when it spins and the number of pulses were collected to measure the volume of water which went into the coffee. The pulses to extraction ratio are different for each unique blend of coffee, and I wanted something which works for all coffee and does not require re-calibration of the pulses to extraction ratio, hence, a scale was added to the project. Alternatively, I could have measured the flow-rate in the group head instead of from the pump in-let, however, such flow meters are not cheap.. and too hot to deal with 😐

Once the target weight is detected by the scale, the pump will be cut-off electronically by the relays. The flow sensors are now used to indicate the start of the extraction and the data collected from them are shown in the mobile app (red coloured chart). It can be useful for flow-rate profiling too (separate mod for another project).

Flow sensors and the relay are physically wired to the Arduino microController. While the weighing scale talks to the microController wirelessly
Relays (blue boxes) connected in-line to the pump on/off push-button

This is the first iteration of the minimalist scale which is wired to the controller. It is self-made too, and I’d have used an Acaia if it is developer friendly.

The load cell (weight sensor) is protected by a piece of thick 5mm acrylic which is pretty heat resistant. This is important as the load cell’s reliability can be affected by temperature changes.


And the current version which is wireless though not so minimalist now.


The hardware controller is powered by Arduino microController which talks to mobile app via Bluetooth. Nordic transceivers are used for wireless communication between the microController and the scale.

I am now in the process of fabricating drip-proof enclosure for the scale. Hopefully I can get the third iteration of the scale soon and then the video demo will be available πŸ™‚

Updates: This is how the fourth iteration of the scale + mobile app looks like


So much for the short updates, please do share with me ideas or features you would like to see available πŸ™‚

8 thoughts on “Gravimetric espresso mod – project updates #1

  1. Hi, great hack I’m looking at doing something similar but I can’t work out how you or if you are dealing with the problem of lag time of the espresso flow.
    From my experience when the target weight is reached the pump switches off but with most machines you can get a lag of up to 2g more yield after the pump switches off. An obvious answer is to role back your target weight by say 2g if that what it is over by on average but to me if this is the case I may as well carry on using volumetrics as they are usually accurate between 0.5 to 1g. Of course for home machines with no volumetrics this is great but for commercial use which is why I’m looking at this application it would need to be accurate to 0.5g tollernce. If the software could correct it self to hit target weight that would be the ticket in my opinion.


    1. Hi Paul, Thank you for your kind words πŸ™‚
      Yea i guess there are few ‘hacks’ around the yield accuracy, the offset technique is used by one of the big named machine i think? The system i’ve been developing has been able to get me within 0.1x to 0.05x brew ratio accuracy, not exactly 0.5 to 1g accuracy. Meaning for 18g input with target ratio of 1:2 (36ml target yield), i can consistently get output between 35.1ml to 36.9ml. I think its good enough as compared to human operating the machine πŸ™‚

      Here are some techniques i’ve used which i think helped in accuracy.
      1. Use a fast scale, mine is as fast as the A**** scale πŸ˜‰
      2. Shut the pump before target yield is met. I use the data from the flow sensors to ‘predict’ when to shut the pump, even before the yield is met.

      Very good question on Volumetric vs Gravimetric. I started the project with volumetric but soon found to be inaccurate, as the relative ‘total water flow’ does not translate to the target yield, especially so when I change to complete different blend/bean. This is likely due to the flow sensor configuration. I have a flow sensor between the pump and water-tank, and another one at the OPV outlet (diagram in blog post), which does not factor for water retention in the ground and and lost due to heat. The commercial machines have the flow sensor in the group-head instead which is much more accurate. Those high heat high pressure rated flow sensor cost alot more compared to the simpler one i’ve been using.

      There are some domestic machines with ONE flow sensor between the water-tank and pump and sold as ‘Volumetric’. They do not factor the water lost in the OPV too, I have no idea how easy/hard it is to dial in especially if we change beans type all the time πŸ™‚


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s