NoraTheDoggo
Published © LGPL

DIY Soldering Iron Control for 862D+

Did your somewhat expensive ($50) soldering iron just die? Well then fix it with another one!

IntermediateFull instructions provided9,069
DIY Soldering Iron Control for 862D+

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
Normal Flyback Diode.
×1
irf540n n-channel mosfet
×1
5v linear regulator
×1
Resistor 330 ohm
Resistor 330 ohm
×1
pin headers(male)
×2
.96 inch Oled
×1

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
8mm drill bit /w drill

Story

Read more

Schematics

Control Circut

Use this schematic to create a circuit for the iron

Code

Control Code

C/C++
Paste this into the arduino and upload. This only works with the circuit provided
int output = 0;
int temp = 0;
int settemp = 630;
String inputString = "";         // a string to hold incoming data
boolean rap = false;
boolean stringComplete = false;  // whether the string is complete
int t = 0;

void setup() {
  Serial.begin(9600);
  inputString.reserve(200);
  pinMode(6, OUTPUT);
  digitalWrite(6, LOW);
}

void loop() {
  serialEvent();
  if (stringComplete) {
    Serial.println(inputString);
    t = inputString.toInt();
    //settemp = t //sets the set temp to the serial input
    inputString = "";
    stringComplete = false;
  }
  rapid();
  pid();
}

void rapid() { //Controls the soldering iron by rapidly heating it up in the beginning.
  if (rap == false) {
    digitalWrite(6, HIGH);
    do {
      temp = analogRead(0);
      Serial.print("rapid");
      Serial.println(temp);
    } while (temp - settemp > 10);
    digitalWrite(6, LOW);
    rap = true;
  }
}

void pid() { //Controls the soldering with slow active power heating.
  temp = analogRead(0);
  output = temp - settemp;
  if (output < 0) {
    output = 0;
  }
  if (output > 255) {
    output = 255;
  }
  Serial.print("pid");
  Serial.print(temp);
  Serial.print(", ");
  Serial.println(output);
  analogWrite(6, output);
}

void serialEvent() {  //Serial communication that can be used to update settemp
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

The Code

C/C++
Paste into editor and upload. Only works with designed schematic.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define OLED_ADDR   0x3C
Adafruit_SSD1306 display(-1);

int settemp = 590; //manual set variables

int output = 0;
int temp = 0;
String inputString = "";
boolean rap = false;
boolean stringComplete = false;
int t = 0;
int mappedpower = 0;
byte powermultiply = 0;
long counter = 0;
int temp2 = 0;
byte outputoffset = 0;
byte scaleread = 0;

void setup() {
  Serial.begin(9600);
  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();
  rapid();
}

void loop() {
  pid();
  display.clearDisplay();
  updatebar();
  updatetext();
  display.display();
}

void rapid() { //Controls the soldering iron by rapidly heating it up in the beginning.
  if (rap == false) {
    digitalWrite(12, HIGH);
    output = 255;
    do {
      temp = analogRead(0);
      Serial.print("rapid");
      Serial.println(temp);
      display.clearDisplay();
      updatebar();
      updatetext();
      display.display();
    } while (temp - settemp > 1);
    digitalWrite(12, LOW);
    rap = true;
  }
}

void pid() { //Controls the soldering with slow active power heating.
  temp = analogRead(0);  //Temp averager
  temp2 = temp;
  delay(50);
  temp = analogRead(0);
  temp = temp + temp2;
  temp = temp / 2;

  zeroscale; //activate no soldering iron checker
  temp = temp + outputoffset;

  output = temp - settemp;
  output = output + powermultiply;
  output = output * 4;

  if (output < 0) {
    output = 0;
  }
  if (output > 255) {
    output = 255;
  }
  counter = counter + 1;
  if (counter > 10) {
    counter = 0;
    if (temp > settemp + 3) {
      powermultiply = powermultiply + 1;
    }
    if (temp < settemp - 3 && powermultiply > 0) {
      powermultiply = powermultiply - 1;
    }
  }
  Serial.print(powermultiply);
  Serial.print(", ");
  Serial.print(temp);
  Serial.print(", ");
  Serial.println(output);
  analogWrite(12, output);
}

void updatebar() { //Updates Powerbar on OLED display
  mappedpower = map(output, 0, 255, 0, 127) - 10;
  display.fillRect(0, 0, mappedpower, 8, WHITE);
  display.fillRoundRect(mappedpower - 5, 0, 20, 8, 3, WHITE);
}

void updatetext() {//Update text on Oled display
  display.setCursor(0, 9);
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("Set Temp: ");
  display.print(settemp);
  display.setCursor(0, 20);
  display.print("Temp: ");
  display.print(temp);
}

void zeroscale() { //If soldering iron is unplugged, adjust the input pin value to zero it out
  if (output < 200) {
    display.clearDisplay();

    display.setCursor(0, 9);
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.print("No soldering iron, or defective");
    display.setCursor(0, 15);
    display.print("iron.");
    display.setCursor(0, 20);
    display.print("Testing in 5 seconds.");

    display.display();
    delay(5000);

    if (output < 200) {
      outputoffset = temp;
    }
    display.clearDisplay();

    display.setCursor(0, 9);
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.print("Output offset set.");
    display.setCursor(0, 20);
    display.print("Please plug in the iron.");

    display.display();
    do {
      scaleread = analogRead(0);
    } while (scaleread < 200);

  }
}

Code Updated 10/21/2019

C/C++
Paste in IDE and upload. Only works with shematic.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define OLED_ADDR   0x3C
Adafruit_SSD1306 display(-1);

int settemp = 590; //manual set variables

int output = 0;
int temp = 0;
String inputString = "";
boolean rap = false;
boolean stringComplete = false;
int t = 0;
int mappedpower = 0;
byte powermultiply = 0;
long counter = 0;
int temp2 = 0;
byte outputoffset = 0;
byte scaleread = 0;

void setup() {
  Serial.begin(9600);
  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);
  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  display.clearDisplay();
  display.display();
  rapid();
}

void loop() {
  pid();
  display.clearDisplay();
  updatebar();
  updatetext();
  display.display();
}

void rapid() { //Controls the soldering iron by rapidly heating it up in the beginning.
  if (rap == false) {
    digitalWrite(12, HIGH);
    output = 255;
    do {
      temp = analogRead(0);
      Serial.print("rapid");
      Serial.println(temp);
      display.clearDisplay();
      updatebar();
      updatetext();
      display.display();
    } while (temp - settemp > 1);
    digitalWrite(12, LOW);
    rap = true;
  }
}

void pid() { //Controls the soldering with slow active power heating.
  temp = analogRead(0);  //Temp averager
  temp2 = temp;
  delay(50);
  temp = analogRead(0);
  temp = temp + temp2;
  temp = temp / 2;

  zeroscale(); //activate no soldering iron checker
  temp = temp + outputoffset;

  output = temp - settemp;
  output = output + powermultiply;
  output = output * 4;

  if (output < 0) {
    output = 0;
  }
  if (output > 255) {
    output = 255;
  }
  counter = counter + 1;
  if (counter > 10) {
    counter = 0;
    if (temp > settemp + 3) {
      powermultiply = powermultiply + 1;
    }
    if (temp < settemp - 3 && powermultiply > 0) {
      powermultiply = powermultiply - 1;
    }
  }
  Serial.print(powermultiply);
  Serial.print(", ");
  Serial.print(temp);
  Serial.print(", ");
  Serial.println(output);
  analogWrite(12, output);
}

void updatebar() { //Updates Powerbar on OLED display
  mappedpower = map(output, 0, 255, 0, 127) - 10;
  display.fillRect(0, 0, mappedpower, 8, WHITE);
  display.fillRoundRect(mappedpower - 5, 0, 20, 8, 3, WHITE);
}

void updatetext() {//Update text on Oled display
  display.setCursor(0, 9);
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.print("Set Temp: ");
  display.print(settemp);
  display.setCursor(0, 20);
  display.print("Temp: ");
  display.print(temp);
}

void zeroscale() { //If soldering iron is unplugged, adjust the input pin value to zero it out
  if (temp < 200) {
    display.clearDisplay();

    display.setCursor(0, 20);
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.print("No soldering iron.");
    display.display();
    delay(10000);
    
    display.setCursor(0, 0);
    display.print("Testing in 5 seconds.");

    display.display();
    delay(5000);

    if (temp < 200) {
      outputoffset = temp;
    }
    display.clearDisplay();

    display.setCursor(0, 20);
    display.setTextColor(WHITE);
    display.setTextSize(1);
    display.print("Output offset set.");
    display.setCursor(0, 0);
    display.print("Connect the iron.");

    display.display();
    do {
      scaleread = analogRead(0);
    } while (scaleread < 200);

  }
}

Credits

NoraTheDoggo

NoraTheDoggo

0 projects • 2 followers

Comments