2014-05-04 09.57.28.jpg

咖啡豆,生豆和熟豆價格相差非常大, 專業的烘豆機器又非常貴, 動不動就上萬元才能買到, 網路上有人用爆米花機也能用半自動方式烘出漂亮的咖啡豆,

其實只要把握烘咖啡豆的幾個關鑑點, 再配合自己的喜愛烘焙深淺, 也可以用低價的設備烘出香香的咖啡豆來的。

基本的設備:

1. 爆米花機

2. 溫度計

3. 計時器

烘豆的過程(以下為大約值, 網路有許多不同的烘豆時間曲線,針對不同的生豆, 其烘豆曲線也會不一樣, 自己試了才知道):

1.預熱到100度左右

2. 進豆

3. 在0~15分鐘左右烘到200度

4. 過了200度會開始冒煙, 接著開始1爆, 掉銀皮

5. 在15~20分鐘, 持續升溫到230度, 會有2爆, 顏色變深

6.下豆, 冷却, 吹電扇

以上第3步驟可以畫成一條溫度與時間的線性關係圖, 當溫度加熱太快, 就要暫時停止加熱, 當溫度又低於該線性時再繼加熱.

這樣監控溫度, 反覆加熱, 停止加熱的動作, 其實用電腦來控制是很容易達成的, 基於這樣的需求, 開始尋找可能的解決方案:

 

***使用 Arduino 單晶片程式控制

Arduino 板子有很多種不同等級的規格, 最簡單常用的是UNO 版, 功能再強一點的會用MEGA2560版, 時下最流行的3D列印, 其主要心臟主是Arduino MEGA2560版。

↓Arduino MEGA2560 的板子。數位I/O腳 0~53, 共54個。類比I/O腳 A0~A15 共16個。 ARDUINO MEGA2560.jpg

 

 ↓Arduino UNO R3 的板子數位I/O腳 0~13, 共14個。類比I/O腳 A0~A5 共6個。

ARDUINO UNO.jpg  

由以上的比較, 可見Arduino MEGA 2560 板子的輸出入腳, 多了很多, 在設計各種場合的應用, 比較方便。

 

材料設備:

1. Arduino MEGA2560 一塊

2.繼電器模塊(用來控制爆米花機加熱與斷電)

3.溫度模塊(解析K-TYPE 熱電偶溫度, 送給 Arduio MEGA)

4.溫度採樣探頭(K-TYPE 熱電偶)

↓生豆-衣索比亞 西達摩

2014-05-04 10.54.01.jpg

 

↓容器重30克

2014-05-04 09.56.07.jpg

 

 ↓歸零

2014-05-04 09.56.21.jpg

 

↓生豆重60克, 因為爆米花機太小, 每次只能烘60克左右,若烘太多豆子, 豆子在機器內會比較不容易滾動,會烘不均勻。

2014-05-04 09.56.46.jpg

 

↓改附開關的電源插座, 將繼電器負載端並接到插座開關上, 用繼電器控制插座送電與否?

2014-05-04 09.57.09.jpg

 

↓Arduino MEGA 接了一個含keypad 的LCD1602, 可以有6個按鍵及顯示16x2行英文字的模組,原來是想用UNO控制就好, 但LCD1603KEYPAD 佔用太多I/O PORT 只好用 MEGA。

2014-05-04 09.57.17.jpg

 

↓MAX6675熱電偶溫度模塊

2014-05-04 09.57.28.jpg

 

↓爆米花機烘咖啡豆的情形, 那相金屬棒就是K-TYPE 熱電偶

2014-05-04 09.59.57.jpg

 

↓LCD1602 顯示目前加熱中.., 經過了13分21秒, 預設溫度203度, 實際溫度200度

2014-05-04 10.13.26.jpg

 

↓一爆產生, 開始掉銀皮

2014-05-04 10.13.41.jpg

 

烘好了以後, 因為失去了水份及銀皮, 太約會剩45克左右, 約八成左右的重量,(600克生豆約烘成450克熟豆=1磅) 

2014-05-04 10.23.30.jpg

 

↓烘好的咖啡豆(第一次自己烘,雖然不盡完美, 但DIY的成就感十足)

 

2014-05-03 23.38.06.jpg 

  

↓Ardiuno MEGA2560 接線特寫

2014-05-04 10.38.31.jpg

 

↓Ardiuno MEGA2560 接線特寫

2014-05-04 10.39.12.jpg

 

 

以下為烘豆程式, 相關的函數庫(LCD1602keypad, MAX6675, TIMER)請自行上網尋找下載, 

熱電偶接線:

使用UNO 板子時:SO,CS,SCK=#11,#12,#13

使用MEGA板子時:SO,CS,SCK=#18,#19,#20

繼電器: 電熱絲 P2, 風扇 P3

// ==烘咖啡程式===程式設計: 昆尼詩工作室======================
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <Timer.h>
Timer tcb;

//LiquidCrystal_I2C lcd(0x27,16,2);   //這是 for I2C LCD1602 的宣告, 目前不用 
// set the LCD address to 0x27 for a 16 chars and 2 line display
// LCD  接 SDA on pin A4
// SCL on pin A5
// ===LCD1602Keypad=================================
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); //Digit pin
char msgs[5][16] = {"Right ",
"Up ",
"Down ",
"Left ",
"Select " };
int adc_key_val[5] ={50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

//==== MAX 6675 熱電偶 ===========================================
#include "Max6675.h"
Max6675 ts(11, 12, 13); // SO,CS,SCK=#11,#12,#13
// Max6675 module:
// MEGA2560 UNO
// SO on pin #18, #11
// SS on pin #19, #12
// CSK on pin #20 #13
// Other pins are capable to run this library, as long as digitalRead works on SO,
// and digitalWrite works on SS and CSK
//======  繼電器pin ===================================================
int relay_heater = 2; //繼電器導通觸發信號-高電平有效;
int relay_fan = 3; //繼電器導通觸發信號-高電平有效;

//
//=======  SETUP  主程式開始=============================================

void setup()

{
ts.setOffset(0); //  設定MAX6675 熱電偶
// set offset for temperature measurement.
// 1 stannds for 0.25 Celsius
Serial.begin(9600);

lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("ADC key testing");

pinMode(relay_heater,OUTPUT); //定義埠屬性為輸出;
pinMode(relay_fan ,OUTPUT); //定義埠屬性為輸出;
int i;
for (i=1;i>=0;i--){
digitalWrite(relay_heater,HIGH); //繼電器導通;
digitalWrite(relay_fan, HIGH); //繼電器導通;
delay(300);
digitalWrite(relay_heater,LOW); //繼電器開關斷開;
digitalWrite(relay_fan,LOW); //繼電器導通;
delay(300);

lcd.setCursor(0, 1);
lcd.print("Relay Test ");
lcd.print(i);
lcd.print(" ");

setTime(12,0,0,24,3,14);
}
lcd.clear();

tcb.every(5000,count_temp ); // 每經過1000毫秒,就會呼叫
}
//======= LOOP ===========================================================
char* fire[]={"Turn OFF","Cooking "};
int ff,stage;
float set_temp;
void loop()
{
tcb.update();
digitalWrite(relay_heater,LOW); //繼電器導通;
digitalWrite(relay_fan ,HIGH); //繼電器導通;
//======   依烘豆階段設定溫度 =================================
switch (stage) {
case 1: // 加熱至 150度
set_temp=150;
case 2: // 降溫至 100度
set_temp=100;
case 3: // 升溫至150度進豆
set_temp=150;
case 4: //升溫至210度
set_temp=150+minute()*4+second()*4/60;
digitalWrite(relay_heater,HIGH); //繼電器導通;
digitalWrite(relay_fan ,HIGH); //繼電器導通;
// case 5: //下豆 降溫
// set_temp=30;
}
if(ts.getCelsius() < set_temp){
ff=1;
digitalWrite(relay_heater,LOW); //繼電器導通;
digitalWrite(relay_fan ,LOW); //繼電器導通;
}
else {
ff=0;
digitalWrite(relay_heater,HIGH); //繼電器 斷電;
digitalWrite(relay_fan ,HIGH); //繼電器 斷電;
}
Disp_msg();
delay(1000);
}
//========  每XX秒設定溫度, 並紀錄============================
void count_temp(){
stage=4;
Serial.print(minute());
Serial.print(":");
Serial.print(second());
Serial.print(",");
Serial.print(fire[ff]);
Serial.print(",");
Serial.print(set_temp);
Serial.print(",");
Serial.print(ts.getCelsius());
Serial.print(",");
Serial.println("C");
}
// ======== DISP ALL MESSAGE =====================================
void Disp_msg()
{
lcd.setCursor(0, 0);
lcd.print("[");
lcdprint0(minute());
lcd.print(":");
lcdprint0(second());
lcd.print("] ");
lcd.print(stage);
lcd.print("-");
lcd.print(set_temp);

lcd.setCursor(0, 1);
lcd.print(fire[ff]);
lcd.setCursor(10, 1);
lcd.print(ts.getCelsius());
lcd.print(" C ");
}
// === add 0 ========================================
void lcdprint0(int mm){
if(mm<10){lcd.print("0");}
lcd.print(mm);
}
// =================== for time ==================================
void ShowDayTime(){
// digital clock display of the time
lcd.setCursor(0, 0);
lcd.print(year());
lcd.print("-");
lcd.print(month());
lcd.print("-");
lcd.print(day());
lcd.print(" ");
lcd.print(hour());
lcd.print(":");
lcd.print(minute());
lcd.print(":");
lcd.print(second());
lcd.print(" ");
}

arrow
arrow
    全站熱搜

    kenisu 發表在 痞客邦 留言(0) 人氣()