/*
  Project:  THC for Plasma CNC controller
  Platform: Arduino UNO R3
  Created:  April 2015
  Version:  02.00
  By:       Pham Duy Anh - [email protected]

  Update and changes
  By: Mehmet İbrahim - [email protected]
  Youtube: https://www.youtube.com/c/MehmetIbrahim

  Require:
  -> input
  <- output

  -> serial Tx
  -> serial Rx
  -> reset

  -> rotary encoder      digital - interrupt
  -> rotary encoder      digital - interrupt
  -> totary button       digital

  -> plasma Torch on     digital
  -> plasma Arc Ok       analog or digital)
  -> plasma arc voltage  analog 0-5V

  <- Arc Ok              optocoupler
  <- torch Up            optocoupler
  <- torch Down          optocuopler

  <- LCD
  <- LCD
  <- LCD
  <- LCD
  <- LCD
  <- LCD
*/

#define encoderPinA     2                 //PORTD 2 - INT0
#define encoderPinB     3                 //PORTD 3 - INT1
#define buttonPin       8                 //PORTD 4

#define outputDirPin    9                 //PORTD 5
#define outputPulPin    10                 //PORTD 6

#define relayDir        4                 //PORTD 7
#define relayPul        5                 //PORTB 0
#define relay5V         6                 //PORTB 1
#define relayEN         7

#define arcVoltPin      A0                //PORTC 0
#define speedPot        A1                //PORTC 1

#define defaultLCDtime  500               // s * 100

/*
  Parameter
   DT  - Delay time - Delay time of output closed despite no supply voltage, when the system detects the main (cutting) arc, 0.1~19.9s.
   HyS - Hysreresis - The hysteresis voltage - a rangge in which the voltage is measured, in which ther are signals controlling Up/Down, (+-1V ~ +-15V)
   StV - Started Voltage - Value of the off load voltage detection in the plasma cutter - uesd to detect the main (cutting) arc: 50~300V.
   +

*/

int SetVa = 0, DTa = 1, HySa = 2, StVa = 3;

int SetV, DT, HyS, StV;

//(divRato) It is a value that varies depending on the voltage divider you use, a low value increases Arc.V, a high value decreases it.
//The welding machine gives continuous output. Comparison can be made by connecting the voltage divider to the welding machine :)
//int divRato = 43;
//int divRato = 39;
int divRato = 39;

unsigned long ArcV;
int oldValue;


//Taking Average read voltage (values)
bool takingAverage = false; //Read the voltage with a few examples true or false
//10 samples readings will be taken and averaged to arch voltage read
int sampleReadV = 10; //10 samples
unsigned int millisdelayReadV = 3; // Waiting time for between samples readings  [ms]
int counterVo = 0;
unsigned long readVMillis;
unsigned long prevReadVMillis = 0;
unsigned long readingsV = 0;

//stepper motor signal frequency
unsigned int fregCy = 2000;  // Motor speed potentiometer min 33 max 65535

bool reverse = false;    // If the movement is reversed in the test menu, change it (true or false)

int thcOK = 0, thcUp = 0, thcDwn = 0;

int program;

// Array of Param
//              SetV, DT, HYS, StV, divRato,
// Param Address   0,  1,   2,   3,       4,
int Param[4] = {SetV, DT, HyS, StV};//, divRato};
byte ParamItem = 4;

// Enable to do THC
boolean Do;
boolean DoStepper;

// Encoder, menu, pos
int encoderVal;
byte menu = 0;
byte pos  = 0;
byte show = 0;
unsigned int LCDtime = 0;

void setup()
{
  Setup_Encoder();
  Setup_LCD();
  Setup_Stepper();
  Setup_Timer1();
  
  //Read parameter from EEPROM
  ReadProg();
  if (program == 255){ // Configure eeprom defaults on first boot
    Default();
    ReadProg(); //Now read the parameters again
  }
  switch (program)
  {
    case 1:
      ReadDataProg_1();
      break;
    case 2:
      ReadDataProg_2();
      break;
    case 3:
      ReadDataProg_3();
      break;
  }

  //Set value for all parameter
  SetV = Param[SetVa];
  DT   = Param[DTa];
  HyS  = Param[HySa];
  StV  = Param[StVa];
  //Preset value for encoder
  encoderVal = SetV;
  //Serial.begin(9600);
}

void loop()
{
  //Read voltage
  if (takingAverage)
  {
    // Read Average voltage value from ADC
    readVMillis = millis();
    if (readVMillis - prevReadVMillis >= millisdelayReadV)
    {
      prevReadVMillis = readVMillis;
      counterVo++;
      readingsV += double(analogRead(arcVoltPin)) * double(100.00 / divRato);
    }
    if (counterVo == sampleReadV)
    {
      ArcV = readingsV / sampleReadV;
      counterVo = 0;
      readingsV = 0;
    }

  } else {
    // Read voltage value from ADC
    ArcV = double(analogRead(arcVoltPin)) * double(100.00 / divRato);
  }

  checkButton();
  checkMenu();
  doTHC();
  doLCD();
  RunStepper();

  //RS232();
}
A4988
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module