Controlador DIY para soldador 862D+ — Precisión y fiabilidad
Componentes y suministros
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Diodo flyback normal | 1 | |
| MOSFET canal N IRF540N | 1 | |
| Regulador lineal 5 V | 1 | |
| Resistencia 330 Ω | 1 | |
| Pin headers (macho) | 2 | |
| Pantalla OLED 0,96" | 1 |
Herramientas necesarias
- Soldador (genérico)
- Brocas 8 mm + taladro
Sobre el proyecto
Actualización (21/10/2019): Gran actualización del código. Lee abajo, algunas cosas cambiaron.
Mi soldador 862D+ se rompió; en lugar de comprar uno nuevo, cogí otro y lo arreglé. Lo difícil: no había solución en línea. La PCB estaba rota porque tras cambiar el soldador seguía diciendo S-E (sensor error).
Decidí crear mi propio circuito controlador y meterlo dentro. Requería un segundo transformador, pero al ser barato había espacio de sobra.
Puede que no luzca bonito, pero funciona de maravilla. Como extra, quité el botón de encendido del soldador y lo puse entre 5 V y el Arduino.
Consejos de construcción
- Todos los componentes se compran ahora. LCSC es un mayorista de electrónica. El envío a América es caro, pero los componentes son ridículamente baratos. Ej: MOSFET en Amazon 6 $, en LCSC 0,32 $. Resistencias: 50 unidades por 0,84 céntimos.
- PROTEGE LOS CABLES DE DATOS LARGOS con papel alúminio conectado a tierra u otro blindaje. Por ejemplo, el cable I2C de la pantalla OLED.
- En el código: 1023 = más frío, 0 = lava. Cambia
settempa tu gusto; típicamente ~600. - El controlador detecta si el soldador está conectado o roto. Si se desconecta, el Arduino pone a cero la entrada analógica. Si el soldador calentaba bien y ahora no: desconéctalo, espera a que diga "enchufe soldador", y listo. (Este problema me pasó a mí).
Ahora conoces lo básico de tu soldador. Esta es una alternativa barata a comprar uno de calidad. Aunque hay soldadores mejores, este es muy barato y DIY.
Código
- Control Code (C/C++) – Versión básica solo con puerto serie
- The Code (C/C++) – Con pantalla OLED
- Code Updated 10/21/2019 (C/C++) – Versión final corregida
Control Code (C/C++)
Pégalo en Arduino y sube. Solo funciona con el circuito indicado.
int output = 0;
int temp = 0;
int settemp = 630;
String inputString = "";
boolean rap = false;
boolean stringComplete = false;
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 // descomenta para ajustar temp por serie
inputString = "";
stringComplete = false;
}
rapid();
pid();
}
void rapid() {
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() {
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() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}
}
}
The Code (C/C++) — Con OLED
Pégalo en el editor y sube. Solo funciona con el esquema diseñado.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
int settemp = 590;
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() {
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() {
temp = analogRead(0);
// Promediado de temperatura
temp2 = temp;
delay(50);
temp = analogRead(0);
temp = temp + temp2;
temp = temp / 2;
zeroscale(); // comprobación soldador desconectado
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() {
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() {
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 (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++) — Versión final
Pégalo en IDE y sube. Solo funciona con el esquema.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
int settemp = 590;
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() {
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() {
temp = analogRead(0);
// Promediado temperatura
temp2 = temp;
delay(50);
temp = analogRead(0);
temp = temp + temp2;
temp = temp / 2;
zeroscale();
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() {
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() {
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 (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);
}
}
Esquemáticos
Usa este esquema para crear el circuito del soldador:
Proceso de manufactura
- Sistema de Sensor de Temperatura Multiposición para Integración en Hogar Inteligente
- Construye tu Propio Juego de Ruleta de 37 LEDs con Arduino Nano
- MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
- Prevención de Incendios en Impresoras 3D: Sistema de Seguridad con Sensor Inteligente
- Integración MIDI para Órganos Digitales: Componentes y Guía de Configuración
- Levitación magnética repulsiva con Arduino: Circuito simple y guía DIY
- Robot pinza controlado remotamente para manipulación de precisión
- Laboratorio avanzado de microcontroladores: ESP32, Arduino, PIC y módulos de sensores
- Globo POV DIY: Arte LED con Persistencia de Visión y Arduino Mega
- Sistema Solar de Seguimiento Solar (Dual Axis) con Arduino UNO – Hazlo Tú Mismo
- CoroFence: Detector Térmico Avanzado con Sensor PIR e Integración IoT