Arduino firmware for a Kyoto-style cold drip coffee maker, controlling drip timing via a solenoid valve. Originally written in 2018, modernized in 2026 for current Arduino toolchain and library compatibility.
Inspired by the cold drip coffee machine at Ada's Technical Books and Cafe in Seattle, WA.
- Adjustable drip duration and drip rate via the LCD shield buttons
- Persistent backlight color preference stored in EEPROM
- Simple menu system for configuration
- Supports continuous flow or timed drip modes
| Qty | Item | Source |
|---|---|---|
| 1 | Yama Glass Kyoto-style Cold Drip Coffee Tower | Amazon |
| 1 | Arduino Uno (or compatible) | Adafruit #50 |
| 1 | Adafruit RGB LCD Shield (16x2 with keypad) | Adafruit #714 |
| 1 | Adafruit Motor Shield V2 | Adafruit #1438 |
| 1 | 12V 1A DC Power Supply | Adafruit #798 |
| 1 | 12V quiet solenoid valve | Ada's Technical Books |
This project uses two stackable Adafruit shields, so no breadboard is required. The shields plug directly onto the Arduino Uno headers and share the I2C bus. Below is a detailed pin-level diagram showing every electrical connection.
Layer 3 (top): RGB LCD Shield (Adafruit #714)
Layer 2 (middle): Motor Shield V2 (Adafruit #1438)
Layer 1 (bottom): Arduino Uno
12V DC Power Supply
===================
(+) ─────────────────────────────────────┐
(-) ──────────────────────────────────┐ │
│ │
SOLENOID VALVE (12V) │ │
==================== │ │
Wire A ──────────────────────────┐ │ │
Wire B ──────────────────────┐ │ │ │
│ │ │ │
┌──────────────────────────────────┼───┼────┼───┼──────────────────────────┐
│ ADAFRUIT MOTOR SHIELD V2 (I2C addr: 0x60) │
│ │
│ Blue Screw Terminals: │
│ ┌─────────────────────────────────────────────┐ │
│ │ EXT PWR(-)──┤GND├── EXT PWR(+)──┤+12V├── │ <── 12V PSU connects │
│ └──────────────┼──────────────────────┼───────┘ here │
│ │ │ │
│ ┌─────────────────────────────────────────────┐ │
│ │ M1(-)──┤TB6612├──M1(+) │ <── Solenoid connects │
│ └───┼──────────────────┼──────────────────────┘ here │
│ │ │ │
│ On-board PCA9685 PWM Driver (I2C slave) │
│ drives TB6612FNG H-bridge for M1-M4 │
│ │
│ Shield passes through ALL Arduino pins: │
│ D0-D13, A0-A5, 5V, 3.3V, GND, Vin, AREF, SDA, SCL │
│ │
│ Pins actually used by Motor Shield: │
│ A4 (SDA) ──── I2C data to PCA9685 │
│ A5 (SCL) ──── I2C clock to PCA9685 │
│ 5V ────────── Logic power │
│ GND ───────── Ground reference │
└───────────────────────┬──────────────────────────────────────────────────┘
stacks onto │ (all pins pass through)
┌───────────────────────┴──────────────────────────────────────────────────┐
│ ARDUINO UNO │
│ │
│ Left Header: Right Header: │
│ ┌──────────┐ ┌──────────┐ │
│ │ D0 (RX) │ │ A0 │ │
│ │ D1 (TX) │ │ A1 │ │
│ │ D2 │ │ A2 │ │
│ │ D3 │ │ A3 │ │
│ │ D4 │ │ A4 (SDA)─│──── I2C data bus (shared) │
│ │ D5 │ │ A5 (SCL)─│──── I2C clock bus (shared) │
│ │ D6 │ │ 5V ──────│──── Powers both shields │
│ │ D7 │ │ 3.3V │ │
│ │ D8 │ │ GND ─────│──── Common ground │
│ │ D9 │ │ GND │ │
│ │ D10 │ │ Vin │ │
│ │ D11 │ │ AREF │ │
│ │ D12 │ └──────────┘ │
│ │ D13 │ │
│ └──────────┘ │
│ │
│ USB Type-B ── programming and serial debug (115200 baud) │
└──────────────────────────────────────────────────────────────────────────┘
stacks on top (all pins pass through from Motor Shield)
┌──────────────────────────────────────────────────────────────────────────┐
│ ADAFRUIT RGB LCD SHIELD (I2C addr: 0x20) │
│ │
│ On-board MCP23017 I/O Expander (I2C slave) │
│ drives 16x2 HD44780 LCD + RGB backlight + 5 navigation buttons │
│ │
│ Pins actually used by LCD Shield: │
│ A4 (SDA) ──── I2C data to MCP23017 │
│ A5 (SCL) ──── I2C clock to MCP23017 │
│ 5V ────────── Logic power + LCD power │
│ GND ───────── Ground reference │
│ │
│ MCP23017 GPA0-GPA6 ──── LCD RS, EN, D4-D7, backlight R/G/B │
│ MCP23017 GPB0-GPB4 ──── Buttons: SELECT, RIGHT, DOWN, UP, LEFT │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 16x2 LCD Display │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Tinker & Twist │ │ │
│ │ │ Cold Coffee Brew │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ │ [SELECT] [LEFT] [UP] [DOWN] [RIGHT] │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────┘
Both shields share the same two-wire I2C bus on the Arduino Uno:
| Signal | Arduino Pin | Motor Shield (PCA9685) | LCD Shield (MCP23017) |
|---|---|---|---|
| SDA | A4 | Address 0x60 | Address 0x20 |
| SCL | A5 | Address 0x60 | Address 0x20 |
| 5V | 5V | Logic power | Logic + LCD power |
| GND | GND | Ground | Ground |
12V PSU ──> Motor Shield EXT PWR screw terminal ──> TB6612 H-bridge ──> Solenoid (M1)
USB/Barrel ──> Arduino Uno 5V regulator ──> 5V rail ──> Motor Shield + LCD Shield logic
- No additional wiring, breadboard, or pull-up resistors are needed.
- The I2C pull-ups are provided by the Arduino Uno's internal pull-ups.
- All Arduino pins pass through both shields. Digital and analog pins D0-D13 and A0-A3 remain free for future expansion.
- The solenoid is non-polarized; either wire can go to M1(+) or M1(-).
Install arduino-cli or use the Arduino IDE.
# Install required libraries
arduino-cli lib install "Adafruit Motor Shield V2 Library" "Adafruit RGB LCD Shield Library"
# Compile for Arduino Uno
arduino-cli compile --fqbn arduino:avr:uno KyotoCoffeeMachine.ino
# Upload (replace /dev/ttyACM0 with your board's serial port)
arduino-cli upload --fqbn arduino:avr:uno -p /dev/ttyACM0 KyotoCoffeeMachine.inoOn startup, the display shows "Press any button to begin brewing." Once started:
- UP / DOWN -- adjust time between drips (in 200ms increments)
- LEFT / RIGHT -- adjust drip valve open time (in 10ms increments)
- SELECT -- enter the settings menu (backlight color)
Setting the drip delay to 0 opens the valve continuously for full flow.
MIT License. See LICENSE for details.