DIY-контроллер паяльника 862D+ — точность и надёжность
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino Nano R3 | 1 | |
| Обычный диод (фляйбэк) | 1 | |
| MOSFET IRF540N (N-канальный) | 1 | |
| Линейный стабилизатор 5 В | 1 | |
| Резистор 330 Ом | 1 | |
| Пин-хадеры (мама) | 2 | |
| OLED 0.96" | 1 |
Необходимые инструменты
- Паяльник
- Дрель с 8-мм сверлом
О проекте
Обновление (21.10.2019): крупное обновление кода. Читайте ниже — кое-что изменилось.
Мой паяльник 862D+ сломался. Вместо покупки нового взял второй такой же и починил. Сложность: в сети нет решения. Плата была сломана — после замены жала всё равно выдавало S-E (sensor error).
Решил сделать свой контроллер и затхнуть внутрь. Потребовался второй трансформатор, но он дешёвый, места внутри хватает.
Может, некрасиво, но работает идеально. Бонус: убрал кнопку питания паяльника, поставил её между 5 В и Arduino.
Советы по сборке
- Все детали купить можно сейчас. LCSC — оптовый электронный магазин. Доставка в США дорогая, но компоненты копейки. Пример: MOSFET на Amazon $6, на LCSC — 32 цента. Резисторы в-party — 50 шт за $0.0084.
- Обязательно экранируйте длинные сигнальные провода заземлённой фольгой или иначе. Например, провод I2C к OLED.
- В коде: 1023 — холодно, 0 — лава. Меняйте
settempпод себя. Обычно ~600. - Контроллер определяет, подключено ли жало или оно сломано. Если жало отключено — Arduino обнуляет аналоговый вход. Если жало грелось нормально, а теперь нет: отключите жало, подождите сообщения «plug iron in», затем подключите снова. (У меня это была проблема).
Теперь вы знаете основы. Это дешёвая альтернатива качественным паяльникам. Есть и лучше, но этот — очень дешёвый и DIY.
Код
- Control Code — базовая версия (только Serial-управление).
- The Code — версия с OLED и ПИД.
- Code Updated 10/21/2019 — актуальная версия с исправленным
zeroscale().
Control Code (C/C++)
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(); 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++) — с OLED
#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);
temp2 = temp; delay(50); temp = analogRead(0); temp = (temp + temp2) / 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++;
if (counter > 10) { counter = 0; if (temp > settemp + 3) powermultiply++; if (temp < settemp - 3 && powermultiply > 0) powermultiply--; }
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.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++) — исправленная версия
// ... те же инклуды и переменные ...
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.print("Output offset set."); display.setCursor(0, 0); display.print("Connect the iron."); display.display();
do { scaleread = analogRead(0); } while (scaleread < 200);
}
}
// остальные функции без изменений
Схемы
Используйте эту схему для сборки контроллера:
Производственный процесс
- Многопозиционная система датчиков температуры для интеграции в умный дом
- Создание рулетки на 37 светодиодов с Arduino Nano
- MotionSense: умная система обнаружения проникновения на Arduino и ESP8266
- Пожарная безопасность 3D-принтера: умная система обнаружения дыма
- MIDI-интеграция для цифровых органов: превращение старой консоли в MIDI-контроллер на Arduino Mega
- Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
- Продвинутый дистанционно управляемый манипулятор-робот для точной работы
- Продвинутая лаборатория микроконтроллеров: ESP32, Arduino, PIC и сенсорные модули
- DIY POV-сфера: LED-световизуализация на Arduino Mega
- CoroFence: термический детектор на GridEye + PIR с IoT