REFLO Air is The compact, open, and smart PCB reflow machine.
Viewing with the top cover removed. The left is the main board. On the right is the panel board connected from there.
In addition, you can see the power cable connection by removing the back cover.
Diagram showing the connection of each module.
// REFLO AIR MAIN CONTROLLER
// ============================================
// REFLO Air CONTROLLER [ATMEGA328p 32kRAM, 2kROM]
// Language Reference http://arduino.cc/en/Reference/HomePage
// ============================================
// INCLUDE FILES
// ============================================
#include <SoftwareSerial.h> // UART
#include <SPI.h> // THERMOCOUPLE
#include <EEPROM.h> // PARAMETER STORE
#include "para.h" // parameters
// ============================================
// VARIABLEs
// ============================================
SoftwareSerial monit(5, 6); // softUART pin setup for Serial Monitor 6:Tx 5:Rx
// ============================================
// SETUP
// ============================================
void setup() {
monit.begin(19200); // Serial monitor setup
SPI.begin(); // SPI CLK:13 SPI MISO:12
pinMode( 9, OUTPUT); digitalWrite( 9, 1); // Thermometer CS
pinMode( 2, OUTPUT); digitalWrite( 2, 0); // SSR
pinMode(A2, OUTPUT); // LIGHT LED
pinMode(A3, OUTPUT); digitalWrite(A3, 0); // 12V FAN
pinMode( 3, OUTPUT); // EX IF POWER
pinMode( 5, OUTPUT); digitalWrite( 5, 0); // LED
pinMode( 4, INPUT_PULLUP); // EX IF SIGNAL
digitalWrite( 3, 1); // POWER ON
RestorePara();
TESTHEATER();
Senddata(0x01, TOffset, 0x0e); // Off set value
}
// ============================================
// LOOP
long itime, itimel, itimeT; // event timer
int countT, countF, countP; // temp/fan/led
int pTemp = 200; // previous temp
int dTemp; // delta temp
int HP = 48;
// ============================================
void loop() {
plcn(); // PWM control LED/FAN/HEATER
if(millis() - itime > 900) { itime = millis();
TCtemp = Rtemp(); // Thermomonit(); // Thermometer
if(TCtemp < 100 && !StartStop) HP = 48; // parameter reset
//////////////////////////////////////////////
SndCurrentTemp(TCtemp); // send temp to panel and USBXY controller for system syncronization
// create system timing: 900ms heart beat ////
dTemp = TCtemp - pTemp; pTemp = TCtemp; //monit.print("dTemp:"); monit.println(dTemp);
// 100V-115V-220-240V adjustment
HEATER = 0; if(TTEMP - TCtemp > 0 && StartStop) {
if(dTemp > 3 && dTemp < 16) { HP -= dTemp - 1; if(HP < 13) HP = 13; }
else if(!dTemp) { if(HP < 48 + 15) { HP++; } } //monit.print("HP-:"); monit.println(HP);
HEATER = HP;
}
//
digitalWrite(5, StartStop); // StartStop LED
}
IFdecode();
//if(millis() - itimeT > 5000) { itimeT = millis(); monit.print(TCtemp); monit.print("/"); monit.println(HEATER); }
}
// ============================================
// IF DECODE
// MAIN TEMP(cmd0 adrsd): current temp
// PNL TEMP( M0 cmd0 adrsc) [countT] 0-255(+100)
// FAN( M1 cmd1 adrsc) [countF] 0-32
// LIGNT(M4 cmd1 adrsd) [countP] 0-32
// CMD(Start/Stop cmd3 0xaa/0x55)
// ============================================
void SndCurrentTemp(int temp) { if(temp < 100) { temp = 100; } Senddata(0x00, temp-100, 0x0d); } // send current temp
void IFdecode() {
if(ReceiveCommand()) { // Serial IF
switch(cnt) { //decode cmd cnt; data ddd; adrs ccc;
case 0: if(ccc == 0x0c) { countT = ddd + 100; TTEMP = countT; } break; // from other cont temp + 100(100 to 356)
case 1: if(ccc == 0x0c) { countF = ddd; if(countF == 0) { countF = 1; } } // fan
else if(ccc == 0x0d) { countP = ddd; } // light air(P0-16) or light(L0-16)
else if(ccc == 0x0e) { TOffset = ddd; StorePara(); // Temp offset parameter
//monit.print("TOffset:"); monit.println(TOffset);
} break; // Maintenance
case 3: if(ccc == 0x0c) { if(ddd == 0xaa) { StartStop = 0; } else if(ddd == 0x55) { StartStop = 1; } }
} cnt = 9;
}
}
// ============================================
// Parameter Store Reload
//EEPROM adres 1 Offset
// ============================================
void StorePara() { // store TEMP/FAN/ LIGHT
EEPROM.update(1, TOffset); delay(10);
}
void RestorePara() { // restore TEMP/FAN/LIGHT
int bbb = EEPROM.read(1);
if(bbb < 99 && bbb > 0) { TOffset = EEPROM.read(1);
} else { TOffset = 10; } //delay(400);
}
// ============================================
// Serial data rcv
// _____start---- ____"0"---- ____"1"---//---- ____stop----
// 9ms 4ms 600us 600us 600us 1600us 600us total 20 to 30ms
// 0/1/2/3:address 5:all 4:talkie(wait serial command)
// ============================================
int ReceiveCommand() {
long TStime; long sTStime; int lap[20]; cnt = 0; ddd = 0; ccc = 0x0f; // initialize
if(!digitalRead(4)) {
sTStime = millis(); TStime = micros(); // total/lap length check
delayMicroseconds(10); while(!digitalRead(4)) { plcn(); if(millis() - sTStime > 50) return 0; }
if(micros() - TStime < 4000) return 0; // start carry "L" 9ms
delayMicroseconds(10); while( digitalRead(4)) { plcn(); if(millis() - sTStime > 50) return 0; } // start space "H" 4ms
for(int n = 0; n < 10 + 4; n++) { // 10bit
delayMicroseconds(10); while(!digitalRead(4)) { plcn(); if(millis() - sTStime > 50) return 0; } // data carry 600us
TStime = micros();
delayMicroseconds(10); while( digitalRead(4)) { plcn(); if(millis() - sTStime > 50) return 0; }
lap[n] = micros() - TStime; // data space 600(H)/1600(H)us
} while(!digitalRead(4)) { if(millis() - sTStime > 50) return 0; } // stop bit
for(int n = 0; n < 2; n++) { if(lap[n] > 1200) { bitSet(cnt, 1-n); } } // command 2bit
for(int n = 2; n < 2+8; n++) { if(lap[n] > 1200) { bitSet(ddd, 7+2-n); } } // data 8bit
for(int n = 2+8; n < 2+8+4; n++) { if(lap[n] < 1200) { bitClear(ccc, 7+2+4 - n); } } // address 4bit
return 1;
} return 0;
}
// ============================================
// Serial data send
// --start------- --"0"------ --"1"---------- --stop------
// 9ms 4ms 600us 600us 600us 1600us 600us total 30 to 45ms
// +4bit option
// 0/1/2/3:address f:all 4:talkie(wait serial command)
// ============================================
void Senddata(byte cnt, byte ddd, int adrs) { //
while(!digitalRead(4)) { delay(10); }
pinMode(4, OUTPUT); // keep line
sendS(4); // start
for(int n = 0; n < 2; n++) { if(bitRead(cnt, 1-n)) { sendH(4); } else { sendL(4); } }
for(int n = 0; n < 8; n++) { if(bitRead(ddd, 7-n)) { sendH(4); } else { sendL(4); } }
byte ccc = adrs;
for(int n = 0; n < 4; n++) { if(bitRead(ccc, 3-n)) { sendH(4); } else { sendL(4); } } // +4bit for leg address
sendL(4); // stop bit
pinMode(4, INPUT_PULLUP); // release line
}
void sendS(int pin) { digitalWrite(pin, 0); delayMT(9000); digitalWrite(pin, 1); delayMT(4000); }
void sendH(int pin) { digitalWrite(pin, 0); delayMT(500); digitalWrite(pin, 1); delayMT(1700); }
void sendL(int pin) { digitalWrite(pin, 0); delayMT(500); digitalWrite(pin, 1); delayMT(200); }
void delayMT(long timee) { long itim = micros(); while(micros() - itim < timee) { plcn(); } }
// ============================================
// PWM CONTROL
// ============================================
void plcn() { // LED/FAN/HEATER PWM control
Led((pow((countP+1), 2)*7)*StartStop); // LED pwm control 0(0),1(7),2(28),3(63),4(112)
int plus = 64;
if(TCtemp < 50 && !StartStop) plus = 30; // silent mode
if(TCtemp > 120 && !StartStop) plus = 90; // cool down mode
Fan(countF*6*StartStop + plus); // FAN pwm control 0,1,2,3,4,5,6,7,8(80)
Heat(HEATER*StartStop);
}
// ============================================
// Fan(A3), LED(A2) CONTROL
long itimeF, itimeL;
int Fcnt, Lcnt;
boolean Lf, Ff;
// ============================================
void Led(int ledset) { // ledset 0-99
if(micros() - itimeL > 200) { itimeL = micros(); //
Lcnt++; if(Lcnt > 99) { Lcnt = 0; } // LED Control
Lf = false; if(Lcnt < ledset) Lf = true; digitalWrite(A2, Lf); // LED ON/OFF
}
}
void Fan(int fanset) { // fanset 0-99
if(micros() - itimeF > 300) { itimeF = micros(); //
Fcnt++; if(Fcnt > 99) { Fcnt = 0; } // FAN Control
Ff = false; if(Fcnt < fanset) Ff = true; digitalWrite(A3, Ff); // FAN ON/OFF
}
}
// ============================================
// HEATER CONTROL Heater(2),
long itimeH, itimeHP;
int Hcnt;
boolean Hf, HfP;
boolean duty50 = true;
// ============================================
void Heat(int heatset) { // heatset 0-63
if(millis() - itimeHP > 10) { itimeHP = millis(); //
digitalWrite(2, Hf*HfP); HfP = !HfP; if(!duty50) { HfP = true; }
}
if(millis() - itimeH > 50) { itimeH = millis(); //
Hcnt++; if(Hcnt > 63) { Hcnt = 0; } // HEATER Control
Hf = false; if(heatset > 10 && Hcnt <= heatset) Hf = true; // HEATER ON/OFF
}
//--------------------------------------------
//if(TCtemp > 400) { digitalWrite(2, 0); } // heater off for safe
//--------------------------------------------
}
// VOLTAGE SENSE 110(duty50 = false)/220(duty50 = true)
void TESTHEATER() { long pp;
while(RtempR() > 120) { IFdecode(); Fan(100); } // cooling if high temp
pp = millis(); while(millis() - pp < 1000) { IFdecode(); Fan(76); } // pre cooling
int tempa = RtempR(); // temp before pre heat
pp = millis(); while(millis() - pp < 4000) { IFdecode(); Heat(60); Fan(76); } // pre heat
int tempb = RtempR(); // temp before heat
pp = millis(); while(millis() - pp < 4000) { IFdecode(); Heat(60); Fan(76); } // heating
int tempd = RtempR(); // temp after heat
///// 15 degree //////////////////////////////////////////////////////////////
if(tempd - tempb > 11) { duty50 = true; } else { duty50 = false; } // monit.print("duty50::"); monit.print(duty50);
//////////////////////////////////////////////////////////////////////////////
Senddata(0x01, tempd - tempb, 0x0e); // display delta temp
pp = millis(); while(millis() - pp < 1500) { IFdecode(); Fan(76); } // delay for display
}
// ============================================
// TEMP (Ktype -200 to 700degree)
// D[31-18]:14bit temp (LSB = 0.25degree)
// D[16]:fault D[17,3]:0 D[15-4]:internal temp (LSB = 0.0625degree)
// D[2]:vcc D[1]:gnd D[0]:open
SPISettings MAX31855(SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE1);
// ============================================
void Thermomonit() {
monit.print("Temp:"); monit.println(TCtemp);
if(sflt) {
if(bitRead(MAX[2], 0)) { monit.print("Sensor FAULT"); }
if(bitRead(MAX[0], 0)) { monit.print("Short to VCC"); }
if(bitRead(MAX[0], 1)) { monit.print("Short to GND"); }
if(bitRead(MAX[0], 2)) { monit.print("Open circuit"); }
}
}
int Rtemp() {
sflt = 0; read31855(9);
if(bitRead(MAX[2], 0) || bitRead(MAX[0], 0) || bitRead(MAX[0], 1) || bitRead(MAX[0], 2)) { sflt = 1; }
int tempo = word(MAX[3], MAX[2])/16;
// -- temp adjustment ---
///////////////////////////////////////////////////////////////
if(tempo > 500) { digitalWrite(2, 0); } // heater off for safe
///////////////////////////////////////////////////////////////
if(tempo <= 150) { tempo -= TOffset; }
//else if(tempo > 150 && tempo < 240) { tempo -= TOffset + 0.3*(tempo - 150); } // TOffset = 16 + alpha
else if(tempo > 150) { tempo -= TOffset + 0.3*(tempo - 150); } // TOffset = 16 + alpha
//else { tempo -= TOffset + 27 + 0.2*(tempo - 240); } //
// --
return tempo;
}
int RtempR() {
sflt = 0; read31855(9);
if(bitRead(MAX[2], 0) || bitRead(MAX[0], 0) || bitRead(MAX[0], 1) || bitRead(MAX[0], 2)) { sflt = 1; }
int tempo = word(MAX[3], MAX[2])/16;
return tempo;
}
void read31855(int cs) {
SPI.beginTransaction(MAX31855);
digitalWrite(cs, 0); // CS "L"
MAX[3] = SPI.transfer(0); MAX[2] = SPI.transfer(0);
MAX[1] = SPI.transfer(0); MAX[0] = SPI.transfer(0); // read 32bit
digitalWrite(cs, 1); // CS "H"
SPI.endTransaction(); //
}
// ============================================
// IO assignment
// ============================================
// THERMO COUPLE SPI CSはD9
// A2:RGB
// A3:FAN
// D0:RGB external
// D2:SSR on
// D3:EX IF Power
// D4:EX IF
// D9:SPI CS
// ============================================
// VALIABLES
// ============================================
byte cnt = 0; byte ddd = 0; byte ccc = 0x0f; // Serial IF parameters
int StartStop = 0; // Start Stop control
int FAN = 60; // FAN setting
int HEATER = 0; // HEAT setting
int TTEMP = 20; // TargetT setting
int TCtemp; // TEMP
int sflt = 0; // Thermoerr
byte MAX[4]; // MAX SPI read buffer
int TOffset; // temp offset
// ============================================
// REFLO Air Pannel CONTROLLER [ATMEGA328p 32kRAM, 2kROM]
// Language Reference http://arduino.cc/en/Reference/HomePage
// ============================================
// INCLUDE FILES
// ============================================
#include <SoftwareSerial.h> // UART
#include "FastLED.h" // RGB LED
#include <EEPROM.h> // PARAMETER STORE
#include "para.h" //
// ============================================
// VARIABLEs
// ============================================
SoftwareSerial monit(13, 12); // softUART pin setup for Serial Monitor 12:Tx 13:Rx
boolean tgll = true; // LED tgle
CRGB leds[1]; // RGB LED buffer
boolean dbg = false; // serial monitor enabler (avoid conflict 7Seg display)
long timerL; // timer of 10 minutes
// ============================================
// SETUP
// ============================================
void setup() {
monit.begin(19200); // Tx:12/Rx:13 Serial Monitor
pinMode(5, INPUT_PULLUP); // IF IO
Sevensetup(); // 7segment port initialize
FastLED.addLeds<NEOPIXEL, A2>(leds, 1); // FastLED A2
leds[0] = CRGB(0, 2, 0); FastLED.show(); // green
loopLED(200); // display test
RestorePara(); // restore parameters from EEPROM
Senddata(0x01, countP, 0x0d); delay(100); // cnt = 1 ddd = light address d
Senddata(0x01, countF, 0x0c); delay(100); // cnt = 1 ddd = fan address c
Senddata(0x03, 0xaa, 0x0c); // system stop
}
// ============================================
// LOOP
int TEMPseq; // internal sequence
int STARTreq, STOPreq, STEMPreq, FANreq, LIGHTreq; // if request flag
int HSinc; // long sw request counter
long Wtimer; // wait timer temp display
// ============================================
void loop() {
AutoOff();
//---- IF ---------------
if(ReceiveCommand()) { // Serial IF from other controller
switch(cnt) { //decode cmd cnt; data ddd; adrs ccc;
case 0: if(ccc == 0x0c) { countT = ddd + 100; dispM = 0; TEMPseq = 2; } // from MOUSE temp + 100(100 to 356)
else if(ccc == 0x0d) { countTr = ddd + 100; // from HOST current temp
///// send command to host right after receiving temp info //////////
if(STARTreq) { STARTreq = 0; Senddata(0x03, 0x55, 0x0c); } // START command sw/mouse
if(STOPreq) { STOPreq = 0; Senddata(0x03, 0xaa, 0x0c); } // STOP command sw/mouse
if(STEMPreq) { STEMPreq = 0; Senddata(0x00, countT-100, 0x0c); } // TEMP command sw/mouse
if(FANreq) { FANreq = 0; Senddata(0x01, countF, 0x0c); } // FAN command sw/mouse
if(LIGHTreq) { LIGHTreq = 0; Senddata(0x01, countP, 0x0d); } // LIGHT command sw
/////////////////////////////////////////////////////////////////////
} break;
case 1: if(ccc == 0x0c) { countF = ddd; dispM = 1; } break; // fan(0-4) from MOUSE
case 3: if(ccc == 0x0c) { // START STOP from MOUSE
if(ddd == 0x55) { // set temp behalf of MOUSE
if(!RUN) { RUN = 1; countT = 160; } else { RUN = 2; countT = 240; } TEMPseq = 1;
} else if(ddd == 0xaa) RUN = 0;
tone(A0, 500*8, 350); dispM = 0; RGBStartStop(RUN);
} break; // START/STOP from MOUSE
} cnt = 9;
}
//---- MAIN ---------------
if(dispM == 0) {
if(RUN) {
switch (TEMPseq) {
case 0: DispSeven(0, countT, 1000); break;
case 1: STEMPreq = 1; TEMPseq = 2; break; // temp command req
case 2: DispSeven(0, countT, 1000); Wtimer = millis(); TEMPseq = 3; break; // target temp display
case 3: if(millis() - Wtimer > 3000) TEMPseq = 4; break; // 3sec wait
case 4: DispSeven(400, countTr, 1000); // wait sync
if(abs(countT - countTr) < 5) { tone(A0, 440*5, 200); TEMPseq = 0; } break; // check current temp
}
} else { DispSeven(0, countTr, 1000); } // STOP display current temp
} // TEMP countT/countTr
else if(dispM == 1) { DispSeven(0, countF + 1000, 1000); } // FAN countF
else if(dispM == 2) { DispSeven(0, countP + 1400, 1000); } // LIGHT count
//---- SW control -----------
while(RUNsw()) { // run control switch
if(RUNsw()) { delay(200); while(RUNsw()) { } dispM = 0;
switch (RUN) {
case 0: RUN = 1; countT = 160; TEMPseq = 1; tone(A0, 500*8, 300); STARTreq = 1; break;
case 1: RUN = 2; countT = 240; TEMPseq = 1; tone(A0, 500*8, 300); break;
case 2: RUN = 0; StorePara(); StorePara(); tone(A0, 500*8, 300); STOPreq = 1; break;
} delay(300); RGBStartStop(RUN);
} // RUN
}
while(UPsw() || DNsw()) { // up/down control switch
if(UPsw()) { delay(200); // UP
if(!DNsw()) { HSinc = 0;
while(UPsw() && !DNsw()) { HSinc++; tone(A0, 330*5, 100); delay(150);
if(dispM == 0) { countT++; if(HSinc > 5) countT += 7; if(countT > 300) countT = 300; TEMPseq = 1; } // TEMP countT
else if(dispM == 1) { if(countF < 8) countF++; FANreq = 1; } // FAN countF
else if(dispM == 2) { if(countP < 4) countP++; LIGHTreq = 1; } // LIGHT countP
Disp();
}
} else { tone(A0, 440*5, 100); delay(100); dispM++; if(dispM > 2) {dispM = 0;}} // UPDN
}
if(DNsw()) { delay(200); // DN
if(!UPsw()) { HSinc = 0;
while(DNsw() && !UPsw()) { HSinc++; tone(A0, 220*4, 100); delay(150);
if(dispM == 0) { countT--; if(HSinc > 5) countT -= 7; if(countT < 100) countT = 100; TEMPseq = 1; } // TEMP countT
else if(dispM == 1) { if(countF > 0) countF--; FANreq = 1; } // FAN countF
else if(dispM == 2) { if(countP > 0) countP--; LIGHTreq = 1; } // LIGHT countP
Disp();
}
} else { tone(A0, 440*5, 100); delay(100); dispM++; if(dispM > 2) {dispM = 0;}} // UPDN
}
}
}
// ============================================
// Serial data rcv
// _____start---- ____"0"---- ____"1"---//---- ____stop----
// 9ms 4ms 600us 600us 600us 1600us 600us total 20 to 30ms
// 0/1/2/3:address 5:all 4:talkie(wait serial command)
// ============================================
int ReceiveCommand() {
long TStime; long sTStime; int lap[20]; cnt = 0; ddd = 0; ccc = 0x0f; // initialize
byte pp = 0x00; // parity
if(!digitalRead(5)) {
sTStime = millis(); TStime = micros(); // total/lap length check
delayMicroseconds(10); while(!digitalRead(5)) { if(millis() - sTStime > 50) return 0; }
if(micros() - TStime < 4000) return 0; // start carry "L" 9ms
delayMicroseconds(10); while( digitalRead(5)) { if(millis() - sTStime > 50) return 0; } // start space "H" 4ms
for(int n = 0; n < 10 + 4; n++) { // 10 + 4bit
delayMicroseconds(10); while(!digitalRead(5)) { if(millis() - sTStime > 50) return 0; } // data carry 600us
TStime = micros();
delayMicroseconds(10); while( digitalRead(5)) { if(millis() - sTStime > 50) return 0; }
lap[n] = micros() - TStime; // data space 600(H)/1600(H)us
}
TStime = micros();
while(!digitalRead(5)) { if(millis() - sTStime > 50) return 0; } // stop bit
lap[14] = micros() - TStime;
for(int n = 0; n < 2; n++) { if(lap[n] > 1200) { bitSet(cnt, 1-n); pp++; } } // command 2bit
for(int n = 2; n < 2+8; n++) { if(lap[n] > 1200) { bitSet(ddd, 7+2-n); pp++; } } // data 8bit
for(int n = 2+8; n < 2+8+4; n++) { if(lap[n] < 1200) { bitClear(ccc, 7+2+4 - n); } else { pp++; }} // address 4bit
return 1;
} return 0;
}
// ============================================
// Serial data send
// --start------- --"0"------ --"1"---------- --stop------
// 9ms 4ms 600us 600us 600us 1600us 600us total 30 to 45ms
// +4bit option
// 0/1/2/3:address f:all 4:talkie(wait serial command)
// ============================================
void Senddata(byte cnt, byte ddd, int adrs) { //
while(!digitalRead(5)) { delay(10); }
pinMode(5, OUTPUT); // keep line
sendS(5); // start
for(int n = 0; n < 2; n++) { if(bitRead(cnt, 1-n)) { sendH(5); } else { sendL(5); } }
for(int n = 0; n < 8; n++) { if(bitRead(ddd, 7-n)) { sendH(5); } else { sendL(5); } }
byte ccc = adrs;
for(int n = 0; n < 4; n++) { if(bitRead(ccc, 3-n)) { sendH(5); } else { sendL(5); } } // +4bit for leg address
sendL(5); // stop bit
pinMode(5, INPUT_PULLUP); // release line
}
void sendS(int pin) { digitalWrite(pin, 0); delayMicroseconds(9000); digitalWrite(pin, 1); delayMicroseconds(4000); }
void sendH(int pin) { digitalWrite(pin, 0); delayMicroseconds(500); digitalWrite(pin, 1); delayMicroseconds(1700); }
void sendL(int pin) { digitalWrite(pin, 0); delayMicroseconds(500); digitalWrite(pin, 1); delayMicroseconds(200); }
// ============================================
// 7Segment TEST
// ============================================
void loopLED(int ddd) { // test
boolean tt = false;
if(ddd) {
Disp7_2( _, 1); Disp7_1( _, 1); Disp7_0(_, 1, tt); delay(ddd); tt = !tt; tone(A0, 40, 40);
Disp7_0(0, 1, tt); delay(ddd); tt = !tt; tone(A0, 40, 40);
Disp7_1( 0, 1); Disp7_0(1, 1, tt); delay(ddd); tt = !tt; tone(A0, 40, 40);
for(int n = 0; n < 13; n++) {
Disp7_2(n, 1); Disp7_1(n+1, 1); Disp7_0(n+2, 1, tt); delay(ddd); tt = !tt; tone(A0, n*40+440, 40);
}
Disp7_2(13, 1); Disp7_1(14, 1); Disp7_0(_, 1, tt); delay(ddd); tt = !tt; tone(A0, 40, 40);
Disp7_2(14, 1); Disp7_1( _, 1); delay(ddd); tt = !tt; tone(A0, 40, 40);
Disp7_2( _, 1); delay(ddd); tt = !tt; tone(A0, 40, 40);
}
}
// ============================================
// Shifut Register
// ============================================
// SCK (4) _____++__++__++__++__++__++__++__++___________
// RCK (A1) _______________________________________++________
// 0 1 2 3 4 5 6 7
// SI (3) -----X===X===X===X===X===X===X===X===X------
// /SCLR H(A0) _++++++++++++++++++++++++++++++++++++++++++
void SRset(byte dataa) { for(int n = 0; n < 8 ; n++) { digitalWrite(3, bitRead(dataa, n)); SCKplsS(); } SCKplsR(); }
void SCKplsS() { digitalWrite( 4, 0); digitalWrite( 4, 1); } // ___+++ SCK
void SCKplsR() { digitalWrite(A1, 1); digitalWrite(A1, 0); } // +++___ RCK
// ============================================
// 7SEGMENT SETUP
// ============================================
void Sevensetup() {
// digit 0 Shift register
pinMode(A1, OUTPUT); digitalWrite(A1, 0); // RCK
pinMode( 3, OUTPUT); digitalWrite( 3, 0); // SI
pinMode( 4, OUTPUT); digitalWrite( 4, 0); // SCK
// digit 2
pinMode( 7, OUTPUT); digitalWrite( 7, 1); // a
pinMode( 8, OUTPUT); digitalWrite( 8, 1); // b
pinMode(A5, OUTPUT); digitalWrite(A5, 1); // c
pinMode(A3, OUTPUT); digitalWrite(A3, 1); // d
pinMode(A4, OUTPUT); digitalWrite(A4, 1); // e
pinMode( 6, OUTPUT); digitalWrite( 6, 1); // f
pinMode(13, OUTPUT); digitalWrite(13, 1); // g
// digit 1
pinMode(12, OUTPUT); digitalWrite(12, 1); // a
pinMode(11, OUTPUT); digitalWrite(11, 1); // b
pinMode( 2, OUTPUT); digitalWrite( 2, 1); // c
pinMode( 1, OUTPUT); digitalWrite( 1, 1); // d
pinMode( 0, OUTPUT); digitalWrite( 0, 1); // e
pinMode(10, OUTPUT); digitalWrite(10, 1); // f
pinMode( 9, OUTPUT); digitalWrite( 9, 1); // g
}
// ============================================
// DISPLAY
long itimeD, itimeP, itimeT; // event timer
boolean tgllT = true; // 7Seg tgle blink
// ============================================
void DispSeven(int bl, int co, int dbl) { // 7segment display co:number, bl:blink interval
if(!bl) { tgllT = 1; } else if(millis() - itimeT > bl) { itimeT = millis(); tgllT = !tgllT; }
if(millis() - itimeP > dbl) { itimeP = millis(); tgll = !tgll; } // dot blink
if(millis() - itimeD > 30) { itimeD = millis(); dispDigit(co, tgllT, tgll); } // dot blink
}
void dispDigit(int count, int Ttgl, int dbl) { // 7segment display, Ttgl:blink dbl:dot
int dig0, dig1, dig2;
if(Ttgl) { dig2 = count/100; dig1 = (count - dig2*100)/10; dig0 = count - dig2*100 - dig1*10; }
else { dig0 = _; dig1 = _; dig2 = _; }
Disp7_2(dig2, Ttgl); Disp7_1 (dig1, Ttgl); Disp7_0 (dig0, Ttgl, dbl);
}
// ============================================
// A0(Sel2)/A1(Sel1)
// a(D7) a(D12)
// f(D6) b(D8) f(D10) b(D11)
// g(D13) g(D9)
// e(A4) c(A5) e(D1) c(D3)
// d(A3) dp(D0) d(D2) dp(D4)
// 7Segment display
// 0:abcdef_ 0000001 0x01 // 1:_bc____ 1001111 0x4f // 2:ab_de_g 0010010 0x12
// 3:abcd__g 0000110 0x06 // 4:_bc__fg 1001100 0x4c // 5:a_cd_fg 0100100 0x24
// 6:a_cdefg 0100000 0x20 // 7:abc____ 0001111 0x0f // 8:abcdefg 0000000 0x00
// 9:abcd_fg 0000100 0x04 // P:ab__efg 0011000 0x18 // L:___def_ 1110001 0x31
// U:_bcdef_ 1000001 0x41 // _:_______ 1111111 0x7f // F:a___efg 0111000 0x38
byte Pat[] = { 0x01, 0x4f, 0x12, 0x06, 0x4c, 0x24, 0x20, 0x0f, 0x00, 0x04, 0x38, 0x71, 0x41, 0x7f, 0x18 };
// 0 1 2 3 4 5 6 7 8 9 F L U _ P
// ============================================
void Disp7_0(int num0, int up, int dot) {
int nnn = num0; byte dd = 00; if(!up) { nnn = _; }
if(bitRead(Pat[nnn], 6)) { bitSet(dd, 3); } // a
if(bitRead(Pat[nnn], 5)) { bitSet(dd, 2); } // b
if(bitRead(Pat[nnn], 4)) { bitSet(dd, 5); } // c
if(bitRead(Pat[nnn], 3)) { bitSet(dd, 4); } // d
if(bitRead(Pat[nnn], 2)) { bitSet(dd, 7); } // e
if(bitRead(Pat[nnn], 1)) { bitSet(dd, 1); } // f
if(bitRead(Pat[nnn], 0)) { bitSet(dd, 0); } // g
if(!dot) { bitSet(dd, 6); } SRset(dd);
}
void Disp7_2(int num2, int up) { // digit 2
int nnn = num2; if(!up) { nnn = _; };
digitalWrite( 7, bitRead(Pat[nnn], 6)); // a
digitalWrite( 8, bitRead(Pat[nnn], 5)); // b
digitalWrite(A5, bitRead(Pat[nnn], 4)); // c
digitalWrite(A3, bitRead(Pat[nnn], 3)); // d
digitalWrite(A4, bitRead(Pat[nnn], 2)); // e
digitalWrite( 6, bitRead(Pat[nnn], 1)); // f
digitalWrite(13, bitRead(Pat[nnn], 0)); // g
}
void Disp7_1(int num1, int up) { // digit 1
int nnn = num1; if(!up) { nnn = _; }
if(!dbg) digitalWrite(12, bitRead(Pat[nnn], 6)); // a
digitalWrite(11, bitRead(Pat[nnn], 5)); // b
digitalWrite( 2, bitRead(Pat[nnn], 4)); // c
digitalWrite( 1, bitRead(Pat[nnn], 3)); // d
digitalWrite( 0, bitRead(Pat[nnn], 2)); // e
digitalWrite(10, bitRead(Pat[nnn], 1)); // f
digitalWrite( 9, bitRead(Pat[nnn], 0)); // g
}
// ============================================
// AUTOOFF
// ============================================
void AutoOff() {
if(RUN < 2) { timerL = millis() + 600000; } // 10 min
else {
if(millis() > timerL) {
STOPreq = 1; RUN = 0;
tone(A0, 40, 40); delay(200); tone(A0, 40, 40); delay(200);
tone(A0, 40, 40); delay(200); tone(A0, 40, 40); delay(200);
RGBStartStop(RUN);
}
}
}
// ============================================
// DISPLAY
// ============================================
void RGBStartStop(int flg) {
leds[0] = CRGB(0,2,0);
if(flg == 1) leds[0] = CRGB(20,20,0); // pre heat
else if(flg == 2) leds[0] = CRGB(20, 0,0); // solder
FastLED.show();
}
void Disp() {
if(dispM == 0) { DispSeven(0, countT, 1000); }// TEMP countT
else if(dispM == 1) { DispSeven(0, countF + 1000, 1000); } // FAN countF
else if(dispM == 2) { DispSeven(0, countP + 1400, 1000); } // LIGHT count
}
// ============================================
// SWITCH READ
// ============================================
// XY PNL | OP PNL
// -----------------------------------
// A2:EXE SW | RGB LED
// A7:DN- | 0V: EXEC SW, 1.6V: DN-
// A6:UP+
int RUNsw() { if(analogRead(A7) < 200) return 1; else return 0; }
int UPsw() { if(analogRead(A6) < 200) return 1; else return 0; }
int DNsw() {
if(analogRead(A7) > 200 && analogRead(A7) < 800) {
delay(10); if(analogRead(A7) > 200 && analogRead(A7) < 800) { return 1; }
} return 0;
}
// ============================================
// Parameter Store Reload
//EEPROM adres 0 int countT - 100; // temp
//EEPROM adres 1 int countF; // fan
//EEPROM adres 2 int countP; // light
// ============================================
void StorePara() { // store TEMP/FAN/ LIGHT
//EEPROM.update(0, countT-100); delay(10);
//EEPROM.update(1, countF); delay(10);
//EEPROM.update(2, countP); delay(10);
}
void RestorePara() { // restore TEMP/FAN/LIGHT
//byte fff = EEPROM.read(1); // fan max 4
//byte ppp = EEPROM.read(2); // light max 8
//if(fff < 9 && ppp < 5) { //
//countT = EEPROM.read(0) + 100; // temp
//countF = EEPROM.read(1); // fan
//countP = EEPROM.read(2); // light
countF = 3; // fan
countP = 3; // light
//}
delay(500);
}
// ============================================
// IO assignment
// ============================================
// XY PNL | OP PNL
// -----------------------------------
// A2:EXE SW | RGB LED
// A7:DN- | 0V: MODE SW, 1.6V: DN-
// A6:UP+
// A0:BUZZ
// D5:7sg IO
// D4:7sg SCK
// D3:7sg SI
// A1:7sg RCK
// ============================================
// COMMANDS
// ============================================
// == IF =======================================
// MAIN TEMP( cmd0 adrsd) [countTr] current temp report to PNL
// PNL TEMP( M0 cmd0 adrsc) [countT] 0-255(+100) set from PNL/MOUSE
// FAN( M1 cmd1 adrsc) [countF] 0-32 set from PNL/MOUSE
// LIGNT(M4 cmd1 adrsd) [countP] 0-32 set from PNL
// CMD(Start/Stop cmd3 0xaa/0x55) start/stop from PNL/MOUSE
// ============================================
// XY Yaxis( cmd2 adrs0) [countY] 0-99 >> 0-199 (+lsb addrs bit2) MOUSE
// Xaxis( cmd2 adrs1) [countX] 0-99 >> 0-199 (+lsb addrs bit2) MOUSE
// ============================================
#define F 10 // FAN
#define _ 13 // blank
#define P 14 // LIGHT
// ============================================
// VALIABLES
// ============================================
int RUN = 0;
byte cnt = 0; byte ddd = 0; byte ccc = 0x0f; // Serial IF parameters
int countT = 100; // temp
int countF = 0; // fan
int countP = 0; // light
int countTr; // real temp
int dispM = 0; // display mode 0:temp, 1:fan, 2:light
20 projects • 33 followers
Chief Prototypist. 20+ years R&D experience in wide range of technology.
3 projects • 2 followers
Mechanical Engineer/ Industrial Designer/BJJ Fighter
Comments
Please log in or sign up to comment.