Original posts including reverse engineering here:



State of the project: pending deployment, some important details are missing:

  • what's the water temperature used by the original system?
  • I don't have a functioning heater/boiler anymore - used the working one for a repair

Hardware - mostly stock, I'm just putting in the MSP430 chip and a regulator. I kept the original board and removed the uC and EEPROM chips.

  • three buttons: power, 1 coffee, 2 coffees
  • the power button has a small red LED circle around it
  • heater controlled via an SCR
  • NTC thermistor inside the heater is sampled through a voltage divider
  • water sensor is a hall type sensor that detects the floater position inside the water tank
  • water pump is controlled via a small transistor


  • while line voltage is on but the machine is powered off the user can enter service modes via button combinations
  • upon powering on the machine starts heating the water, displaying on the LED how hot the water is (PWM)
  • if the user requests a coffee, the machine changes is blinking pattern and starts making a coffee once the water is heated
  • if there is no water in the tank there is a faster blinking pattern
  • if no user input is detected for 30 minutes the machine goes to power off state
  • a lot of other safety stuff and under the hood stuff that you kind of expect to work


The original machine annoyed me (and my work mates) for various reasons:

  • once plugged in, it stayed off, so if you used a remote outlet you have to physically move yourself to power on the machine, making the remote outlet kind of useless
  • heating the water takes quite a lot of time (90s) and you cannot request a coffee in advance
  • that 90s seems like forever because you have no indication how far you are from the target temperature; the led just blinks and then settles to an ON state
  • if left unused for a while, the boiler temperature goes down quite a lot; this makes the next coffee colder than normal

Things to do after real-world testing is complete:

  • the 2 coffee button is not implemented yet, not sure it is needed. Two presses of the other button achieve exactly the same thing and the water does not cool so much
  • LPM3/4. Probably not needed, but I will test initially with a separate battery supply.
  • water quantity calibration via a service mode. You should be able to increase/decrease the pump duration in 1 second increments via a service mode and the value saved in flash. The original chip did this
  • add a jumper or some kind of configuration mode where you can have the machine prepare a coffee once it's powered on, for remote controlled outlet usage

Code and 'schematic', written for the Energia framework:

 * // LEGEND: < from pin = digital output
 * //         > to pin = digital input
 * //         ^ pullup
 * //         $ analog
 * //         % pwm
 * //
 * //                MSP430G2231 - on launchpad
 * //             -----------------               ^
 * //            |VCC           GND|             /|\
 * //            |                 |              |
 * //  PWRLED  %<|P1.0/A0/LED   XIN|<^P2.6 CAFBTN |
 * //            |                 |              |
 * //            |P1.1/A1 TXD  XOUT|>P2.7 HEATER  |
 * //            |                 |              |
 * //            |P1.2/A2 RXD  TEST|              |
 * //            |                 |              |
 * //  CAF2BTN ^>|P1.3/A3 S2   nRST|------------- /
 * //            |                 |
 * // NTC/1.8k $>|P1.4/A4   A7/P1.7|< WATERSNS
 * //            |                 |
 * //  PWRBTN  ^>|P1.5/A5   A6/P1.6|> PUMP (LED2)
 * //             -----------------
// NTC is 0.77k@93C in divider configuration with 1.8k so boiling voltage is less than Vcc*1.8/(1.8+0.77)=0.7*Vcc
// this means that for 3.3V going into divider the boiling point value is > 0.7*1024 = 717;
// 87C is about 0.643*Vcc (658) so cca 58 ADC points hysteresis
// pump debit is marked 2L/min but this does not seem right
//#define DEBUG_ON 1
#include <Energia.h>

static const uint8_t PWRLED = P1_0;
static const uint8_t CAF2BTN = P1_3;
Read more »