Masahiro MizunoTakayuki Saito
Published © GPL3+

REFLO Air

REFLO Air is The compact, open, and smart PCB reflow machine.

IntermediateFull instructions provided5 hours45
REFLO Air

Story

Read more

Custom parts and enclosures

Main gerber

PNL gerber

Schematics

Main Schematic

PNL schematic

Code

Main board program

Arduino
// 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

Panel board code

Arduino
// ============================================
// 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   
  

Credits

Masahiro Mizuno
20 projects • 33 followers
Chief Prototypist. 20+ years R&D experience in wide range of technology.
Contact
Takayuki Saito
3 projects • 2 followers
Mechanical Engineer/ Industrial Designer/BJJ Fighter
Contact

Comments

Please log in or sign up to comment.