rocketscream / Reflow-Oven-Controller

Arduino compatible reflow oven controller
129 stars 90 forks source link

udoo compatable? or noob issue? #5

Open htsauce opened 10 years ago

htsauce commented 10 years ago

hey yall thanks for checking in to my issue, any and all comments and insite is appretiated

i recently bought a reflow control sheild from rocket scream , http://www.rocketscream.com/shop/reflow-oven-controller-shield-arduino-compatible came in fast for malaisa,

code- https://github.com/rocketscream/Reflow-Oven-Controller

i have a preheater and a solder rework station with heat gun , i make a glass enclousuer , do i dont need the toser ovem , im focousing more on direct bga chip reflow, other rework components a plus, but over all that is the main objective , i was planning on useing this as a reflow or profile giude with a thermal coupple, so basicly i can watch it and adjust the heat according to the profile , and eventually hook up the ssr to be able to contol the entire prossess or at least the heat gun directly , but i got it as a visual representation of the profile and prossess,

any who , when i got it , i notice as far as the foot print , there are 2 pins that are un used , the scl and sda and can find them on the provided schmattic but theres no clue as to what they are or there function , on the top two pins on the upper right of the sheild , , im not sure if i need to jump these to another port? or if not needed,

http://www.rocketscream.com/datasheet/rocketscream/arduino/shield/rsReflowControllerShield/RS-REFLOW-CONTROLLER-SHIELD-1R80.pdf

any way , my issue is , with the provided code and the librarry files included that they say are required i still get a compileing error and it wont load

heres my error, im still new to the arduino language so it may be a simple human error issue , but i loaded it in directly , and expect theres may be some modification needed to run udoo or a change of components or librarrys in the code

the MAX31855.h file is present and is in the direct root of the library folder? im not shure where im goin wron , please and thank you for any and all help and advice

CODE: SELECT ALL Arduino: 0154 (Linux), Board: "Arduino Due (Programming Port)"

Using library LiquidCrystal in folder: /opt/arduino-1.5.4/libraries/LiquidCrystal

/opt/arduino-1.5.4/hardware/tools/arm-none-eabi/bin/arm-none-eabi-g++ -c -g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -Dprintf=iprintf -mcpu=cortex-m3 -DF_CPU=84000000L -DARDUINO=154 -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM -DSAM3X8E -mthumb -DUSB_VID=0x2341 -DUSB_PID=0x003e -DUSBCON -DUSB_MANUFACTURER="Unknown" -DUSB_PRODUCT="Arduino Due" -I/opt/arduino-1.5.4/hardware/arduino/sam/system/libsam -I/opt/arduino-1.5.4/hardware/arduino/sam/system/CMSIS/CMSIS/Include/ -I/opt/arduino-1.5.4/hardware/arduino/sam/system/CMSIS/Device/ATMEL/ -I/opt/arduino-1.5.4/hardware/arduino/sam/cores/arduino -I/opt/arduino-1.5.4/hardware/arduino/sam/variants/arduino_due_x -I/opt/arduino-1.5.4/libraries/LiquidCrystal/src /tmp/build3467053573229346857.tmp/reflowOvenController.cpp -o /tmp/build3467053573229346857.tmp/reflowOvenController.cpp.o reflowOvenController.ino:103:23: fatal error: MAX31855.h: No such file or directory compilation terminated.

origonal code CODE: SELECT ALL /***

// * INCLUDES *

include

ifdef USE_MAX31855

include

else

include

endif

include

// * TYPE DEFINITIONS * typedef enum REFLOW_STATE { REFLOW_STATE_IDLE, REFLOW_STATE_PREHEAT, REFLOW_STATE_SOAK, REFLOW_STATE_REFLOW, REFLOW_STATE_COOL, REFLOW_STATE_COMPLETE, REFLOW_STATE_TOO_HOT, REFLOW_STATE_ERROR } reflowState_t;

typedef enum REFLOW_STATUS { REFLOW_STATUS_OFF, REFLOW_STATUS_ON } reflowStatus_t;

typedef enum SWITCH { SWITCH_NONE, SWITCH_1,
SWITCH_2 } switch_t;

typedef enum DEBOUNCE_STATE { DEBOUNCE_STATE_IDLE, DEBOUNCE_STATE_CHECK, DEBOUNCE_STATE_RELEASE } debounceState_t;

// * CONSTANTS *

define TEMPERATURE_ROOM 50

define TEMPERATURE_SOAK_MIN 150

define TEMPERATURE_SOAK_MAX 200

define TEMPERATURE_REFLOW_MAX 250

define TEMPERATURE_COOL_MIN 100

define SENSOR_SAMPLING_TIME 1000

define SOAK_TEMPERATURE_STEP 5

define SOAK_MICRO_PERIOD 9000

define DEBOUNCE_PERIOD_MIN 50

// * PID PARAMETERS * // * PRE-HEAT STAGE *

define PID_KP_PREHEAT 100

define PID_KI_PREHEAT 0.025

define PID_KD_PREHEAT 20

// * SOAKING STAGE *

define PID_KP_SOAK 300

define PID_KI_SOAK 0.05

define PID_KD_SOAK 250

// * REFLOW STAGE *

define PID_KP_REFLOW 300

define PID_KI_REFLOW 0.05

define PID_KD_REFLOW 350

define PID_SAMPLE_TIME 1000

// * LCD MESSAGES * const char* lcdMessagesReflowStatus[] = { "Ready", "Pre-heat", "Soak", "Reflow", "Cool", "Complete", "Wait,hot", "Error" };

// * DEGREE SYMBOL FOR LCD * unsigned char degree[8] = { 140,146,146,140,128,128,128,128};

// * PIN ASSIGNMENT *

ifdef USE_MAX31855

int ssrPin = 5; int thermocoupleSOPin = A3; int thermocoupleCSPin = A2; int thermocoupleCLKPin = A1; int lcdRsPin = 7; int lcdEPin = 8; int lcdD4Pin = 9; int lcdD5Pin = 10; int lcdD6Pin = 11; int lcdD7Pin = 12; int ledRedPin = 4; int buzzerPin = 6; int switchPin = A0;

else

int ssrPin = 5; int thermocoupleSOPin = A5; int thermocoupleCSPin = A4; int thermocoupleCLKPin = A3; int lcdRsPin = 7; int lcdEPin = 8; int lcdD4Pin = 9; int lcdD5Pin = 10; int lcdD6Pin = 11; int lcdD7Pin = 12; int ledRedPin = A1; int ledGreenPin = A0; int buzzerPin = 6; int switch1Pin = 2; int switch2Pin = 3;

endif

// * PID CONTROL VARIABLES * double setpoint; double input; double output; double kp = PID_KP_PREHEAT; double ki = PID_KI_PREHEAT; double kd = PID_KD_PREHEAT; int windowSize; unsigned long windowStartTime; unsigned long nextCheck; unsigned long nextRead; unsigned long timerSoak; unsigned long buzzerPeriod; // Reflow oven controller state machine state variable reflowState_t reflowState; // Reflow oven controller status reflowStatus_t reflowStatus; // Switch debounce state machine state variable debounceState_t debounceState; // Switch debounce timer long lastDebounceTime; // Switch press status switch_t switchStatus; // Seconds timer int timerSeconds;

// Specify PID control interface PID reflowOvenPID(&input, &output, &setpoint, kp, ki, kd, DIRECT); // Specify LCD interface LiquidCrystal lcd(lcdRsPin, lcdEPin, lcdD4Pin, lcdD5Pin, lcdD6Pin, lcdD7Pin); // Specify MAX6675 thermocouple interface

ifdef USE_MAX31855

MAX31855 thermocouple(thermocoupleSOPin, thermocoupleCSPin, thermocoupleCLKPin);

else

MAX6675 thermocouple(thermocoupleCLKPin, thermocoupleCSPin, thermocoupleSOPin);

endif

void setup() { // SSR pin initialization to ensure reflow oven is off digitalWrite(ssrPin, LOW); pinMode(ssrPin, OUTPUT);

// Buzzer pin initialization to ensure annoying buzzer is off digitalWrite(buzzerPin, LOW); pinMode(buzzerPin, OUTPUT);

// LED pins initialization and turn on upon start-up (active low) digitalWrite(ledRedPin, LOW); pinMode(ledRedPin, OUTPUT);

ifdef USE_MAX6675

// LED pins initialization and turn on upon start-up (active low)
digitalWrite(ledGreenPin, LOW);  
  pinMode(ledGreenPin, OUTPUT);
  // Switch pins initialization
  pinMode(switch1Pin, INPUT);
  pinMode(switch2Pin, INPUT);

endif

// Start-up splash digitalWrite(buzzerPin, HIGH); lcd.begin(8, 2); lcd.createChar(0, degree); lcd.clear(); lcd.print("Reflow"); lcd.setCursor(0, 1); lcd.print("Oven 1.2"); digitalWrite(buzzerPin, LOW); delay(2500); lcd.clear();

// Serial communication at 57600 bps Serial.begin(57600);

// Turn off LED (active low) digitalWrite(ledRedPin, HIGH);

ifdef USE_MAX6675

  digitalWrite(ledGreenPin, HIGH);

endif

// Set window size windowSize = 2000; // Initialize time keeping variable nextCheck = millis(); // Initialize thermocouple reading variable nextRead = millis(); }

void loop() { // Current time unsigned long now;

// Time to read thermocouple? if (millis() > nextRead) { // Read thermocouple next sampling period nextRead += SENSOR_SAMPLING_TIME; // Read current temperature

ifdef USE_MAX31855

     input = thermocouple.readThermocouple(CELSIUS);
  #else
     input = thermocouple.readCelsius();
  #endif
// If thermocouple problem detected
  #ifdef   USE_MAX6675
     if (isnan(input))
  #else
     if((input == FAULT_OPEN) || (input == FAULT_SHORT_GND) || 
         (input == FAULT_SHORT_VCC))
#endif
  {
  // Illegal operation
  reflowState = REFLOW_STATE_ERROR;
  reflowStatus = REFLOW_STATUS_OFF;
}

}

if (millis() > nextCheck) { // Check input in the next seconds nextCheck += 1000; // If reflow process is on going if (reflowStatus == REFLOW_STATUS_ON) { // Toggle red LED as system heart beat digitalWrite(ledRedPin, !(digitalRead(ledRedPin))); // Increase seconds timer for reflow curve analysis timerSeconds++; // Send temperature and time stamp to serial Serial.print(timerSeconds); Serial.print(" "); Serial.print(setpoint); Serial.print(" "); Serial.print(input); Serial.print(" "); Serial.println(output); } else { // Turn off red LED digitalWrite(ledRedPin, HIGH); }

// Clear LCD
lcd.clear();
// Print current system state
lcd.print(lcdMessagesReflowStatus[reflowState]);
// Move the cursor to the 2 line
lcd.setCursor(0, 1);

// If currently in error state
if (reflowState == REFLOW_STATE_ERROR)
{
  // No thermocouple wire connected
  lcd.print("TC Error!");
}
else
{
  // Print current temperature
  lcd.print(input);

     #if ARDUINO >= 100
        // Print degree Celsius symbol
        lcd.write((uint8_t)0);
     #else
        // Print degree Celsius symbol
        lcd.print(0, BYTE);
     #endif
  lcd.print("C ");
}

}

// Reflow oven controller state machine switch (reflowState) { case REFLOW_STATE_IDLE: // If oven temperature is still above room temperature if (input >= TEMPERATURE_ROOM) { reflowState = REFLOW_STATE_TOO_HOT; } else { // If switch is pressed to start reflow process if (switchStatus == SWITCH_1) { // Send header for CSV file Serial.println("Time Setpoint Input Output"); // Intialize seconds timer for serial debug information timerSeconds = 0; // Initialize PID control window starting time windowStartTime = millis(); // Ramp up to minimum soaking temperature setpoint = TEMPERATURE_SOAK_MIN; // Tell the PID to range between 0 and the full window size reflowOvenPID.SetOutputLimits(0, windowSize); reflowOvenPID.SetSampleTime(PID_SAMPLE_TIME); // Turn the PID on reflowOvenPID.SetMode(AUTOMATIC); // Proceed to preheat stage reflowState = REFLOW_STATE_PREHEAT; } } break;

case REFLOW_STATE_PREHEAT: reflowStatus = REFLOW_STATUS_ON; // If minimum soak temperature is achieve
if (input >= TEMPERATURE_SOAK_MIN) { // Chop soaking period into smaller sub-period timerSoak = millis() + SOAK_MICRO_PERIOD; // Set less agressive PID parameters for soaking ramp reflowOvenPID.SetTunings(PID_KP_SOAK, PID_KI_SOAK, PID_KD_SOAK); // Ramp up to first section of soaking temperature setpoint = TEMPERATURE_SOAK_MIN + SOAK_TEMPERATURE_STEP;
// Proceed to soaking state reflowState = REFLOW_STATE_SOAK; } break;

case REFLOW_STATE_SOAK:
// If micro soak temperature is achieved
if (millis() > timerSoak) { timerSoak = millis() + SOAK_MICRO_PERIOD; // Increment micro setpoint setpoint += SOAK_TEMPERATURE_STEP; if (setpoint > TEMPERATURE_SOAK_MAX) { // Set agressive PID parameters for reflow ramp reflowOvenPID.SetTunings(PID_KP_REFLOW, PID_KI_REFLOW, PID_KD_REFLOW); // Ramp up to first section of soaking temperature setpoint = TEMPERATURE_REFLOW_MAX;
// Proceed to reflowing state reflowState = REFLOW_STATE_REFLOW; } } break;

case REFLOW_STATE_REFLOW: // We need to avoid hovering at peak temperature for too long // Crude method that works like a charm and safe for the components if (input >= (TEMPERATURE_REFLOW_MAX - 5)) { // Set PID parameters for cooling ramp reflowOvenPID.SetTunings(PID_KP_REFLOW, PID_KI_REFLOW, PID_KD_REFLOW); // Ramp down to minimum cooling temperature setpoint = TEMPERATURE_COOL_MIN;
// Proceed to cooling state reflowState = REFLOW_STATE_COOL; } break;

case REFLOW_STATE_COOL: // If minimum cool temperature is achieve
if (input <= TEMPERATURE_COOL_MIN) { // Retrieve current time for buzzer usage buzzerPeriod = millis() + 1000; // Turn on buzzer and green LED to indicate completion

ifdef USE_MAX6675

        digitalWrite(ledGreenPin, LOW);
  #endif
     digitalWrite(buzzerPin, HIGH);
  // Turn off reflow process
  reflowStatus = REFLOW_STATUS_OFF;  
  // Proceed to reflow Completion state
  reflowState = REFLOW_STATE_COMPLETE; 
}  
break;    

case REFLOW_STATE_COMPLETE: if (millis() > buzzerPeriod) { // Turn off buzzer and green LED digitalWrite(buzzerPin, LOW);

ifdef USE_MAX6675

        digitalWrite(ledGreenPin, HIGH);
     #endif
     // Reflow process ended
  reflowState = REFLOW_STATE_IDLE; 
}
break;

case REFLOW_STATE_TOO_HOT: // If oven temperature drops below room temperature if (input < TEMPERATURE_ROOM) { // Ready to reflow reflowState = REFLOW_STATE_IDLE; } break;

case REFLOW_STATE_ERROR: // If thermocouple problem is still present

ifdef USE_MAX6675

     if (isnan(input))
  #else
     if((input == FAULT_OPEN) || (input == FAULT_SHORT_GND) || 
         (input == FAULT_SHORT_VCC))
#endif
{
  // Wait until thermocouple wire is connected
  reflowState = REFLOW_STATE_ERROR; 
}
else
{
  // Clear to perform reflow process
  reflowState = REFLOW_STATE_IDLE; 
}
break;  

}

// If switch 1 is pressed if (switchStatus == SWITCH_1) { // If currently reflow process is on going if (reflowStatus == REFLOW_STATUS_ON) { // Button press is for cancelling // Turn off reflow process reflowStatus = REFLOW_STATUS_OFF; // Reinitialize state machine reflowState = REFLOW_STATE_IDLE; } }

// Simple switch debounce state machine (for switch #1 (both analog & digital // switch supported)) switch (debounceState) { case DEBOUNCE_STATE_IDLE: // No valid switch press switchStatus = SWITCH_NONE; // If switch #1 is pressed

ifdef USE_MAX6675

     if (digitalRead(switch1Pin) == LOW)
  #else
     if (analogRead(switchPin) == 0)
  #endif
     {
        // Intialize debounce counter
        lastDebounceTime = millis();
        // Proceed to check validity of button press
        debounceState = DEBOUNCE_STATE_CHECK;
     }  
break;

case DEBOUNCE_STATE_CHECK:

ifdef USE_MAX6675

     // If switch #1 is still pressed
     if (digitalRead(switch1Pin) == LOW)
  #else
     if (analogRead(switchPin) == 0)
  #endif
     {
        // If minimum debounce period is completed
        if ((millis() - lastDebounceTime) > DEBOUNCE_PERIOD_MIN)
        {
           // Proceed to wait for button release
           debounceState = DEBOUNCE_STATE_RELEASE;
        }
     }
     // False trigger
     else
     {
        // Reinitialize button debounce state machine
        debounceState = DEBOUNCE_STATE_IDLE; 
     }
break;

case DEBOUNCE_STATE_RELEASE:

ifdef USE_MAX6675

     if (digitalRead(switch1Pin) == HIGH)
#else
     if (analogRead(switchPin) > 0)
  #endif
  {
  // Valid switch 1 press
  switchStatus = SWITCH_1;
  // Reinitialize button debounce state machine
  debounceState = DEBOUNCE_STATE_IDLE; 
}
break;

}

// PID computation and SSR control if (reflowStatus == REFLOW_STATUS_ON) { now = millis();

reflowOvenPID.Compute();

if((now - windowStartTime) > windowSize)
{ 
  // Time to shift the Relay Window
  windowStartTime += windowSize;
}
if(output > (now - windowStartTime)) digitalWrite(ssrPin, HIGH);
else digitalWrite(ssrPin, LOW);   

} // Reflow oven process is off, ensure oven is off else { digitalWrite(ssrPin, LOW); } }

please and thank you

verry much htsauce

neilyboy commented 10 years ago

You need to install the required libraries. Watch a YouTube video on arduino library install. Then read the program comments about the three or four required libraries. The last error you see "MAX31855.h: No such file or directory compilation terminated." Indicates you need the max31855 library as well. There are links in the program comments to download them. Take care.

htsauce commented 10 years ago

Thank you, I got it working, it was also a issue with the 3v and 5v thing, I ended up getting an uno for this application, instead of my udoo quad Thank you for the reply, I loaded the libraries in and it worked like a charm Thanks again,

Hey , whats it like workin at gethub? Place seems pretty friggin cool lol

--- Original Message ---

From: "neilyboy" notifications@github.com Sent: November 10, 2014 12:28 AM To: "rocketscream/Reflow-Oven-Controller" Reflow-Oven-Controller@noreply.github.com Cc: "HTSauce" vincentsodini@live.com Subject: Re: [Reflow-Oven-Controller] udoo compatable? or noob issue? (#5)

You need to install the required libraries. Watch a YouTube video on arduino library install. Then read the program comments about the three or four required libraries. The last error you see "MAX31855.h: No such file or directory compilation terminated." Indicates you need the max31855 library as well. There are links in the program comments to download them. Take care.


Reply to this email directly or view it on GitHub: https://github.com/rocketscream/Reflow-Oven-Controller/issues/5#issuecomment-62354209

neilyboy commented 10 years ago

I don't work for github lol. I'm just an end user like yourself. I actually just ordered my reflow controller a couple of days ago.looking forward to setting it up myself.

htsauce commented 10 years ago

Haha sweet, yeah it worked awesome, You need the ssd. And the thermocouples kinda touchy from there site any ways its kinda thin,

What oven and ssr did you go with?

Ultimately im trying to mod my preheat bed, and my rework station to be controlled automatically but atleast for a guide for like gba reflow , reworking, , gpu chips and other

--- Original Message ---

From: "neilyboy" notifications@github.com Sent: November 11, 2014 6:59 AM To: "rocketscream/Reflow-Oven-Controller" Reflow-Oven-Controller@noreply.github.com Cc: "HTSauce" vincentsodini@live.com Subject: Re: [Reflow-Oven-Controller] udoo compatable? or noob issue? (#5)

I don't work for github lol. I'm just an end user like yourself. I actually just ordered my reflow controller a couple of days ago.looking forward to setting it up myself.


Reply to this email directly or view it on GitHub: https://github.com/rocketscream/Reflow-Oven-Controller/issues/5#issuecomment-62558324