リフロー炉製作(2)
前回はオーブントースターを改造したので
制御の部分を作ります
製作
簡単に扱えるArduinoを使います
使用した部品
- MAX31855(温度計)
- タクトスイッチ(スタート用)
- 圧電スピーカー
- OLEDディスプレイ
- SSRキット
回路を組むとこんな感じ
SSRキット

Arduinoとその仲間たち

はんだペースト
Aliで輸入したけどちゃんとつかえたので当たりをひいた

プログラム
当初はPID制御で温度調節をしようと考えていたのですが
うまく動作しているのか怪しかったので
単純に設定温度を超えたかどうかでON/OFFを切り替えることにしました
プログラムはこんな感じですが(長ったらしいし載せなくてもいいんじゃないか)
#include <SPI.h>
#include "Adafruit_MAX31855.h"
#include <U8glib.h>
/*
リフロー手順
1.加熱ステージ1
2.予熱ステージ
3.加熱ステージ2
4.リフローステージ
5.冷却ステージ
*/
#define Wait 0
#define Heat1 1
#define Preheat 2
#define Heat2 3
#define Reflow 4
#define Cool 5
int Profile[6][2] = {
{ 0, 0},
{140, 0}, //Heat1
{160, 60}, //Preheat
{225, 0}, //Heat2
{230, 20}, //Reflow
{ 0, 0} //Cool
};
//ピンアサイン
#define Pin_SSR 8
#define Pin_Buzzer 9
#define Pin_BTN_Start 6
#define Pin_MAXDO 3
#define Pin_MAXCS 4
#define Pin_MAXCLK 5
//LCD
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);
//Temp
double TargetTemp, Temp;
int WindowSize = 5000;
unsigned long windowStartTime;
//K type thermocouple
Adafruit_MAX31855 thermocouple(Pin_MAXCLK, Pin_MAXCS, Pin_MAXDO);
byte state;
byte beforestate = 0;
byte temp[256];
byte temp_cnt;
byte TargetFlag = 0;
unsigned long HeatingTime;
void GetTemp() {
double c = thermocouple.readCelsius();
double inter = thermocouple.readInternal();
if (!isnan(c)) {
Temp = c;
temp_cnt++;
temp[temp_cnt] = (byte)(c/2);
}else{
Serial.println("error get temp");
}
return 0;
}
void SetTemp() {
TargetTemp = Profile[state][0];
windowStartTime = millis();
}
void ControlSSR() {
if (0 < state && state < 5) {
if(TargetTemp > Temp){
digitalWrite(Pin_SSR, HIGH);
} else {
digitalWrite(Pin_SSR, LOW);
}
}
}
void DrawState() {
String str_num = String(state,DEC);
String str = String("State:" + str_num);
u8g.drawStr( 0, 20, str.c_str());
if(TargetFlag > 0){
str_num = String(Profile[state][1]-(millis()/1000 - HeatingTime),DEC);
str = String(str_num + "s");
u8g.drawStr( 64, 20, str.c_str());
}
str_num = String(temp[temp_cnt] * 2,DEC);
str = String("Temp :" + str_num);
u8g.drawStr( 0, 40, str.c_str());
str_num = String((Profile[state][0]));
str = String("SetTemp :" + str_num);
u8g.drawStr( 0, 60, str.c_str());
}
void DrawGraph() {
//Required firstPage
int i;
for (i = 0; i < 256; i++) {
u8g.drawPixel(255-i, 64-temp[(temp_cnt + i) % 256]/2);
}
}
void RefreshLCD() {
u8g.firstPage();
do {
switch (state) {
case Wait:
DrawState();
break;
case Heat1:
case Preheat:
case Heat2:
case Reflow:
case Cool:
if (millis() / 2000 % 2) {
DrawGraph();
} else {
DrawState();
}
break;
}
} while ( u8g.nextPage() );
}
void CalcHeat(){
if(TargetFlag){
//一定加熱
if((millis()/1000 - HeatingTime) > Profile[state][1]){
TargetFlag = 0;
state++;
SetTemp();
}
}else{
if(Profile[state][0] < temp[temp_cnt]*2){
TargetFlag = 1;
HeatingTime = millis()/1000;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//ピンモード
pinMode(Pin_SSR, OUTPUT);
pinMode(Pin_BTN_Start, INPUT_PULLUP);
//LCD
u8g.setColorIndex(1);
u8g.setFont(u8g_font_8x13r);
state = 0;
}
void loop() {
beforestate = state;
GetTemp();
switch (state) {
case Wait:
if (digitalRead(Pin_BTN_Start) == LOW) {
//Start!
state++;
SetTemp();
TargetFlag = 0;
Serial.print(" Next Heat1 Stage");
tone(Pin_Buzzer,1500,100);
}
break;
case Heat1:
CalcHeat();
break;
case Preheat:
CalcHeat();
break;
case Heat2:
CalcHeat();
if(beforestate != state){
tone(Pin_Buzzer,1000,200);
}
break;
case Reflow:
CalcHeat();
if(beforestate != state){
tone(Pin_Buzzer,1500,1000);
}
break;
case Cool:
if(beforestate != state){
tone(Pin_Buzzer,1000,1000);
}
break;
}
ControlSSR();
RefreshLCD();
delay(100 - millis() % 100);
}
Let's リフロー!
はんだペーストを基板に載せてその上に部品を載せる
小さいパッドにはんだペーストを載せるのはなかなかきつい

そして作ったリフロー炉に入れれば

はいできあがり、光らない…。1個だけ光らない…。

LEDチップの端子と基板は導通が全てあるけど光らなかったので
もともとLEDチップが死んでいたのかなとか考えた
実装する前にちゃんと動作するか確かめるためのものが
必要だということがわかりました
次回はユニバーサル基板で実装しようと思います

ハイローズ(Hi-rose) オーブントースター HR-T121
- 出版社/メーカー: 廣瀬無線電機
- メディア: ホーム&キッチン
- この商品を含むブログを見る

K型熱電対温度センサモジュールキット(SPI接続)MAX31855使用 5V版
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
- この商品を含むブログを見る
