• Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Seven segment display and Arduino Soldering Iron Driver

123mmm

Member
Hi! I found the attached code on a internet article but I modified it because in the original code, the Thermocouple was read by LM358, and now I wanted to read it by MAX6675 module.
If I read the thermocouple (MAX6675) in the loop() function, then the read value does not refresh, but if I read the thermocouple as it is in the code below, then it works.
I read on a forum, that the MAX6675 can be read by Arduino only 4 times/ second, could this be the problem ?
Please have a look at the code and schematic and tell me what you think ?

C:
#include <PID_v2.h>
#include <max6675.h>

int thermoDO = 12;
int thermoCS = 10;
int thermoCLK = 13;

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//protection
int relay_pin = A5;
int led_pin = 8;

//This array contains what segments need to be turned on to display numbers 0-9
byte const digits[] = {
  B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111
};

int digit_common_pins[] = {A2, A3, A4}; //Common pins for the triple 7-Segment LED display
int max_digits = 3;
int current_digit = max_digits - 1;

unsigned long updaterate = 700; //Change how fast the display updates. No lower than 500
unsigned long lastupdate;

int temperature = 0;

//Define Variables we'll be connecting to
double Setpoint, Input, Output;
double heaterTemp;

//Define the aggressive and conservative Tuning Parameters
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

void setup()
{
  DDRD = B11111111;  // sets Arduino pins 0 to 7 as outputs
  for (int y = 0; y < max_digits; y++)
  {
    pinMode(digit_common_pins[y], OUTPUT);
  }
  //We do not want to drive the soldering iron at 100% because it may burn, so we set it to about 85% (220/255)
  myPID.SetOutputLimits(0, 220);
  myPID.SetMode(AUTOMATIC);
  lastupdate = millis();
  Setpoint = 0;
  pinMode(led_pin, OUTPUT);
  pinMode(relay_pin, OUTPUT);
  digitalWrite(led_pin, LOW);
  digitalWrite(relay_pin, LOW);
  delay(1000);
  digitalWrite(relay_pin, HIGH);
}

void loop() {
  if (millis() - lastupdate > updaterate) {
    lastupdate = millis();
    //  Read temperature
    heaterTemp = thermocouple.readCelsius();
    Input = (0.779828 * heaterTemp) - 10.3427;
    //Display temperature
    if (isnan(heaterTemp) or Input >= 432) // No TC Connection OR over-temperature
    {
      while (true) {
        digitalWrite(relay_pin, LOW);
        digitalWrite(11, LOW);
        PORTD = B00000000; // turn off the dislay
        digitalWrite(led_pin, HIGH); //turn on the warning red led
      }
    }
    temperature = Input;
  }
  //Read setpoint and transform it into degrees celsius(minimum 150, maximum 350)
  double newSetpoint = analogRead(A1);
  newSetpoint = map(newSetpoint, 0, 1023, 150, 400);
  //Display setpoint
  if (abs(newSetpoint - Setpoint) > 3) {
    Setpoint = newSetpoint;
    temperature = newSetpoint;
    lastupdate = millis();
  }

  double gap = abs(Setpoint - Input); //distance away from setpoint

  if (gap < 10)
  { //we're close to setpoint, use conservative tuning parameters
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
    //we're far from setpoint, use aggressive tuning parameters
    myPID.SetTunings(aggKp, aggKi, aggKd);
  }

  myPID.Compute();
  //Drive the output
  analogWrite(11, Output);
  //Display the temperature
  if (temperature < 50) {
    show(50); //shows 50 on the display if the temperature is below 50 C
  }
  else
  {
    show(temperature); // display the read temperature on the display
  }

}

void show(int value) {
  int digits_array[] = {};
  boolean empty_most_significant = true;
  for (int z = max_digits - 1; z >= 0; z--) //Cycle through each digit
  {
    digits_array[z] = value / pow(10, z); //We now take each digit from the number
    if (digits_array[z] != 0 ) empty_most_significant = false; //Do not display leading zeros
    value = value - digits_array[z] * pow(10, z);
    if (z == current_digit)
    {
      if (!empty_most_significant || z == 0) { //Check to see that we do not have leading zeros and display the current digit
        PORTD = digits[digits_array[z]]; //Remove ~ for common cathode
      }
      else
      {
        PORTD = B00000000;
      }
      digitalWrite(digit_common_pins[z], HIGH);//Change to LOW for common cathode
    } else {
      digitalWrite(digit_common_pins[z], LOW);//Change to HIGH for common cathode
    }

  }
  current_digit--;
  if (current_digit < 0)
  {
    current_digit = max_digits; //Start over
  }
}
 

Attachments

Latest threads

EE World Online Articles

Loading
Top