// リフロートースター
// ATtiny85 with ArduinoIDE
// FUSE H=0xDF L=0xE2 E=0xFF
// InternalOSC=8MHz
#define SW_ON LOW
#define SW_OFF HIGH
// ピンアサイン
#define SP_B2 0
#define SP_B1 1
#define LOCKIN 2
#define START1 3
#define START2 4
// 設定温度(メモ)
#define SP1_TEMP 25
#define SP2_TEMP 150
#define SP3_TEMP 210
#define SP4_TEMP 110
// 保持時間
#define SP1_HOLD 0
#define SP2_HOLD 90
#define SP3_HOLD 60
#define SP4_HOLD 60
void setup( void )
{
pinMode( SP_B1 , OUTPUT ); digitalWrite( SP_B1 , LOW );
pinMode( SP_B2 , OUTPUT ); digitalWrite( SP_B2 , LOW );
pinMode( LOCKIN, INPUT ); digitalWrite( LOCKIN, HIGH );
pinMode( START1, INPUT ); digitalWrite( START1, HIGH );
pinMode( START2, INPUT ); digitalWrite( START2, HIGH );
delay(4000);
temp_set( 1 ); delay(2000); // SP1 常温
temp_set( 2 ); delay(2000); // SP2 余熱
temp_set( 3 ); delay(2000); // SP3 はんだ付け
temp_set( 4 ); delay(2000); // SP4 乾燥
}
void temp_set( int mode )
{
switch( mode ){
default:
case 1: // SP1
digitalWrite(SP_B1, LOW ); digitalWrite(SP_B2, LOW ); break;
case 2: // SP2
digitalWrite(SP_B1, HIGH); digitalWrite(SP_B2, LOW ); break;
case 3: // SP3
digitalWrite(SP_B1, LOW ); digitalWrite(SP_B2, HIGH); break;
case 4: // SP4
digitalWrite(SP_B1, HIGH); digitalWrite(SP_B2, HIGH); break;
}
}
int Sw1_val, Sw1_cnt, Sw2_val, Sw2_cnt;
void loop( void )
{
Sw1_val = Sw1_cnt = Sw2_val = Sw2_cnt = 0;
temp_set( 1 ); // SP1
while(1){
Sw1_val = digitalRead( START1 );
if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;
if( Sw1_cnt == 500 ){ Sw1_cnt = 0; program_line1(); temp_set(1); delay(2000); }
Sw2_val = digitalRead( START2 );
if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0;
if( Sw2_cnt == 500 ){ Sw2_cnt = 0; program_line2(); temp_set(1); delay(2000); }
delay(1);
}
}
void program_line1( void )
{
unsigned long end_time;
Sw1_val = Sw1_cnt = 0;
// SP2 余熱温度をセット
temp_set( 2 ); delay( 2000 );
// 目標温度まで待機
while( digitalRead(LOCKIN) != SW_ON ){
Sw1_val = digitalRead( START1 ); // ボタンが押されたら中止
if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;
if( Sw1_cnt == 200 ) return;
delay(1);
}
// ホールド
end_time = millis() + (unsigned long)1000*SP2_HOLD;
while( end_time > millis() ){
Sw1_val = digitalRead( START1 );
if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;
if( Sw1_cnt == 200 ) return;
delay(1);
}
// SP3 はんだ付け温度をセット
temp_set( 3 ); delay(2000);
// 目標温度になるまで待機
while( digitalRead(LOCKIN) != SW_ON ){
Sw1_val = digitalRead( START1 );
if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;
if( Sw1_cnt == 200 ) return;
delay(1);
}
// ホールド
end_time = millis() + (unsigned long)1000*SP3_HOLD;
while( end_time > millis() ){
Sw1_val = digitalRead( START1 );
if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;
if( Sw1_cnt == 200 ) return;
delay(1);
}
}
void program_line2( void )
{
unsigned long end_time;
Sw2_val = Sw2_cnt = 0;
// SP2 乾燥温度をセット
temp_set( 4 ); delay( 2000 );
// ボタンを離すのを待つ
while( digitalRead(START2) == SW_ON ) delay(100);
// 目標温度まで待機
while( digitalRead(LOCKIN) != SW_ON ){
Sw2_val = digitalRead( START2 );
if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0;
if( Sw2_cnt == 200 ) return; // ボタンで中断
delay(1);
}
// ホールド時間
end_time = millis() + (unsigned long)1000*SP4_HOLD;
while( end_time > millis() ){
Sw2_val = digitalRead( START2 );
if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0;
if( Sw2_cnt == 200 )return; // ボタンで中断
delay(1);
}
}