Project tutorial

DIY Arduino Slow-Drip Cold Brew Coffee Tower © GPL3+

Cold brew coffee is taking the world by storm. Here's a DIY guide to build your own cold brew coffee tower at home.

  • 1,375 views
  • 0 comments
  • 2 respects

Components and supplies

Necessary tools and machines

Scissors

Apps and online services

About this project

Introduction: DIY Arduino Slow-Drip Cold Brew Coffee Tower

Cold brew coffee is taking the world by storm.

I love cold brew coffee. It’s rich, chocolatey, low acidity and really packs a punch! Fill up a small mug with this thick elixir and splash it with some milk, and I’m ready to go for the day. Cold brew coffee is brewed using cold or room temperature water. Certain acids present in coffee are not extracted at this lower temperature, leaving a smoother, sweeter cup that is a bit easier on the stomach.

Slow-drip cold brew, refers to a process in which cold or room temperature water is slowly dripped through coffee grounds over the course of many hours.

The drip technique is rumored to have originated in around the time of the Dutch East India Company (1602). The cold brew method allowed the sailors to be able to take ready to drink coffee on long sea-journeys with them. It is most likely that this form of drip cold brew evolved as a collaboration of ideas with the Japanese and Korean traders who were also keen on the idea of brewing coffee with cold water. When the dripping has completed, the coffee is already filtered, and the beverage can either be ready-to-drink or concentrated (depending on the amount of coffee and water used).

Slow-dripping produces a more aromatic cold brew, with more nuanced and delicate flavors. I find that the traditional full-immersion method produces the same thick and chocolatey flavor, no matter what sort of coffee you use.

My favorite African coffees lose their floral, fruity notes when left overnight in a Toddy. However, putting that same coffee through a Kyoto drip tower and you get a flavorful cup of cold brew, that is lighter in body, extremely aromatic and nuanced in flavor. IMHO, slow-drip is the best method for making single-origin cold brew.

So, how can I make myself drip cold brew at home without breaking the bank? Many Japanese cold brew drip towers start at $200 and can cost up to $1000 or more. It’s all that fancy glass. They are also finicky to use and require a lot of baby-sitting. (Due to the changing column height of water over time, the drip rate slows down. A barista must frequently adjust the drip valve to keep the drip rate constant. Either that, or you get a over-extracted, bitter tasting cold brew that’s been brewing for too long. Yuck.)

With the entry level prices beginning in the hundreds, purchasing a cold brew drip tower for use at home doesn’t make too much sense. Also, the amount of user input required, the constant fidgeting and adjusting – it all gets really annoying.

That’s when I began to think – can I hack together a more economical solution, a set and forget drip tower at home?? Hmmmmmm….. I really do love cold brew!!!! And so the journey began…. This guide will be broken up into two parts: 1) How to build a drip tower 2) How to automate the dripping

Materials

  • 2L Plastic Bottle or similar
  • 1L Plastic Bottle
  • Peristaltic Pump with Encoder (can’t find one? Shoot us an e-mail and we’ll send you a sample!)
  • Epoxy or super glue
  • 1/16” plastic tubing quick connectors (this and this) (optional)

Electronics

Optional

Step 1: Build the Drip Tower

The concept is simple. You have a water chamber and a controlled dripping mechanism. The dripping mechanism releases water into your coffee grounds chamber. Once the water passes through the coffee grounds, you get brewed coffee. This brewed coffee then passes through a ceramic filter before it is collected in one last coffee chamber. Voila, you have drip cold brew that’s ready to drink!

I cut the bottoms off two water bottles. These bottles will be used for the water and coffee grounds chamber.

Step 2: Make the Drip Valve

Next, I epoxied together two plastic fittings, poked a hole in one of the bottle’s lids, and press fit the epoxied fitting through the hole.

Screw this lid back onto its bottle, and you have a water drip chamber!

Step 3: Make the Coffee Chamber

Now, we are going to work on our coffee chamber. Take the 1L bottle and poke a hole through its lid. Grab any coffee filter and place it into the bottle. Try to get it in there as evenly as possible. Ta da! You have a coffee chamber. You could also replace this step with your favorite pourover device: a V60 or Kalita cone if you already have that on hand.

Step 4: Set Up the Ring Stand

Next, we will set up our ring stand. Ring stands are often used in chemistry labs to hold up glassware during experiments. You can get one yourself here for $20.

Secure the bottom ring approx. 10” from the table, and the top ring or clamp approx. 10” above that.

You’re almost ready to start brewing! If you don’t want to deal with the electronics bit, in theory, you could stop here and replace our epoxied fitting with a manually adjustable needle valve. HOWEVER, this setup would require a lot of fiddling every couple of hours to maintain a constant drip rate… aaand nobody got time for that. Wouldn’t it be great if we could pre-program it to run, set it and forget it??

Step 5: Automate the Dripping

This part’s actually pretty easy. We are going to rely on pre-designed motor and LCD shields, so no soldering required! All we need to do is stack! Grab your Arduino and stack your Adafruit Motor Shield over it.

Crimp your pump wires onto your motor shield.

Then stack your Adafruit LDC Shield over that.

We designed a 3D-printable enclosure to house and protect our electronics from being bumped or splashed. You can print one too, here! Securely place your stacked Arduino and shields into this 3D-printed enclosure.

Now, install your pump onto the enclosure, too.

We are using a special type of pump, called a “peristaltic pump.” What’s awesome about this kind of pump is that the internals of the pump never touch the fluid that it dispenses! The fluid is entirely contained within the tubing fitted inside the pump casing. The actual pumping principle, called peristalsis, is based on alternating compression and relaxation of the hose or tube.

The particular peristaltic pump that we’re using is special and has an optical encoder, which records the number of rotations on the pump as it’s running! (Read about optical encoders here.) This allows our dispense to be extremely accurate and consistent from run to run. Most peristaltic pumps do not have this feature. We custom-sourced these ourselves from China! If you would like a sample, shoot an e-mail to info@blossomcoffee.com and we’ll send you one.

You could also use an encoder-less pump, but your setup would require routine calibrations to avoid volume drifting. This can be tedious. You don’t want to have to calibrate your brewer every time you want to make a cup of coffee!

Step 6: Install the Connectors and Tubing

Before we start brewing, we’ll want to connect all the tubing and then fill our chambers up with water and coffee.

We found theseawesome Luer lock tubing connectors that are quick-release. (These connectors are optional. Alternatively, you can use one piece of tubing and run it through the pump all the way to your tower. These connectors just allow you to easily disconnect your electronics for your brew tower.) Connect your connectors and tubing as shown above:

Step 7: Add Coffee to Your Coffee Chamber

Next gently add coffee into the coffee chamber (we suggest starting with 50g), while keeping your paper filter as level as possible at the bottom of the bottle.

Top this off with a round paper filter (an Aeropress filter will work or you can cut your own out of any coffee filter!). The paper filter will help to evenly distribute the droplets over the coffee bed.

Step 8: Plug It in and Select Brewing Options

Using your 12V DC power adapter, plug your Arduino in! Load our sample code , and watch your electronic cold brew drip tower come to life!

Select the starting water volume, and overall brew time. We suggest starting with 50g of a coarsely ground coffee, 500 mL water, 2 hrs. (We typically aim for a 10:1 water to coffee ratio. However, you can experiment to your own taste!) Hit select to begin brewing.

Enjoy!

Code

DIY Arduino Slow-Drip Cold Brew Coffee TowerArduino
Just upload and go!
/***************************
 * E-Drip Tower Version 1.4
 * By: Matt Walliser
 * Edited by: Catherine Tran
 ***************************/

#include <Wire.h>

#include <Adafruit_RGBLCDShield.h>
#include <utility/Adafruit_MCP23017.h>

#include <Adafruit_MotorShield.h>
#include <utility/Adafruit_MS_PWMServoDriver.h>

Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();

Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);

#define OFF 0x0
#define ON 0x1

#define VOL 0
#define TIME 1
#define BREW 2
#define DONE 3

void setup() {
  AFMS.begin();
  lcd.begin(16, 2);
  lcd.setBacklight(ON);
  lcd.setCursor(0, 0);
  lcd.print("Brew Volume:    ");
  pinMode(10, OUTPUT);
}

char line[17];
byte latch = 0;
byte state = VOL;
int brewVol = 1000;
int brewTime = 60;
unsigned long secCnt;
byte seconds;
byte duty;

unsigned long stepCnt;

void loop() {
  byte buttons = lcd.readButtons();

  switch (state) {
    case VOL:
      snprintf(line, 17, "%u ml            ", brewVol);
      lcd.setCursor(0, 1);
      lcd.print(line);

      if (!buttons) latch = 0;
      if (buttons && !latch) {
        latch = 1;
        if (buttons & BUTTON_UP || buttons & BUTTON_DOWN) {
          state = TIME;
          lcd.setCursor(0, 0);
          lcd.print("Brew Time:      ");
        }
        if (buttons & BUTTON_LEFT) {
          if (brewVol > 100) brewVol -= 100;
        }
        if (buttons & BUTTON_RIGHT) {
          if (brewVol < 12000) brewVol += 100;
        }
        if (buttons & BUTTON_SELECT) {
          state = BREW;
          lcd.setCursor(0, 0);
          lcd.print("Brewing...      ");
        }
      }
      break;
    case TIME:
      snprintf(line, 17, "%u:%.2u            ", brewTime / 60, brewTime % 60);
      lcd.setCursor(0, 1);
      lcd.print(line);

      if (!buttons) latch = 0;
      if (buttons && !latch) {
        latch = 1;
        if (buttons & BUTTON_UP || buttons & BUTTON_DOWN) {
          state = VOL;
          lcd.setCursor(0, 0);
          lcd.print("Brew Volume:    ");
        }
        if (buttons & BUTTON_LEFT) {
          if (brewTime > 120) brewTime -= 15;
        }
        if (buttons & BUTTON_RIGHT) {
          if (brewTime < 1080) brewTime += 15;
        }
        if (buttons & BUTTON_SELECT) {
          state = BREW;
          lcd.setCursor(0, 0);
          lcd.print("Brewing...      ");
        }
      }
      break;
    case BREW:
      if (latch) {
        latch = 0;
        secCnt = millis();
        seconds = 0;
        duty = (byte)(((float)brewVol / (float)brewTime * 12.592) + 36.587);
        duty = constrain(duty, 0, 255);
        //myMotor->setSpeed(duty);
        //myMotor->run(FORWARD);
        //stepCnt = micros();
        tone(10, brewVol);

        snprintf(line, 17, "%u:%.2u:%.2u         ", brewTime / 60, brewTime % 60, seconds);
        lcd.setCursor(0, 1);
        lcd.print(line);
      }

      /*if (micros() - stepCnt >= 10) {
        stepCnt += 10;
        digitalWrite(10, !digitalRead(10));
      }*/
      
      if (millis() - secCnt >= 1000) {
        secCnt += 1000;
        if (brewTime == 0 && seconds == 0) {
          //myMotor->run(RELEASE);
          noTone(10);
          state = DONE;
          lcd.setCursor(0, 0);
          lcd.print("Brew Done.      ");
          lcd.setCursor(0, 1);
          lcd.print("                ");
        }
        else {
          if (seconds == 0) {
            seconds = 59;
            brewTime--;
          }
          else {
            seconds--;
          }
          snprintf(line, 17, "%u:%.2u:%.2u         ", brewTime / 60, brewTime % 60, seconds);
          lcd.setCursor(0, 1);
          lcd.print(line);
        }
      }
      break;
    case DONE:
      if (millis() - secCnt >= 1000) {
        secCnt += 1000;
        if (latch) {
          latch = 0;
          lcd.setBacklight(ON);
        }
        else {
          latch = 1;
          lcd.setBacklight(OFF);
        }
      }
      break;
    default: break;
  }
}

Custom parts and enclosures

Thingiverse
https://www.thingiverse.com/thing:2759274

Comments

Similar projects you might like

A DIY Smart Insole to Check Your Pressure Distribution

Project tutorial by Juliette van der Pas

  • 1,702 views
  • 7 comments
  • 15 respects

Arduino LIDAR

Project tutorial by abhinav

  • 14,941 views
  • 4 comments
  • 25 respects

VU Meter on Steroids: Arduino Nano and WS2812Bs

Project in progress by WannaDuino

  • 4,494 views
  • 15 comments
  • 17 respects

Relativ - Build Your Own VR Headset for $100

Project showcase by Relativty

  • 5,514 views
  • 1 comment
  • 8 respects

Sprout: Modern Indoor Self Watering Planter

Project tutorial by Jonathan Pereira

  • 4,483 views
  • 4 comments
  • 25 respects

Arduino Mega Chess

Project showcase by Sergey_Urusov

  • 4,522 views
  • 14 comments
  • 28 respects
Add projectSign up / Login