0

MAX31855 problems, unstable readings,
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Tue Jan 29, 2019 2:45 pm

You can post it here. Click on the [code] button and paste the code between the tags.

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Tue Jan 29, 2019 3:01 pm

Hi,

Please excuse a perhaps silly question. I am new to this business. Where is the [code] button?

Colin

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Tue Jan 29, 2019 3:23 pm

Right above the edit box for posting messages.

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Tue Jan 29, 2019 3:35 pm

Got it! Here is the code. It is too big to send in one message, so here is the first part. Second part will be in the next post.

It is a 5 step program to raise the temperature of the kiln in a controlled way. There are hold and soak periods to allow the contents of the kiln to stabilise, temperature wise.

The extension cable that I used is not an "thermocouple extension" cable but the readings seem to be plausible. The conductor seems to be tinned (silvery, anyway).

It seems to me that the Max board is throwing faults when the input voltage is about 40 - 50 mV. Quite why it seems to be getting skittish at that temperature is not clear to me. It seems to be consistent in throwing non-zero IsNaNs frrom 900 degrees upwards only

Colin

Code: Select all | TOGGLE FULL SIZE
//*****    USER SETTINGS     *****
 
  float Stage1TempStop = 200.;                                 //   200 for production
    float Stage2TempStop = 275.;                               //   275 for production
      float Stage3TempStop = 575.;                             //   575 for production
        float Stage4TempStop = 1200.;                          //  1100 for production
          float Stage5TempStop = 1000.;                         //  1080 for production
 
 
  float Stage1HeatingRate = 500.;         
    float Stage2HeatingRate = 240.;                            //  Heating rate for each Stage firing      degrees per hour
      float Stage3HeatingRate = 500.;           
        float Stage4HeatingRate = 400.;             
          float Stage5HeatingRate = 200.;             
       
  int iWait1 = 1;             
    int iWait2 = 1;                                            //   duration in minutes of soak period after each  stage    10 for production
      int iWait3 = 1;             
        int iWait4 = 1;             
          int iWait5 = 1;             
 
  //*****   PROGRAM SETTINGS     ******
 
  float Stage1TempStart;                                       //  Ambient temp and start temp for Stage 1

  float Stage1Time;                 
    float Stage2Time;                                          //   Calculated duration of each stage in minutes     
      float Stage3Time;                               
        float Stage4Time;                 
          float Stage5Time;                             
 
 float Stage1TempSteps;
   float Stage2TempSteps;                                      //  Calculated step in temperature, per stage
     float Stage3TempSteps;
        float Stage4TempSteps;
          float Stage5TempSteps;
 
  double Temp;                                                //  measured temperature
  double Temp1;                                                //  place holder for bad temp reading
  float  TempLimit;                                            //  upper limit temp for each burn
  float  TempLimitMod;                                         //  modified upper limit temp for each burn
                                                               //  Place holder for modified upper limit temp for each burn
  float  StageTimeSeconds;
  float  Soakpr;                                                //  remaining soaking time
 
  int iStage1Steps = 3;
    int iStage2Steps = 3;                                     //  number of steps per stage
      int iStage3Steps = 3;
        int iStage4Steps = 3;
          int iStage5Steps = 3;

   int    i;                                                   //  counter for the steps for each Stage
   int    iBurnCount = 0;                                      // counter of number of burns
   
   int    iCheckPeriod = 10000;                                // period between temp measurements (milliseconds)   
   int    j;                                                   // counter for progress through the step
   int    k ;                                                  // counter for step delay
     
   int    idelayt;
   int    idelayt1;
   int    idelaytpr;
   
   int    idx ;
   int    iburnTime;                                           //  duration of each burn in total
   int    iburnTime1 ;
   int    iStage;                                              //  duration of stage in seconds
   
   int    iHoldingTime ;
   
   int    iKiln = 7;                                           //  Pin for the relay to switch kiln on/off
   
  //*****     set up the thermocouple library

   #include "Adafruit_MAX31855.h"
   int ithermoDO =  3;
   int ithermoCS =  4;
   int ithermoCLK = 5;
   
   Adafruit_MAX31855 thermocouple(ithermoCLK, ithermoCS, ithermoDO);


//*****     set up the LCD library

   #include <Wire.h>

   #include <LiquidCrystal_I2C.h>     

   LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

   
void setup()
{
   
   delay(500);                                                 //   allow MAX chip to stabilise
   
   Serial.begin(9600);                                         //   Initilise the serial comms port

   lcd.begin(16,2);                                            //   2 line LCD, 16 characters per line
   
   pinMode (iKiln,OUTPUT);                                     //   for switching the kiln On or Off
   

   //*****   do the dynamic set up and then start   
   
   Stage1TempStart = thermocouple.readCelsius();               // get ambient temp before firing
 
   if (isnan(Stage1TempStart))
                 {Serial.print("*****   Error code:  ");  Serial.println(thermocouple.readError());
                 Stage1TempStart = 20.;}
                 
   Stage1Time = (Stage1TempStop - Stage1TempStart)/ (Stage1HeatingRate / 60.);
     Stage2Time = (Stage2TempStop - Stage1TempStop)/ (Stage2HeatingRate / 60.);     //  calculate duration of each stage in minutes
       Stage3Time = (Stage3TempStop - Stage2TempStop)/ (Stage3HeatingRate / 60.);
         Stage4Time = (Stage4TempStop - Stage3TempStop)/ (Stage4HeatingRate / 60.);
           Stage5Time = (Stage5TempStop - Stage4TempStop)/ (Stage5HeatingRate / 60.);

   
   Stage1TempSteps = (Stage1TempStop - Stage1TempStart)/float(iStage1Steps); 
     Stage2TempSteps = (Stage2TempStop - Stage1TempStop)/float(iStage2Steps);       //   calculate the size of each temp rise per step
        Stage3TempSteps = (Stage3TempStop - Stage2TempStop)/float(iStage3Steps);
         Stage4TempSteps = (Stage4TempStop - Stage3TempStop)/float(iStage4Steps);
           Stage5TempSteps = (Stage5TempStop - Stage4TempStop)/float(iStage5Steps);

 
         
   lcd.clear    ();                                             //
   lcd.setCursor(0,0);                                          //  print the ambient temperature
   
   lcd.print    ("Ambient ");               lcd.print(Stage1TempStart,0);  //

   Serial.print("Ambient temperature:  ");  Serial.print(Stage1TempStart,0);
     
   delay(2000);

   iburnTime1 = iCheckPeriod/1000;                              //   length of wait time (elapsed time) in seconds

 //  *****   Stage 1 firing   *****
       
   TempLimit = Stage1TempStart;                                 //  establish the lower limit
 
   for (i = 1; i <= iStage1Steps; i = i + 1  )
       {
          j = 0;                                                //   counter for number of burns
         
          TempLimit = TempLimit + Stage1TempSteps ;             /*  the real TempLimit for this stage
                                                                    TempLimitMod is the setting which allows for overshoot   */       
          if (i < 3) {TempLimitMod = TempLimit - 10. ;}         //  allow some margin for first 2 steps as the temp won't be high enough
                   else {TempLimitMod = TempLimit - 25.;}       //  calculate modified upperlimit for this step
                                                                //  makes provison for temperature overshoot
                   
          Temp1 = thermocouple.readCelsius();

          if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
         
          Serial.print("Temp: ");               Serial.print(Temp,0);   
          Serial.print("  Stage 1:  Step: ");   Serial.print(i);           
          Serial.print("  Limit: ");            Serial.println(TempLimit,0);
             
          lcd.clear    ();
          lcd.setCursor(0,0);
          lcd.print    ("Stage 1 T ");   lcd.print(Temp,0);
         
          lcd.setCursor(13,1);           lcd.print(" ");        //  blank out 13th character (LSD of temps above 100)
          lcd.setCursor(0,1);
          lcd.print    ("Step ");        lcd.print(i);       lcd.print( " Lmt ");    lcd.print(TempLimit,0);
               
          while (Temp <= TempLimitMod)
             { 
                digitalWrite (iKiln,HIGH);                      //  switch heaters on
                iBurnCount = iBurnCount + 1;                    //   how many burns in total

                delay(iCheckPeriod);
                               
                j = j + 1;                                      //  Stage burn counter
               
                Temp1 = thermocouple.readCelsius();              //  get the temperature
               
               if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
                Serial.print("Temp: ");       Serial.print  (Temp,0);         
                Serial.print(" ( ") ;         Serial.print  (iBurnCount);    Serial.print(" )");
                Serial.print("  Limit: ");    Serial.println(TempLimit,0);
                   
                lcd.clear    ();
                lcd.setCursor(13,1);           lcd.print(" ");              //  blank out 13th character (LSD of temps above 100)
                lcd.setCursor(0,0);
               
                lcd.print    ("Stage 1 T ");   lcd.print(Temp,0);
               
                lcd.setCursor(0,1);
                lcd.print    ("Step ");        lcd.print(i);      lcd.print( " Lmt ");    lcd.print(TempLimit,0);
             }
       
          digitalWrite(iKiln,LOW);                              //  Reached step temp so switch kiln off
   
      //  temp for this step is reached, wait for step time to elapse
     
          iburnTime = iburnTime1 * j;                           //  length of burn time in seconds
          StageTimeSeconds = Stage1Time * 60.;                  //  stage time in seconds   (float)
          iStage = int(StageTimeSeconds);                       //  stage time in seconds    (integer)
         
          idelayt = iStage/iStage1Steps - iburnTime ;           // delay time in seconds for this step
          idelaytpr = idelayt;                                  //  remaining time for printing
         
          lcd.clear    ();
          lcd.setCursor(0,0);
          lcd.print    ("Hold  ");              lcd.print(idelaytpr);    lcd.print( " s");
         
          lcd.setCursor(13,1);                  lcd.print(" ");      //  blank out 13th character (LSD of temps above 100)
          lcd.setCursor(0,1);                                   // start reporting on the second line
          lcd.print    ("Hold temp ");          lcd.print(Temp,0);
         
          Serial.print ("Temp: ");              Serial.print(Temp,0);
          Serial.print ("  Hold for ");         Serial.print(idelaytpr);     Serial.println( " s"); 
                   
          idelayt1 = idelayt/iburnTime1;                          //  duration of hold in "check periods"
             
          for (k = 1; k <= idelayt1; k = k + 1 )
            {
              delay(iCheckPeriod);
              Temp1 = thermocouple.readCelsius();              //  get the temperature
               
               if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
             
              idelaytpr = idelaytpr - iburnTime1 ;                // time remaining for the hold
             
              lcd.clear    ();
              lcd.setCursor(0,0);
              lcd.print    ("Hold  ");          lcd.print(idelaytpr);        lcd.print( " s");
              lcd.setCursor(13,1);              lcd.print(" ");              //  blank out 13th character (LSD of temps above 100)
              lcd.setCursor(0,1);                                 // start reporting on the second line
             
              lcd.print("Hold temp ");          lcd.print(Temp,0);
             
              Serial.print("Temp: ");           Serial.print(Temp,0);
              Serial.print("  Hold for ");      Serial.print(idelaytpr);     Serial.println( " s");
                             
              while (Temp <= TempLimitMod)
                 { 
                    digitalWrite (iKiln,HIGH);                      //  switch heaters on
                    iBurnCount = iBurnCount + 1;                    //   how many burns
                   
                    delay(iCheckPeriod);
                   
                    Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                    {    Serial.print("*****   Error code:  "); 
                         Serial.println(thermocouple.readError());
                    }
                    else Temp = Temp1;
                   
                    idelaytpr = idelaytpr - iburnTime1 ;                // time remaining for the hold
                   
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Hold  ");             lcd.print(idelaytpr);        lcd.print( " s");
                   
                    lcd.setCursor(13,1);                 lcd.print(" ");              //  blank out 13th character (LSD of temps above 100)
                    lcd.setCursor(0,1);                           // start reporting on the second line
                    lcd.print    ("Hold temp ");         lcd.print(Temp,0);
                   
                    Serial.print ("Temp: ");             Serial.print(Temp,0);
                    Serial.print ("  Hold for ");        Serial.print(idelaytpr);      Serial.print( " s  ");
                    Serial.print (" ( ") ;               Serial.print(iBurnCount);     Serial.println(" )");
                   
                    k = k + 1;
                 } 

              digitalWrite(iKiln,LOW);                            //  Reached step temp so switch kiln off
           
            }                                                     //  k loop
           
       }                                                          //  i loop
     
   //  temp for this stage is reached, now start soaking
   
   Soakpr = float(iWait1)* 60.;                                   //  soak time in seconds
   
   lcd.clear    ();
   lcd.setCursor(0,0);
   lcd.print    ("Soaking  ");            lcd.print(float(iWait1),11);  lcd.print     (" min");
   
   lcd.setCursor(13,1);                   lcd.print(" ");           //  blank out 13th character (LSD of temps above 100)
   lcd.setCursor(0,1);                                            // start reporting on the second line
               
   lcd.print    ("Soak  ");               lcd.print(Temp,0);
   
   Serial.print ("Temp: ");               Serial.print(Temp,0);
   Serial.print ("  Soaking  for ");      Serial.print(float(iWait1),1);    Serial.println(" minutes");
     
   idx = iWait1 * 60 /(iCheckPeriod/1000);          //  calculate number of iCheckPeriods to soak
           
   for (k = 1; k <= idx; k = k + 1 )
         {
               delay(iCheckPeriod);
               Temp1 = thermocouple.readCelsius();              //  get the temperature
               
               if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
               Soakpr = Soakpr - iburnTime1 ;
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print    ("Soak for  ");         lcd.print   (Soakpr/60.,1);  lcd.print     (" min");
               
               lcd.setCursor(13,1);                 lcd.print(" ");   //  blank out 13th character (LSD of temps above 100)
               lcd.setCursor(0,1);                                 // start reporting on the second line
               
               lcd.print    ("Soak  ");             lcd.print(Temp,0);

               Serial.print ("Temp: ");             Serial.print(Temp,0);
               Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.println(" minutes");
                               
               while (Temp <= TempLimitMod)
                  { 
                     digitalWrite (iKiln,HIGH);                      //  switch heaters on
                     iBurnCount = iBurnCount + 1;                    //   how many burns
                     
                     delay(iCheckPeriod);
                     
                     Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                     if (isnan(Temp1))
                      {    Serial.print("*****   Error code:  "); 
                           Serial.println(thermocouple.readError());
                      }
                       else Temp = Temp1;
                                         
                     Soakpr = Soakpr - iburnTime1 ;
                     
                     if ( k > idx ) { digitalWrite(iKiln,LOW);   break; }         //   exit if k loop conditions are met
                     lcd.setCursor(13,1);                  lcd.print(" ");        //  blank out 13th character (LSD of temps above 100)
                     lcd.setCursor(0,1);                                          // start reporting on the second line
                     lcd.print    ("Soaking ");           lcd.print(Temp,0);
             
                     Serial.print ("Temp: ");             Serial.print(Temp,0);
                     Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.print(" minutes");
                     Serial.print (" ( ") ;               Serial.print(iBurnCount);    Serial.println(" )");
                                             
                     k = k + 1;
                  } 

               digitalWrite(iKiln,LOW);                           //  Reached step temp so switch kiln off
            }
               
   //*****   Stage 2 firing   *****
       
   TempLimit = Stage1TempStop;                                   //  lower limit
 
   for (i = 1; i <= iStage2Steps; i = i + 1  )
        {
            j = 0;;                                               //   counter for number of burns
           
            TempLimit = TempLimit + Stage2TempSteps ;            //  the real TempLimit for this stage
         
            TempLimitMod = TempLimit;                            //   calculate modified upperlimit for this step
                   
            Temp1 = thermocouple.readCelsius();                  //  get the temperature
               
            if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
           
            Serial.print("Temp: ");   Serial.print(Temp,0);
            Serial.print("  Stage 2:  Step   "); Serial.print(i);    Serial.print("  Limit: ");    Serial.println(TempLimit,0);
               
            lcd.clear    ();
            lcd.setCursor(0,0);
            lcd.print    ("Stage 2 T ");  lcd.print(Temp,0);       
            lcd.setCursor(0,1);           
            lcd.print    ("Step ");   lcd.print(i);   lcd.print    ( " Lmt ");      lcd.print(TempLimit,0);
           
            while (Temp <= TempLimitMod)
               {
                   digitalWrite (iKiln,HIGH);                      //  switch heaters on
                   iBurnCount = iBurnCount + 1;                    //   how many burns
             
                   delay(iCheckPeriod);
             
                    j = j + 1;
             
                   Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                   if (isnan(Temp1))
                     {    Serial.print("*****   Error code:  "); 
                          Serial.println(thermocouple.readError());
                     }
                     else Temp = Temp1;
                   
                    Serial.print("Temp: ");              Serial.print(Temp,0);
                    Serial.print("  Stage 2:  Step   "); Serial.print(i);           
                    Serial.print("  ( ") ;               Serial.print(iBurnCount);  Serial.print(" )");
                    Serial.print("  Limit: ");           Serial.println(TempLimit,0);
             
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Stage 2 T "); lcd.print(Temp,0);       
                    lcd.setCursor(0,1);   
                    lcd.print    ("Step ");      lcd.print(i);      lcd.print    ( " Lmt ");     lcd.print(TempLimit,0);
               }
         
            digitalWrite(iKiln,LOW);                             //  Reached step temp so switch kiln off
     
      //  temp for this step is reached, wait for step time to elapse
     
            iburnTime = iburnTime1 * j;                          //  length of burn time in seconds
            StageTimeSeconds = Stage2Time * 60.;                 //  stage time in seconds   (float)
            iStage = int(StageTimeSeconds);                      //  stage time in seconds    (integer)
         
            idelayt = iStage/iStage2Steps - iburnTime ;          // delay time in seconds for this step
            idelaytpr = idelayt;                                 //  remaining time for printing
         
            lcd.clear    ();
            lcd.setCursor(0,0);
            lcd.print    ("Hold  ");             lcd.print(idelaytpr);        lcd.print( " s");
         
            lcd.setCursor(0,1);                                  // start reporting on the second line
            lcd.print    ("Hold temp ");         lcd.print(Temp,0);
         
            Serial.print ("Temp: ");             Serial.print(Temp,0);
            Serial.print ("  Hold for  ");       Serial.print(idelaytpr);     Serial.println( " s");
           
            idelayt1 = idelayt/iburnTime1;                       //  duration of hold in "check periods"
             
            for (k = 1; k <= idelayt1; k = k + 1 )
            {
              delay(iCheckPeriod);
              Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
             
              idelaytpr = idelaytpr - iburnTime1;                // time remaining for the hold
             
              lcd.clear    ();
              lcd.setCursor(0,0);
              lcd.print    ("Hold  ");            lcd.print(idelaytpr);        lcd.print( " s");
           
              lcd.setCursor(0,1);                                // start reporting on the second line
             
              lcd.print("Hold temp ");            lcd.print(Temp,0);
             
              Serial.print("Temp: ");             Serial.print(Temp,0);
              Serial.print ("  Hold for  ");      Serial.print(idelaytpr);     Serial.println( " s");
                 
              while (Temp <= TempLimitMod)
                 { 
                    digitalWrite (iKiln,HIGH);                      //  switch heaters on
                    iBurnCount = iBurnCount + 1;                    //   how many burns
                   
                    delay(iCheckPeriod);
                    Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                     {    Serial.print("*****   Error code:  "); 
                          Serial.println(thermocouple.readError());
                     }
                      else Temp = Temp1;
                   
                    idelaytpr = idelaytpr - iburnTime1 ;          // time remaining for the hold
                   
                    if ( k > idelayt1 ) { digitalWrite(iKiln,LOW);   break; }              //   exit if k loop conditions are met
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Hold  ");           lcd.print(idelaytpr);        lcd.print( " s");
                    lcd.setCursor(0,1);                               // start reporting on the second line
                    lcd.print    ("Hold temp ");       lcd.print(Temp,0);
                   
                    Serial.print ("Temp: ");           Serial.print(Temp,0);
                    Serial.print ("  Hold for  ");     Serial.print(idelaytpr);     Serial.print( " s");
                    Serial.print(" ( ") ;              Serial.print(iBurnCount);    Serial.println(" )");
                   
                    k = k + 1;
                 } 

                 digitalWrite(iKiln,LOW);                        //  Reached step temp so switch kiln off
             
               }                                                 //  k loop
           
        }                                                        //  i loop
     
   //  temp for this stage is reached, now start soaking
             
   Soakpr = float(iWait2)* 60.;                                   //  soak time in seconds
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print    ("Soaking  ");          lcd.print(float(iWait2),1);    lcd.print(" min");
 
   lcd.setCursor(0,1);                                           // start reporting on the second line
               
   lcd.print    ("Soak  ");             lcd.print(Temp,0);
   
   Serial.print ("Temp: ");             Serial.print(Temp,0);
   Serial.print ("  Soaking  for ");    Serial.print(float(iWait2),1);  Serial.println(" minutes");
   
   idx = iWait2 * 60 /(iCheckPeriod/1000);                       //  calculate number of iCheckPeriods to soak
           
   for (k = 1; k <= idx; k = k + 1 )
         {
               delay(iCheckPeriod);
               Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
               Soakpr = Soakpr - iburnTime1 ;
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print    ("Soak for  ");         lcd.print   (Soakpr/60.,1);  lcd.print     (" min");
               
               lcd.setCursor(0,1);                               // start reporting on the second line
               
               lcd.print    ("Soak  ");             lcd.print(Temp,0);

               Serial.print ("Temp: ");             Serial.print(Temp,0);
               Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.println(" minutes");
               
               while (Temp <= TempLimitMod)
                  { 
                     digitalWrite (iKiln,HIGH);                      //  switch heaters on
                     iBurnCount = iBurnCount + 1;                    //   how many burns
                     
                     delay(iCheckPeriod);
                     Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                     if (isnan(Temp1))
                     {    Serial.print("*****   Error code:  "); 
                          Serial.println(thermocouple.readError());
                     }
                       else Temp = Temp1;
                     
                     Soakpr = Soakpr - iburnTime1 ;
                     
                     if ( k > idx ) { digitalWrite(iKiln,LOW);   break; }         //   exit if k loop conditions are met
                   
                     lcd.setCursor(0,1);                         // start reporting on the second line
                     lcd.print    ("Soaking ");          lcd.print(Temp,0);
             
                     Serial.print ("Temp:  ");           Serial.print(Temp,0);
                     Serial.print ("  Soaking  for ");   Serial.print(Soakpr/60.,1);  Serial.print(" minutes");
                     Serial.print(" ( ") ;               Serial.print(iBurnCount);    Serial.println(" )");
                     
                     k = k + 1;
                  } 

             digitalWrite(iKiln,LOW);                            //  Reached step temp so switch kiln off 
        }
         
    // *****   Stage 3 firing   *****
     
   TempLimit = Stage2TempStop;                                   //  lower limit
       
     
   for (i = 1; i <= iStage3Steps; i = i + 1  )
       {
            j = 0;                                               //   counter for number of burns
           
            TempLimit = TempLimit + Stage3TempSteps;             //  the real TempLimit for this stage
             
            TempLimitMod = TempLimit;                      //   calculate modified upperlimit for this step
   
            Temp1 = thermocouple.readCelsius();              //  get the temperature
               
             if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
           
            Serial.print("Temp: ");              Serial.print(Temp,0);
            Serial.print("  Stage 3:  Step   "); Serial.print(i);           
            Serial.print("  Limit: ");           Serial.println(TempLimit,0);

            lcd.clear    ();
            lcd.setCursor(0,0);
            lcd.print    ("Stage 3 T ");  lcd.print(Temp,0);
            lcd.setCursor(0,1);
            lcd.print    ("Step ");       lcd.print(i);     lcd.print( " Lmt ");     lcd.print(TempLimit,0);
                   
            while (Temp <= TempLimitMod)
               {
                   digitalWrite (iKiln,HIGH);                      //  switch heaters on
                   iBurnCount = iBurnCount + 1;                    //   how many burns
             
                   delay(iCheckPeriod);
             
                   j = j + 1;
             
                   Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                   if (isnan(Temp1))
                    {    Serial.print("*****   Error code:  "); 
                         Serial.println(thermocouple.readError());
                    }
                     else Temp = Temp1;
                 
                   Serial.print("Temp: ");                Serial.print(Temp,0);
                   Serial.print("  Stage 3:  Step   ");   Serial.print(i);           
                   Serial.print(" ( ") ;                  Serial.print(iBurnCount);  Serial.print(" )");
                   Serial.print("  Limit: ");             Serial.println(TempLimit,0);
   
                   lcd.clear    ();
                   lcd.setCursor(0,0);
                   lcd.print    ("Stage 3 T ");           lcd.print(Temp,0);
                   lcd.setCursor(0,1);
                   lcd.print    ("Step ");                lcd.print(i);  lcd.print( " Lmt "); lcd.print(TempLimit,0);
               }
            digitalWrite(iKiln,LOW);                             //  Reached step temp so switch kiln off
     
     //  temp for this step is reached, wait for step time to elapse
         
            iburnTime = iburnTime1 * j;                          //  length of burn time in seconds
            StageTimeSeconds = Stage3Time * 60.;                 //  stage time in seconds   (float)
            iStage = int(StageTimeSeconds);                      //  stage time in seconds    (integer)
         
            idelayt = iStage/iStage3Steps - iburnTime ;          // delay time in seconds for this step
            idelaytpr = idelayt;                                 //  remaining time for printing
         
            lcd.clear    ();
            lcd.setCursor(0,0);
            lcd.print    ("Hold  ");            lcd.print(idelaytpr);        lcd.print( " s");
         
            lcd.setCursor(0,1);                                  // start reporting on the second line
            lcd.print    ("Hold temp ");        lcd.print(Temp,0);
         
            Serial.print ("Temp: ");            Serial.print(Temp,0);
            Serial.print ("  Hold for  ");      Serial.print(idelaytpr);     Serial.println( " s");
           
            idelayt1 = idelayt/iburnTime1;                        //  duration of hold in "check periods"
             
            for (k = 1; k <= idelayt1; k = k + 1 )
            {
              delay(iCheckPeriod);
              Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
             
              idelaytpr = idelaytpr - iburnTime1 ;               // time remaining for the hold
             
              lcd.clear    ();
              lcd.setCursor(0,0);
              lcd.print    ("Hold  ");             lcd.print(idelaytpr);        lcd.print( " s");
           
              lcd.setCursor(0,1);                                // start reporting on the second line
             
              lcd.print("Hold temp ");             lcd.print(Temp,0);
             
              Serial.print("Temp: ");              Serial.print(Temp,0);
              Serial.print ("  Hold for  ");       Serial.print(idelaytpr);     Serial.println( " s");
                             
              while (Temp <= TempLimitMod)
                 { 
                    digitalWrite (iKiln,HIGH);                      //  switch heaters on
                    iBurnCount = iBurnCount + 1;                    //   how many burns
                   
                    delay(iCheckPeriod);
                    Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                     {    Serial.print("*****   Error code:  "); 
                          Serial.println(thermocouple.readError());
                     }
                      else Temp = Temp1;
                   
                    idelaytpr = idelaytpr - iburnTime1 ;         // time remaining for the hold
                   
                    if ( k > idelayt1 ) { digitalWrite(iKiln,LOW);   break; }              //   exit if k loop conditions are met
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Hold  ");           lcd.print(idelaytpr);        lcd.print( " s");
                    lcd.setCursor(0,1);                          // start reporting on the second line
                    lcd.print    ("Hold temp ");       lcd.print(Temp,0);
                   
                    Serial.print ("Temp: ");           Serial.print(Temp,0);
                    Serial.print ("  Hold for  ");     Serial.print(idelaytpr);     Serial.print( " s");
                    Serial.print (" ( ") ;             Serial.print(iBurnCount);    Serial.println(" )");
                     
                    k = k + 1;
                 } 

                  digitalWrite(iKiln,LOW);                       //  Reached step temp so switch kiln off 
             
               }                                                 // k loop
 
       }                                                         //  i loop
       
//  now wait 
           
   Soakpr = float(iWait3) * 60.;                                 //  soak time in seconds
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print    ("Soaking  ");          lcd.print   (float(iWait3),1);  lcd.print     (" min");
   
   lcd.setCursor(0,1);                                           // start reporting on the second line
               
   lcd.print    ("Soak  ");             lcd.print(Temp,0);
   
   Serial.print ("Temp: ");             Serial.print(Temp,0);
   Serial.print ("  Soaking  for ");    Serial.print(float(iWait3),1);  Serial.println(" minutes");
   
   idx = iWait3 * 60 /(iCheckPeriod/1000);                       //  calculate number of iCheckPeriods to soak
           
   for (k = 1; k <= idx; k = k + 1 )
         {
               delay(iCheckPeriod);
               Temp1 = thermocouple.readCelsius();              //  get the temperature
               
               if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
               Soakpr = Soakpr - iburnTime1;
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print    ("Soak for  ");         lcd.print   (Soakpr/60.,1);  lcd.print     (" min");
               
               lcd.setCursor(0,1);                              // start reporting on the second line
               
               lcd.print    ("Soak  ");             lcd.print(Temp,0);

               Serial.print ("Temp: ");             Serial.print(Temp,0);
               Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.println(" minutes");
                           
               while (Temp <= TempLimitMod)
                  { 
                     digitalWrite (iKiln,HIGH);                      //  switch heaters on
                     iBurnCount = iBurnCount + 1;                    //   how many burns
                   
                     delay(iCheckPeriod);
                     Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                      {    Serial.print("*****   Error code:  "); 
                           Serial.println(thermocouple.readError());
                      }
                       else Temp = Temp1;
                                         
                     Soakpr = Soakpr - iburnTime1 ;
                     
                     if ( k > idx ) { digitalWrite(iKiln,LOW);   break; }         //   exit if k loop conditions are met
                     
                     lcd.setCursor(0,1);                        // start reporting on the second line
                     lcd.print    ("Soaking ");         lcd.print(Temp,0);

                     Serial.print ("Temp: ");            Serial.print(Temp,0);
                     Serial.print ("  Soaking  for ");   Serial.print(Soakpr/60.,1);  Serial.print(" minutes ");
                     Serial.print (" ( ") ;              Serial.print(iBurnCount);    Serial.println(" )");
                       
                     k = k + 1;
                  } 

               digitalWrite(iKiln,LOW);                         //  Reached step temp so switch kiln off 
         }
Last edited by adafruit_support_bill on Tue Jan 29, 2019 3:49 pm, edited 1 time in total.
Reason: fixed [code] tags

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Tue Jan 29, 2019 3:38 pm

The second part.

Colin

Code: Select all | TOGGLE FULL SIZE
// *****  Stage 4 firing   *****
 
   TempLimit = Stage3TempStop;                                  //  lower limit
       
   for (i = 1; i <= iStage4Steps; i = i + 1  )
       {
          j = 0;;                                                //   counter for number of burns
         
          TempLimit = TempLimit + Stage4TempSteps;              //  the real TempLimit for this stage
         
          TempLimitMod = TempLimit;                             //   calculate modified upperlimit for this step

          Serial.print("Temp: ");               Serial.print(Temp,0);
          Serial.print("  Stage 4:  Step   ");  Serial.print(i);           
          Serial.print("  Limit: ");            Serial.println(TempLimit,0); ;
             
          lcd.clear    ();
          lcd.setCursor(0,0);
          lcd.print    ("Stage 4 T ");           lcd.print(Temp,0);
          lcd.setCursor(0,1);   
          lcd.print    ("Step ");                lcd.print(i);  lcd.print( " Lmt ");    lcd.print(TempLimit,0);
                 
          while (Temp <= TempLimitMod)
              {
                 digitalWrite (iKiln,HIGH);                      //  switch heaters on
                 iBurnCount = iBurnCount + 1;                    //   how many burns

                 delay(iCheckPeriod);
             
                 j = j + 1;
             
                 Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
                 
                Serial.print("Temp: ");                Serial.print(Temp,0);
                Serial.print("  Stage 4:  Step   ");   Serial.print(i);           
                Serial.print(" ( ") ;                  Serial.print(iBurnCount);  Serial.print(" )");
                Serial.print("  Limit: ");             Serial.println(TempLimit,0);
                 
                 lcd.clear    ();
                 lcd.setCursor(0,0);
                 lcd.print    ("Stage 4 T ");          lcd.print(Temp,0);
                 lcd.setCursor(0,1);
                 lcd.print    ("Step ");               lcd.print(i);    lcd.print( " Lmt ");     lcd.print(TempLimit,0);
              }
          digitalWrite(iKiln,LOW);                              //  Reached step temp so switch kiln off
     
     //  temp for this step is reached, wait for step time to elapse
     
          iburnTime = iburnTime1 * j;                           //  length of burn time in seconds
          StageTimeSeconds = Stage4Time * 60.;                  //  stage time in seconds   (float)
          iStage = int(StageTimeSeconds);                       //  stage time in seconds    (integer)
         
          idelayt = iStage/iStage4Steps - iburnTime ;           // delay time in seconds for this step
          idelaytpr = idelayt;                                  //  remaining time for printing
         
          lcd.clear    ();
          lcd.setCursor(0,0);
          lcd.print    ("Hold  ");         lcd.print(idelaytpr);        lcd.print( " s");
         
          lcd.setCursor(0,1);                                   // start reporting on the second line
          lcd.print    ("Hold temp ");     lcd.print(Temp,0);
         
          Serial.print ("Temp: ");         Serial.print(Temp,0);
          Serial.print ("  Hold for  ");   Serial.print(idelaytpr);   Serial.println( " s");
                   
          idelayt1 = idelayt/iburnTime1;                        //  duration of hold in "check periods"
             
          for (k = 1; k <= idelayt1; k = k + 1 )
            {
              delay(iCheckPeriod);
              Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
             
              idelaytpr = idelaytpr - iburnTime1 ;             // time remaining for the hold
             
              lcd.clear    ();
              lcd.setCursor(0,0);
              lcd.print    ("Hold  ");            lcd.print(idelaytpr);        lcd.print( " s");
           
              lcd.setCursor(0,1);                               // start reporting on the second line
             
              lcd.print("Hold temp ");            lcd.print(Temp,0);
             
              Serial.print("Temp: ");             Serial.print(Temp,0);
              Serial.print ("  Hold for  ");      Serial.print(idelaytpr);     Serial.println( " s");
                           
              while (Temp <= TempLimitMod)
                 { 
                    digitalWrite (iKiln,HIGH);                      //  switch heaters on
                    iBurnCount = iBurnCount + 1;                    //   how many burns
                   
                    delay(iCheckPeriod);
                   Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                   if (isnan(Temp1))
                     {    Serial.print("*****   Error code:  "); 
                          Serial.println(thermocouple.readError());
                     }
                      else Temp = Temp1;
                   
                    idelaytpr = idelaytpr - iburnTime1 ;        // time remaining for the hold
                   
                    if ( k > idelayt1 ) { digitalWrite(iKiln,LOW);   break; }              //   exit if k loop conditions are met
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Hold  ");             lcd.print(idelaytpr);        lcd.print( " s");
                    lcd.setCursor(0,1);                               // start reporting on the second line
                    lcd.print    ("Hold temp ");         lcd.print(Temp,0);
                   
                    Serial.print ("Temp: ");             Serial.print(Temp,0);
                    Serial.print ("  Hold for  ");       Serial.print(idelaytpr);     Serial.print( " s");
                    Serial.print (" ( ") ;               Serial.print(iBurnCount);    Serial.println(" )");
                   
                    k = k + 1;
                 } 


                 digitalWrite(iKiln,LOW);                       //  Reached step temp so switch kiln off 
             
             }                                                  //  k loop

       }                                                        //  i loop
      //  now  wait 
           
   Soakpr = float(iWait4) * 60.;                                  //  soak time in seconds
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print    ("Soaking  ");            lcd.print   (float(iWait4),1);  lcd.print     (" min");
 
   lcd.setCursor(0,1);                                          // start reporting on the second line
                 
   lcd.print    ("Soak  ");               lcd.print(Temp,0);
   
   Serial.print ("Temp: ");               Serial.print(Temp,0);
   Serial.print ("  Soaking  for ");      Serial.print(float(iWait4),1);    Serial.println(" minutes");
   
   idx = iWait4 * 60 /(iCheckPeriod/1000);                      //  calculate number of iCheckPeriods to soak
           
   for (k = 1; k <= idx; k = k + 1 )
         {
               delay(iCheckPeriod);
               Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
               Soakpr = Soakpr - iburnTime1 ;
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print    ("Soak for  ");           lcd.print   (Soakpr/60.,1);  lcd.print     (" min");
               
               lcd.setCursor(0,1);                              // start reporting on the second line
               
               lcd.print    ("Soak  ");               lcd.print(Temp,0);

               Serial.print ("Temp: ");               Serial.print(Temp,0);
               Serial.print ("  Soaking  for ");      Serial.print(Soakpr/60.,1);  Serial.println(" minutes");
                             
               while (Temp <= TempLimitMod)
                  { 
                     digitalWrite (iKiln,HIGH);                      //  switch heaters on
                     iBurnCount = iBurnCount + 1;                    //   how many burns
                     
                     delay(iCheckPeriod);
                     Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                     if (isnan(Temp1))
                       {    Serial.print("*****   Error code:  "); 
                            Serial.println(thermocouple.readError());
                       }
                        else Temp = Temp1;
                     
                     Soakpr = Soakpr - iburnTime1 ;
                     
                     if ( k > idx ) { digitalWrite(iKiln,LOW);   break; }         //   exit if k loop conditions are met
                     
                     lcd.setCursor(0,1);                        // start reporting on the second line
                     lcd.print    ("Soaking ");           lcd.print(Temp,0);
             
                     Serial.print ("Temp: ");             Serial.print(Temp,0);
                     Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.print(" minutes");
                     Serial.print(" ( ") ;                Serial.print(iBurnCount);    Serial.println(" )");
                     
                     k = k + 1;
                  } 
             
               digitalWrite(iKiln,LOW);                         //  Reached step temp so switch kiln off
         }
         
  // ***** Stage 5 firing   ******      Dropping temperature a bit and then holding
     
   TempLimit = Stage4TempStop;                                  //  lower limit
       
       
   for (i = 1; i <= iStage5Steps; i = i + 1  )
       {
           j = 0;                                               //   counter for number of burns
           
           TempLimit = TempLimit + Stage5TempSteps;             //  the real TempLimit for this stage
         
           TempLimitMod = TempLimit;                            //   calculate modified upperlimit for this step
   
           Temp1 = thermocouple.readCelsius();              //  get the temperature
               
           if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;

           Serial.print("Temp: ");                 Serial.print(Temp,0);
           Serial.print("  Stage 5:  Step   ");    Serial.print(i);           
           Serial.print("  Limit: ");              Serial.println(TempLimit,0);
   
           lcd.clear    ();
           lcd.setCursor(0,0);
           lcd.print    ("Stage 5 T ");            lcd.print(Temp,0);
           lcd.setCursor(0,1);
           lcd.print    ("Step ");                 lcd.print(i);    lcd.print( " Lmt ");   lcd.print(TempLimit,0);
                 
           while (Temp <= TempLimitMod)
              {
                  digitalWrite (iKiln,HIGH);                      //  switch heaters on
                  iBurnCount = iBurnCount + 1;                    //   how many burns

                  delay(iCheckPeriod);
                  j = j + 1;
             
                 Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                 if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
                     
                  Serial.print("Temp: ");                Serial.print(Temp,0);
                  Serial.print("  Stage 5:  Step   ");   Serial.print(i);           
                  Serial.print(" ( ") ;                  Serial.print(iBurnCount);    Serial.print(" )");
                  Serial.print("  Limit: ");             Serial.println(TempLimit,0);
                 
                  lcd.clear    ();
                  lcd.setCursor(0,0);
                  lcd.print    ("Stage 5 T ");           lcd.print(Temp,0);
                  lcd.setCursor(0,1);
                  lcd.print    ("Step ");                lcd.print(i);   lcd.print( " Lmt ");   lcd.print(TempLimit,0);
              }
             
           digitalWrite(iKiln,LOW);                             //  Reached step temp so switch kiln off
       
        //  temp for this step is reached, wait for step time to elapse
     
           iburnTime = iburnTime1 * j;                          //  length of burn time in seconds
           StageTimeSeconds = Stage5Time * 60.;                 //  stage time in seconds   (float)
           iStage = int(StageTimeSeconds);                      //  stage time in seconds    (integer)
         
           idelayt = iStage/iStage5Steps - iburnTime ;          // delay time in seconds for this step
           idelaytpr = idelayt;                                 //  remaining time for printing
         
           lcd.clear    ();
           lcd.setCursor(0,0);
           lcd.print    ("Hold  ");         lcd.print(idelaytpr);        lcd.print( " s");
         
           lcd.setCursor(0,1);                                  // start reporting on the second line
           lcd.print    ("Hold temp ");     lcd.print(Temp,0);
         
           Serial.print ("Temp: ");         Serial.print(Temp,0);
           Serial.print ("  Hold for  ");   Serial.print(idelaytpr);     Serial.println( " s");
                     
           idelayt1 = idelayt/iburnTime1;                       //  duration of hold in "check periods"
             
           for (k = 1; k <= idelayt1; k = k + 1 )
            {
              delay(iCheckPeriod);
             Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
             
              idelaytpr = idelaytpr - iburnTime1 ;              // time remaining for the hold
             
              lcd.clear    ();
              lcd.setCursor(0,0);
              lcd.print    ("Hold  ");            lcd.print(idelaytpr);        lcd.print( " s");
           
              lcd.setCursor(0,1);                               // start reporting on the second line
             
              lcd.print("Hold temp ");            lcd.print(Temp,0);
             
              Serial.print ("Temp: ");            Serial.print(Temp,0);
              Serial.print ("  Hold for  ");      Serial.print(idelaytpr);     Serial.println( " s ");
                           
              while (Temp <= TempLimitMod)
                 { 
                    digitalWrite (iKiln,HIGH);                      //  switch heaters on
                    iBurnCount = iBurnCount + 1;                    //   how many burns

                    delay(iCheckPeriod);
                    Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                       {    Serial.print("*****   Error code:  "); 
                            Serial.println(thermocouple.readError());
                       }
                        else Temp = Temp1;
                   
                    idelaytpr = idelaytpr - iburnTime1 ;        // time remaining for the hold
                   
                    if ( k > idelayt1 ) { digitalWrite(iKiln,LOW);   break; }              //   exit if k loop conditions are met
                    lcd.clear    ();
                    lcd.setCursor(0,0);
                    lcd.print    ("Hold  ");           lcd.print(idelaytpr);        lcd.print( " s");
                    lcd.setCursor(0,1);                         // start reporting on the second line
                    lcd.print    ("Hold temp ");       lcd.print(Temp,0);
                   
                    Serial.print ("Temp: ");            Serial.print(Temp,0);
                    Serial.print ("  Hold for  ");      Serial.print(idelaytpr);     Serial.print( " s");
                    Serial.print (" ( ") ;              Serial.print(iBurnCount);    Serial.println(" )");
                       
                    k = k + 1;
                 } 


                  digitalWrite(iKiln,LOW);                      //  Reached step temp so switch kiln off
                 
               }                                                //  k loop
             
       }                                                        //  i loop
         
 //  now wait 

           
   Soakpr = float(iWait5) * 60.;                                      //  soak time in seconds
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print    ("Soaking  ");           lcd.print(float(iWait5),1);  lcd.print     (" min");
   
   lcd.setCursor(0,1);                                          // start reporting on the second line
               
   lcd.print    ("Soak  ");              lcd.print(Temp,0);
   
   Serial.print ("Temp: ");              Serial.print(Temp,0);
   Serial.print ("  Soaking  for ");     Serial.print(float(iWait5),1);   Serial.println(" minutes");
     
   idx = iWait5 * 60 /(iCheckPeriod/1000);                      //  calculate number of iCheckPeriods to soak
           
   for (k = 1; k <= idx; k = k + 1 )
         {
               delay(iCheckPeriod);
               Temp1 = thermocouple.readCelsius();              //  get the temperature
               
              if (isnan(Temp1))
                 {    Serial.print("*****   Error code:  "); 
                      Serial.println(thermocouple.readError());
                 }
                 else Temp = Temp1;
               
               Soakpr = Soakpr - iburnTime1 ;
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.print    ("Soak for  ");         lcd.print   (Soakpr/60.,1);  lcd.print     (" min");
               
               lcd.setCursor(0,1);                              // start reporting on the second line
                 
               lcd.print    ("Soak  ");             lcd.print(Temp,0);

               Serial.print ("Temp: ");             Serial.print(Temp,0);
               Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);  Serial.println(" minutes");
                             
               while (Temp <= TempLimitMod)
                  { 
                     digitalWrite (iKiln,HIGH);                      //  switch heaters on
                     iBurnCount = iBurnCount + 1;                    //   how many burns
               
                     delay(iCheckPeriod);
                     Temp1 = thermocouple.readCelsius();              //  get the temperature
               
                    if (isnan(Temp1))
                       {    Serial.print("*****   Error code:  "); 
                            Serial.println(thermocouple.readError());
                       }
                         else Temp = Temp1;
                     
                     Soakpr = Soakpr - iburnTime1 ;
                     
                     if ( k > idx ) { digitalWrite(iKiln,LOW);   break; }         //   exit if k loop conditions are met
                     
                     lcd.setCursor(0,1);                        // start reporting on the second line
                     lcd.print    ("Soaking ");           lcd.print(Temp,0);
             
                     Serial.print ("Temp: ");             Serial.print(Temp,0);
                     Serial.print ("  Soaking  for ");    Serial.print(Soakpr/60.,1);   Serial.print(" minutes");
                     Serial.print (" ( ") ;               Serial.print(iBurnCount);     Serial.println(" )");
                       
                     k = k + 1;
                  } 

             digitalWrite(iKiln,LOW);                           //  Reached step temp so switch kiln off
         } 
             
    lcd.clear     ();
    lcd.setCursor (0,0);
    lcd.print     ("  ***   Finished   *** ");                  //  its finished

    Serial.println(" ");
    Serial.print  ("  ***   Finished   *** ");                  //  its finished
}
       void loop()
           {
           }
Last edited by adafruit_support_bill on Tue Jan 29, 2019 3:50 pm, edited 1 time in total.
Reason: fixed [code] tags

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Tue Jan 29, 2019 3:50 pm

When posting code, you need to paste it between the [code] tags.

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Tue Jan 29, 2019 3:55 pm

In which stage of the firing are the errors occurring?

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by petespaco on Tue Jan 29, 2019 7:02 pm

Can you simply remove the T/C from the kiln and heat it up with a propane torch?
That way you can separate it from any association with the electricity and and possible fields around the kiln.

Another thought related to isolating the problem:
Just connect a short (6 inch) T/C directly to the inputs for the MAX31855 and heat that up with a propane torch.
That's what I do to degug software, etc. in the comfort of my favorite chair in front of my desktop computer.

FWIW, I have a fairly complex setup of my own, using MAX31855's and MAX6675's and have been using them for several years.
It would be hard to imagine a problem that I haven't encountered.

Pete Stanaitis
--------------------

petespaco
 
Posts: 70
Joined: Thu Apr 19, 2012 7:53 pm
Location: west central wisconsin

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Tue Jan 29, 2019 11:55 pm

Oops! Apologies about the misunderstanding about the code tags!

The errors have come up only in Stage 4. The temperature limits are between 575 and 1200 Celsius. The onset of errors is remarkably repeatable at close to 900 *C.

I will certainly try Pete's excellent suggestion of heating up a t/c with gas. That will very elegantly take the main source of electromagnetic out of the situation. Thanks, Pete!

Colin

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Wed Jan 30, 2019 6:58 am

I don't see any obvious code issues. Let us know the results of Pete's torch test.

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Thu Jan 31, 2019 8:32 am

Hi all,

I did a run with the heaters left to run continuously. The isnan errors still pop up (starting at about 893 degrees), Quite a range of transient errors!

Interesting that the reading where the when the isnan picks up, seems to be 251 degrees each time?

I switched off at 14:09:39 and thereafter no isnan pick ups were recorded.

A sample of the recording

14:05:36.946 -> Temp: 251
14:05:47.024 -> ***** Error code: 0
14:05:47.117 -> Temp: 251
14:05:57.180 -> ***** Error code: 0
14:05:57.273 -> Temp: 251
14:06:07.351 -> Temp: 962
14:06:17.444 -> ***** Error code: 0
14:06:17.491 -> Temp: 251
14:06:27.568 -> ***** Error code: 0
14:06:27.662 -> Temp: 251
14:06:37.724 -> ***** Error code: 6
14:06:37.771 -> Temp: 251
14:06:47.895 -> ***** Error code: 4
14:06:47.942 -> Temp: 251
14:06:58.004 -> Temp: 965
14:07:08.082 -> ***** Error code: 2
14:07:08.176 -> Temp: 251
14:07:18.253 -> Temp: 966
14:07:28.331 -> Temp: 967
14:07:38.408 -> Temp: 968
14:07:48.486 -> Temp: 969
14:07:58.564 -> ***** Error code: 2
14:07:58.658 -> Temp: 251
14:08:08.719 -> Temp: 970
14:08:18.813 -> ***** Error code: 2
14:08:18.906 -> Temp: 251
14:08:28.984 -> ***** Error code: 0
14:08:29.030 -> Temp: 251
14:08:39.108 -> Temp: 972
14:08:49.186 -> Temp: 973
14:08:59.248 -> Temp: 973
14:09:09.372 -> Temp: 974
14:09:19.450 -> ***** Error code: 0
14:09:19.497 -> Temp: 251
14:09:29.574 -> ***** Error code: 2
14:09:29.668 -> Temp: 251
14:09:39.746 -> Temp: 975
14:09:49.823 -> Temp: 974
14:09:59.885 -> Temp: 968
14:10:09.963 -> Temp: 962
14:10:20.072 -> Temp: 955
14:10:30.149 -> Temp: 948
14:10:40.227 -> Temp: 941
14:10:50.305 -> Temp: 934
14:11:00.398 -> Temp: 928
14:11:10.475 -> Temp: 922
14:11:20.537 -> Temp: 916
14:11:30.630 -> Temp: 911

So it seems that the current flow in the heaters is associated with the isnan pick up.

As far as I can make out, there is a capacitor across the thermocouple inputs on the board?

The thermocouple leads are shielded and twisted pair. so should be fairly immune to 50 Hz noise. And also, why only from around 900 degrees.

I am baffled

Colin

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by adafruit_support_bill on Thu Jan 31, 2019 9:18 am

If you have access to an oscilloscope, it might give you a better idea of the nature of the interference.

adafruit_support_bill
 
Posts: 72768
Joined: Sat Feb 07, 2009 10:11 am

Re: MAX31855 problems, unstable readings,

by petespaco on Thu Jan 31, 2019 2:23 pm

Still looking for results from a "torch" test.
I really think you need to do this before tinkering with the code any more. It will take a bunch of guesswork out of the equation. We used to call it "halving the circuit". You eliminate components from being part of the problem.


BTW, Earlier you noted that you are NOT using T/C leadwire between the T/C and the sensor board. This may or may not be a part of the problem. In general, practitioners of temperature measurement would NOT do that.
I spent a few hours trying to get real world numbers on the effect of connecting the T/C to the sensor board with non-T/C leadwire. Opinions vary all over the place and for many reasons. But no numbers that one could rely upon. One common thread seems to be that the offsetting effect of adding additional dissimilar-metal junctions is non-linear. You would think that locating Seebeck effect numbers for junctions like: copper/tin, tin/constantan, etc., would be easy to find, but I didn't locate any such source.

I agree with getting out the oscilloscope. Who knows what kind of waveforms your heater system is producing, and how much radiation it produces.

petespaco
 
Posts: 70
Joined: Thu Apr 19, 2012 7:53 pm
Location: west central wisconsin

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Sun Feb 03, 2019 12:42 am

Hi

My gas torch is out at the farm. I'll pick it up this week and then give the tc a burn.

I am still pondering about the 900 degree threshold? Why should the isNaN pick up only from that temperature? The electromagnetic field from the kiln current (50 Hz) would be present from the start? There is clearly some influence from the 50Hz current, given that the problem seems to go away when the kiln power is switched off. Butler's see what the heating process is when there is no 50 Hz present!

Watch this space!

Colin

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Re: MAX31855 problems, unstable readings,

by ColinKing999 on Sun Feb 10, 2019 9:44 am

Hi all,

I have used the gas torch to heat the thermocouple and the results are as below.

13:57:54.231 -> Temp: 644
13:58:04.308 -> Temp: 594
13:58:14.418 -> Temp: 551
13:58:24.464 -> Temp: 512
13:58:34.557 -> Temp: 481
13:58:44.635 -> Temp: 480
13:58:54.728 -> Temp: 657
13:59:04.806 -> Temp: 748
13:59:14.883 -> Temp: 820
13:59:24.977 -> Temp: 874
13:59:35.038 -> Temp: 933
13:59:45.116 -> Temp: 958
13:59:55.194 -> Temp: 984
14:00:05.271 -> Temp: 995
14:00:15.396 -> Temp: 1012
14:00:25.474 -> Temp: 1028
14:00:35.536 -> Temp: 1040
14:00:45.613 -> Temp: 1037
14:00:55.691 -> Temp: 1042
14:01:05.768 -> Temp: 1047
14:01:15.846 -> Temp: 1023
14:01:25.940 -> Temp: 1026
14:01:36.048 -> Temp: 1033
14:01:46.094 -> Temp: 1042
14:01:56.219 -> Temp: 998
14:02:06.265 -> Temp: 989
14:02:16.343 -> Temp: 910

So it looks as if the electrical interference factor is definitely still under suspicion.

I am still unclear as to why it only seemed to pop up after 900 degrees or so (several hours of running).

I am going to do a run with the contactor switching circuit operative (with the power to the heaters switched off) to see if there is some linkage between the contactor switching and the noise. The contactor circuit is on its power supply powered from another USB port on the laptop.

Colin

ColinKing999
 
Posts: 18
Joined: Wed Jan 23, 2019 2:31 pm

Please be positive and constructive with your questions and comments.