Who is here? 1 guest(s)
 Print Thread
New Build: Automated popper coffee roaster
elkayem
New member here, first post. I have learned quite a lot from browsing this forum, and wanted to share the fruits of my research: a new, fully automated popcorn popper roaster. I have been an espresso enthusiast for a while, but this is my first venture into the world of home roasting. I understand that popcorn poppers are a great way to get started, but being someone that can't say no to tinkering with electronics, I had to make a few of my own improvements.

I've gathered a lot of folks here use Artisan to monitor and control their roast. Maybe that's something to shoot for with my next build... The one I've put together doesn't require an external computer, but does allow the user to input a profile, and then save the closed-loop roast progress against that profile on an SD card for later analysis. Some of the features I've included:

* Auto mode which will control the temperature (bean or environment) and fan speed to a settable profile.
* Manual mode where temperature and fan speed can be controlled in real time.
* Measured temperatures, set value, fan speed, and heater duty cycle saved to an SD card as a CSV file at 2 Hz while roasting. See image above showing data from a roast, plotted from the CSV file using Excel.
* The roasting profile can be set as a sequence of up to 9 segments. The set temperature and fan speed are linearly interpolated from one segment to the next. This provile can be set and saved to EEPROM via the LCD screen interface.
* Separate tuneable PID values for the environement temperature and bean temperature. A tuning mode for each controller is available allowing one to monitor the step response and tune the gains in real time.

This build uses an STM32 ARM development board known as the "Blue Pill", programmed in the Arduino development environment. For anyone who wishes to follow in my footsteps (or borrow from my code), I've uploaded the code to Github at:

https://github.co...feeRoaster

Now it is time for me to figure out how to get a good roast! I have long been a fan of Red Bird's standard espresso blend. That has been the default roast in my grinder for many years. and it is my goal now to see how closely I can approximate it. They describe it as a "Rich Medium" roast, whatever that means. I have so far roasted about 2 pounds, and am no where close. Any tips on modifications to my roasting profile are welcome.

I've included a screenshot of my current temperature profile below. I have two temperature probes, the first (ET) at the very bottom of the roasting chamber near the heat source, and the second (BT) in the middle of the bean mass. I have noticed on this forum that many people use the ET for closed loop control. I cannot figure out why, but I'm willing to learn if there is a better way. As seen in the plot below, I am using the BT probe for control, and it seems to track pretty well. First crack seems to start somewhere around 380, and slowly goes on through the entire roast, ending at 420. Anything worth changing? Faster? Slower? Higher temperatures? In any case, I'm going to continue to tweak until I get it right.

A few other questions... Most of the chaff seems to be gone by the time my roast completes, but there is still a fair amount left stuck in the center cut. Is there something I should be doing to get rid of this, or is it fine to leave it there? And to cool the beans, I have been turning on the fan full blast at the end of the roast for a few minutes. Is this the preferred way to cool the beans, or should I be doing something else? I'll keep perusing this forum as I'm sure the answers to my questions, including the ones I haven't asked yet, are buried somewhere here.
elkayem attached the following images:
roastingprofile.jpg img_1713.jpg

Edited by elkayem on 03/09/2018 8:05 PM
 
ahardinger
Hot Damn, the DIY coffee roast controller scene is going bananas! Also, welcome! Welcome

I like the SD card addition, wanted to add one to my controller, the espEspresso, but didn't want to make the board bigger or go with components on both sides.

Also, +1 on the faster temperature measurements (2Hz). The TC4 is a relatively slow acquisition system since it uses a Sigma Delta ADC @ 3.75sps multiplexed with 4 channels.

I'm relying on Artisan to do the logging and user interface for now and honestly its a bit of a short cut measure to get things goings fast. I hate doing UI work on MCU's. But you have a nice setup.

Poking around your GitHub now. Nice work on the code base, pretty straightforward and nothing pedantically clever in it. I can actually groc it fairly well at a glance.ThumbsUp

Any plans on adding Feed-Forward or Proportional on Measurement to your PID loops?

I wish I could comment on the roast profile but we're in the same boat. I've only good at the digital stuff, the coffee roasting is all black art to me still. I'm cranking out out good, but it could be a lot better.

Good stuff!
 
allenb
Welcome elkayem!

As Aaron proclaimed, controller scene is going bananas! Great to have you on board joining our other microcontroller savy roasters.

Your roast curve looks good. Don't worry about the remaining chaff in the center cut. As long as you're getting the beans cooled down to the 200's F in 2 minutes you're fine cooling in the roast chamber. I've found no noticeable improvement in the cup by more rapid cooling.

Post often!

Allen
1/2 lb and 1 lb drum, Siemens Sirocco fluidbed, presspot, chemex, cajun biggin brewer from the backwoods of Louisiana
 
elkayem
Aaron and Allen, thank you for the warm welcome!

Aaron, I'm glad you approve of my setup. What is the board you have in your user photo? Is that the espEspresso you referred to? And is that an ESP32 I see in the photo? I need to check that out right away. Wifi might be the next upgrade I need. First though, I just need to figure out how to roast...

Quote

ahardinger wrote:
Also, +1 on the faster temperature measurements (2Hz). The TC4 is a relatively slow acquisition system since it uses a Sigma Delta ADC @ 3.75sps multiplexed with 4 channels.


Measured and displayed at 2 Hz, but averaged for 1 Hz duty cycle control to the SSR. Since the SSR uses zero cross detection, I can only get about 8 ms resolution on the outgoing duty cycle so 1 Hz control output was about as fast as I wanted to go. Still, the 2 Hz averaging does cut down a little on the noise.

Quote

Any plans on adding Feed-Forward or Proportional on Measurement to your PID loops?


Now you're talking my language. As it turns out, I design control systems for a living, and have for nearly 20 years since I earned a doctorate in the same topic. There is no end to how deep you can go down that rabbit hole! Almost all of my professional work has been on high bandwidth systems though (mechanical and electrical) so this is actually the first temperature control system I've ever done. I like to start as simple as possible, so I naively thought it to be a simple first-order system where PI control would be more than sufficient. Boy was I surprised when I saw underdamped oscillations when I started tuning! My loop is still very simple, just a PID with an FIR filter on the rate feedback. I am interested to find out the industry standard on coffee roaster control loops. Is there one? You mention feedforward, which is commonly used where I come from, but I haven't seen a need for it here yet on these slow moving temperature profiles. Perhaps I should crack open the Artisan or TC4 software to see how they are tackling the problem.
 
renatoa
Not sure how much use of TC4 or Artisan in real coffee roasting industry, but both are using variations of the version prior to last of Brett Arduino PID, without PoM, which was recently added.
Recoding now Brett PoM PID for my roasting app, eager to see if solving some issues I have atm.
Roasters: DIY: TO based IR 200-640g
Commercial, moded: Skywalker, Dieckmann RoestMeister, Nesco, popper(s).
Electronics: TC4ESP (author), MS6514, USB/Artisan/Apps (contributor), PID controllers
Grinders: Potu ghost burrs, Arco, Xeoleo ghost burrs, Krinder, vintage PeDe Dienes, MBK Feldgrind, Kinu M38
Brew/presso: ALM pour over, Arin lever, Staresso Mirage, Hario Cafeor dripper, Flair Signature, Kompresso, Aeropress, Gaggia Mini
 
elkayem
Thanks renatoa, it's useful for me to know the heritage of the controller code in TC4 and Artisan. I wasn't familiar with Brett Beauregard's Arduino library until your prompting and the resulting Google search. I have now taken a look at the TC4 software (actually looks like there are number of different flavors) and see traces of Brett's code in there. I also took a quick look at the Artisan PID code. All of these appear to be fairly vanilla PID loops (like mine) without requiring anything too sophisticated. I didn't see any evidence of feedforward, but it is possible I missed it in my very cursory look. I did see indications that some of the TC4 versions (I didn't review all of it) implement rate feedback using the measurement rather than error, but that was about the only difference.

Aaron, I don't think I fully answered your question regarding plans to add features to the PID loop. Let me fix that.

My personal opinion on feedforward is that it is not needed for my application. Feedforward is useful for improving response time, which is already adequate for my setup. Furthermore, feedforward assumes knowledge of the thermal dynamics (time constants, ambient temperature, etc), and some of these can change through the roast based on bean mass, fan speed, etc, making implementation more complex. I am curious if you had something specific in mind though, and whether you see an advantage. I'm sure my small popcorn popper responds very different than a large drum roaster, so there may be advantages for other systems.

On the second question, "proportional on measurement", I presume you are referring to closing the position loop on the measurement alone rather than the error. In my (untested) opinion, this will make the response more sluggish, and could lead to larger errors when tracking the temperature profile. The same goes for using measurement rather than error for rate feedback (which TC4 does but Artisan does not). Both of these techniques can help with overshoot to a step response at the cost of response time. Given that the temperature profiles we use are fairly smooth without large discontinuities, I don't see that as an advantage for these loops. But then again, I am a newbie when it comes to temperature control, and willing to be proved wrong if someone has an alternative thought on this. Renatoa, I am interested to hear if you find it has some advantage for your application.
 
renatoa
For fluid bed roasters, if no preheat, as some people is not using, following the profile could be straightforward, starting the curve from ambient temperature.
But for machines with preheating, as mine, and most drums, loaded around 200C, I have great issues with undershooting and then overshooting of the BT profile around TP and until DE.
The BT curve drop much faster than the nice polinomial curves drawn in Artisan designer, to make this drop less abrupt I must either use a minimum output value around 40-50%, i.e. not cut power completely until TP, as some people advise, either introduce a huge D factor, to compensate the big negative P term.

Also, one P does not fit all ! This is the most important finding I think... the bigger the SV, more P term I need.
And guess what, the P term used around FC is too big for the initial drying phase.
All of these led to adaptive tuning need, imo... which I hope to fix introducing PoM. Will see...
 
elkayem

Quote

renatoa wrote:
For fluid bed roasters, if no preheat, as some people is not using, following the profile could be straightforward, starting the curve from ambient temperature.
But for machines with preheating, as mine, and most drums, loaded around 200C, I have great issues with undershooting and then overshooting of the BT profile around TP and until DE.
The BT curve drop much faster than the nice polinomial curves drawn in Artisan designer, to make this drop less abrupt I must either use a minimum output value around 40-50%, i.e. not cut power completely until TP, as some people advise, either introduce a huge D factor, to compensate the big negative P term.


Renatoa,

I've attached an example 300 degF step response taken from my roaster (ambient temperature was 70 degF). Overshoot is 9 deg. Is this overshoot acceptable? To me, a little overshoot preferred over a sluggish response time. I don't have a preheated drum roaster like you, but the response to dropping beans into a preheated drum shouldn't be to dissimilar (after the dip). I don't use "proportional on measurement" but still have minimal overshoot.

My guess... if you are seeing significant undershoot and then overshoot when you drop your beans into the roaster, you could be dealing with integrator windup. One solution to that is to place a limiter on the minimum and maximum value of the integrator state. The other possibility is that you have too much gain. If the issue is the latter, dialing back on the gains may be sufficient to fix the problem. Hard to say though without seeing the response. I would start by capturing a step response with your bean chamber loaded, and tuning until you see only a slight overshoot.

Quote

Also, one P does not fit all ! This is the most important finding I think... the bigger the SV, more P term I need.
And guess what, the P term used around FC is too big for the initial drying phase.
All of these led to adaptive tuning need, imo... which I hope to fix introducing PoM. Will see...

It is certainly true that the thermal dynamics will change through the coarse of the roast. As the beans lose mass, the basic time constants will change. This could require different gains. Or very low gains, which should be robust enough to deal with the changes through the roast.

Apologies about preaching about tuning your own control gains! And from someone who knows nothing about roasting coffee beans! I am very interested in what you discover, and how you ultimately fix this issue.
elkayem attached the following image:
stepresponse.jpg
 
renatoa
The mess begins when you start to record, compute and draw the RoR curve, which is no more no less that the derivative of the BT curve.
Any irregularity is amplified at a scale that you simply can't ignore, especially when you are a fanatic member of the "continuous declining RoR" church smile
 
ahardinger

Quote

elkayem wrote:
Aaron, I don't think I fully answered your question regarding plans to add features to the PID loop. Let me fix that.

My personal opinion on feedforward is that it is not needed for my application. Feedforward is useful for improving response time, which is already adequate for my setup. Furthermore, feedforward assumes knowledge of the thermal dynamics (time constants, ambient temperature, etc), and some of these can change through the roast based on bean mass, fan speed, etc, making implementation more complex. I am curious if you had something specific in mind though, and whether you see an advantage. I'm sure my small popcorn popper responds very different than a large drum roaster, so there may be advantages for other systems.


Hi, so I'm not nearly as good at control systems as you are (very informal education while working on side projects). My background is EE + Firmware\Software in the medical imaging and neurostimulation field. Having said that I'm probably not using feed forward correctly. I find that with a given programmed BT RoR the actual BT lags the commanded BT causing the integral to wind up until it overcomes the needed output deficit, then it has some damped oscillation until finally settling. Then when I lower the RoR the wound up integral causes overshoot until it has caught up again leading to some more oscillation. With a good feed forward value, acting on the commanded RoR, I find that doesn't happen. Maybe I'm not tuning my loops correctly in the first place?

Quote


On the second question, "proportional on measurement", I presume you are referring to closing the position loop on the measurement alone rather than the error. In my (untested) opinion, this will make the response more sluggish, and could lead to larger errors when tracking the temperature profile. The same goes for using measurement rather than error for rate feedback (which TC4 does but Artisan does not). Both of these techniques can help with overshoot to a step response at the cost of response time. Given that the temperature profiles we use are fairly smooth without large discontinuities, I don't see that as an advantage for these loops. But then again, I am a newbie when it comes to temperature control, and willing to be proved wrong if someone has an alternative thought on this. Renatoa, I am interested to hear if you find it has some advantage for your application.


To explain this a little background is needed. I'm using a total of three loops for my system. The first loop is the ET controller. It's output controls the heater and varies from 0-100% duty. The ET SV comes from the output of the BT PID and is the request ET temperature to keep BT controlled. ET PV comes from a single pole IIR filtered ET Thermocouple Sensor.

The BT SV comes from either a RoR Generator, Profile Generator, or external input via artisan. BT PV is feed from another single pole IIR filtered BT thermocouple sensor.

The third PID Loop is the Blower Controller. It role is to adjust the fan trying to keep the heater operating at ~95%. For low temperatures the blower will reach 100% power and the heater will still be throttled back, this is okay. As ET rises the heater will eventually be unable to keep up and output will peg @ 100%. Here the blower PID will turn down the blower.

It has a fixed SV of 95%. The PV is a very low frequency single pole IIR filter of the ET PID Output. The control value varies the blower's duty cycle from 0-100%. This PID also incorporates dead-zone to prevent the blower output variation from perturbing the ET PID loop too much. (Don't let the tail wag the dog) Very low Ki and little to no Kp.

So, now about why I like PonM. Specifically I like it for the BT PID since it shares some in common with integrating systems. A bump in BT requires a large(ish) bump in ET to get the BT moving by pumping in heat. But, once BT has come up ET needs to be reduced to just make up the losses (pretty big in these systems, but not 100%). Again, it prevents some oscillation. I use it blended wit PonE about 50/50.
 
ahardinger

Quote

renatoa wrote:

For fluid bed roasters, if no preheat, as some people is not using, following the profile could be straightforward, starting the curve from ambient temperature.
But for machines with preheating, as mine, and most drums, loaded around 200C, I have great issues with undershooting and then overshooting of the BT profile around TP and until DE.
The BT curve drop much faster than the nice polinomial curves drawn in Artisan designer, to make this drop less abrupt I must either use a minimum output value around 40-50%, i.e. not cut power completely until TP, as some people advise, either introduce a huge D factor, to compensate the big negative P term.

Also, one P does not fit all ! This is the most important finding I think... the bigger the SV, more P term I need.
And guess what, the P term used around FC is too big for the initial drying phase.
All of these led to adaptive tuning need, imo... which I hope to fix introducing PoM. Will see...


I'm with you here. My PID loops have multiple tuning parameters. Right now I use 4 different settings. I tune the ET PID loop at 4 different blower power outputs (25%, 50%, 75%, 100%). In realtime I interpolate between these settings based on ET Temperature and Blower Power.

BT PID is tuned @ (100C, 125C, 150C, 175C) and again I interpolate in realtime based on the current BT.

Blower PID is fixed, I find that I don't multi step tuning there.

All these tunings are set using a custom Tuning Algorithm I'm working on perfecting. ET and Blower PID works well. BT tuning is being worked on still. Right now I use the BT as a suggestion and fine tune from there.

I will also say that Bean Mass is a big variable. I always roast with 180g. Bean provenance doesn't seem to matter so much though. Gesha, Ethiopian, Sumatra, etc... don't seem to impact the tuning for me. Also, I roast light for myself and dark for my wife. No changes there either.
 
elkayem

Quote

renatoa wrote:

The mess begins when you start to record, compute and draw the RoR curve, which is no more no less that the derivative of the BT curve.
Any irregularity is amplified at a scale that you simply can't ignore, especially when you are a fanatic member of the "continuous declining RoR" church smile


Got it. If your rate RoR needs to always go down, then I can see why any overshoot would be unacceptable. I agree that using "proportional on measurement" should help in that case, at the expense of loop responsiveness.
 
elkayem

Quote

ahardinger wrote: ... I'm using a total of three loops for my system...

Very interesting! When starting this project, I had wondered if people were using successive loop closures on the ET and then BT. It certainly should work, but would require the ET bandwidth be higher than BT (e.g., 10X). In any case, I didn't see any evidence people were doing that in my non exhaustive perusal of these pages. Maybe I didn't look hard enough. Is this common at all? What I did see are a number of cases where people controlled the ET directly, and allowed the BT to be whatever it is. This doesn't make sense to me. After all, if one is ultimately interested in the BT following a profile, then the BT should be the control variable. In any case, I opted to control the BT directly, allowing the ET to be whatever it wants to be. This is probably easier for a small roasting chamber like mine, with only 80g of beans, than some of the other larger roasters out there.

I had also thought of controlling the fan speed to keep the heater below 100%, which appears to be exactly as you are doing. I opted for a simpler approach, and simply control it open loop, gradually ramping it down. I also have manual control over it during the roast, so if i need to nudge it up and down I can do so. If under closed loop control, you would certainly want a very low bandwidth for this.
 
renatoa
Real BT measurement in fluid bed is a chimera, too much hot air between beans to pretend you are actually measure beans.
I am one of those who prefer to drive the roast by ET, because I find this more reliable, even if my machine favor the most accurate BT you can get... there is almost no airflow in the corner where BT probe is placed. Guess what is a real BT at FC? Even less than 182C/360F !
That 200C/400F mark we find in all roasting tutorials is just another beans/air mix usually found in an average drum roaster, but is not true a BT at FC.
 
BenKeith
I use nothing but bean temp to control my roast. I know all the mumbo jumbo about how there is too much hot hair and differences in bean mass, and all kinds of reason why you don't use BT.

I look at it like this, all I'm wanting to do is get the my coffee beans from point A to point B in a preset set time and rate of rise. If I want my bean mass temp at 300F in four minutes, the beans to start turning yellow (320F in mine) in five minutes, cinnamon in six (340F) and at a rolling first crack in nine (390F) with Columbian beans, and my roaster is doing that within a few seconds every roast, and has been for a few years, it's doing exactly what I want.
In my opinion (which is the only one I really pay attention to), Time has proven, while using bean temps may have it's variables, they all seem to stay fairly consistent so they don't affect the outcome once you have it dialed in, in a manner that apparently compensates for them.
Edited by BenKeith on 03/13/2018 1:59 PM
 
ahardinger
I agree with Renatoa, that what we're measuring isn't true BT for the reasons they gave. But, I also agree with BenKeith. It doesn't matter if we measure the TRUE BT but a consistent BT for our roaster. In that case we're using BT as an indicator for control and will fine tune profiles that reflect that.

Now, a question, it is ANY ET overshoot actually unacceptable? What if we overshoot by 3 degrees C but only for 5 seconds? And only then due to a step change? I can't see how 5 seconds of overshoot will move the actual BT very much at all. Here's why I think this way:

My roaster can move 180g of Beans @ 20C per minute with a delta ET/BT of +50C. If we assume a specific heat of 1.67 J/g-K then I'm pumping ~100 J/s of heat into the beans. Normalizing for the Delta ET/BT of 50C yields a heat transfer rate of ~2 J/S per degree delta BT/ET. Now, assume a 5c overshoot which means I'll push ~10 J/s of extra heat into the bean mass @ peak overshoot. Also assume a 5 second overshoot duration with a roughly Half Period Sine Wave shape which means a total heat increase of 50J x 0.707 = 30.4J of added heat. Therefore a BT rise of ~0.12C over the coarse of the positive overshoot cycle. Reverse that for the negative cycle. So the BT will swing +/- 0.12C during the worst overshoot.

***I totally accept that this is a ROUGH estimation, this process is very complicated but I think this is close enough to accept the results within a 5x margin of error. I think it actually over-estimates the impact because I'm using a specific heat for DRY coffee beans which is where our beans will be at the end of the roast. But, at the end of the roast overshoot is reduced because there is so little reserve power available due to the high ET.

I think we want to avoid under damped oscillation, esp. if doing BT PID control.
 
allenb

Quote

I agree with Renatoa, that what we're measuring isn't true BT for the reasons they gave. But, I also agree with BenKeith. It doesn't matter if we measure the TRUE BT but a consistent BT for our roaster. In that case we're using BT as an indicator for control and will fine tune profiles that reflect that.


This is the case whether in a drum or fluidbed. Unless we've got a very accurate infrared temp sensor or the impossible probe inside many beans which are both very difficult/impractical, measuring the air in between or above the beans will always be the way we must control the roast. Controlling strictly using ET will never be a viable means of control unless one is not concerned with maintaining an accurate profile.

After experimenting with many fluidbed designs over the years, I've found that the only means of getting a consistent BT read is by finding a sensor location 1 to several inches above the beans, off to one side, as far away from the air stream as possible. This will typically show somewhere around 300F at yellow, 395 - 405 FC which, as stated, is not true internal bean temp but as stated, doesn't matter as long as the error remains somewhat constant.

Something to consider for future experimentation is to control the roast via variable rate of rise versus segments of X temp by X time. Getting to temperature benchmarks at x time is of less importance than strictly maintaining desired rate of rise throughout the roast. The problem I've heard with this is the difficulty of obtaining clean, useful rate of rise feedback in realtime.

Allen
1/2 lb and 1 lb drum, Siemens Sirocco fluidbed, presspot, chemex, cajun biggin brewer from the backwoods of Louisiana
 
renatoa
A short story about the impossibility of control based on ET... some many years ago, too many smile working in a team to make the control of a concrete factory, we were confronted with the same impossible mission, to measure the pebbles temperature inside the giant rotating oven that are used in such factories.
The final solution was been based completely on controlling the heat quantity input into the system, without any internal temperature check.
The stones temperature itself was been impossible to measure accurately, with our limited means (from communist era), even using IR, while the process itself can be mathematically modelled very well, and all external measurements can be done much more precise: we know volumes, masses, stone density, ambient temperature, drum losses, so was been easy to compute the heat required to increase the internals to the target without any measurement until the final moment of drop.

About probe placement, my finding, during my fluid bed experiments was that the best point to measure is at the bottom of the RC, in the corner between RC wall and where the funnel start.
Is the area with least air turbulences, the least beans movement (noise) and the beans there are at their lowest temperature after descending from the upper hotter layers, just before being hit by the hot air column.
I think this is the temperature that matters if we want to be "as bean as possible". The higher in the column, the more air in the mix.
 
BenKeith
When I first started, the roast chamber I was using looked like it was shot with a shotgun it had so many holes from trying different probe placements. It's kind of funny that I wound up in almost the exact location Renatoa described. I use an exposed bead wire probe that's sticking up about 1/4" to 3/8" from the bottom and about a 3/8" to 1/4" down the slope of the funnel from where the vertical side starts.
I started off trying to use SS probes with the beads covered, thinking the buffering the shielding over the bead would be needed to help buffer temps spikes. I also started of using the ET at different heights and locations above the beans to penetrating the bean mass with it, Never found anything I was happy with.
Again, thinking I needed a solid probe, I started trying all kinds of locations in the bean mass and using BT instead of Et. It was not until I went with the super sensitive bead probe I have now in different locations of the bean mass that things started coming together.
During all this, and thinking it was more of a PID tuning problem than it was probe/probe placement, I was battling getting it tuned.
When I finally got the right probe in that magic location and the right tune on the PID, the sucker is dead on every roast.
The only thing I can't do is get rid of that PID line that looks like a decreasing sine wave for the first minute, It takes it about a minute of so to sink and lock in but she is rock solid from that point on. I figure in the first minute or so of the drying cycle, there's not enough heat in the beans to have any affect on the final roast and anything I do to fix it, bites me later in the roast.
They say you roast for the satisfaction and flavor. I'm satisfied (most of the time) and I like most of what I roast, so I'm happy.
 
Jump to Forum: