Рукоятка паяльного фена и постройка станции на ее базе


Обзор ручки фена, подходящей к огромному количеству станций (858D, 8586, 8858, 852, 878, 952, 853), а так же постройка простой самодельной станции на ее основе.

Порой, монтаж без фена весьма затруднен или вообще невозможен и, столкнувшись в очередной раз с корпусом TQFP, я решился. За приобретение готового изделия говорила экономия времени, за постройку самодела – интерес и возможность полной кастомизации под свои нужды. Вопрос экономии тут весьма спорный, впрочем, в конце постараемся посчитать.
На AliExpress была выбрана и заказана ручка с набором из 5 сопел по принципу дешевле – лучше. Также, был заказан разъем GX16-8. Стоило сразу заказать и рукоятку, но она была заказана уже после постройки фена и все еще прорывается ко мне сквозь дебри нашей почты. Итак, что же мы получили:


Ручка выполнена из достаточно крепкого пластика, все провода выведены через переходную планку. Качество насадок спорное – сами по себе они вполне пригодны, но держатся на рукоятке не слишком крепко. Нужно накернить чуть сильнее уже имеющиеся углубления в насадках и проблема решена.

Турбина рассчитана на напряжение 24 В, потребляет ток 0.25 А.

Сам нагреватель обернут в стеклоткань (очень жесткую на изгиб) и вставлен в металлический наконечник ручки.

На конце нагревателя размещена термопара, тип скорее всего K (возможно, J). Сопротивление нагревателя в холодном виде 76 Ом, что дает нам мощность меньше 700 Вт. От наконечника выведен провод корпуса. На одной из половин корпуса находятся щели для забора воздуха турбиной. Я не знаю, конструктивная это особенность и задумка или просто косяк, но ребра жесткости на внутренней поверхности ручек закрывают эти щели почти наполовину.


Я не стал ломать голову и убрал лишний пластик.

Длина кабеля от рукоятки до части, где общая изоляция уже снята – ровно 100 см. Схема рукоятки:

Для создания контроллера станции первоначально я планировал использовать готовую Arduino Nano, но затем жадность и отсутствие лишнего места в будущем корпусе натолкнули на мысль поставить внутрь устройства МК Atmega328P-PU с минимальной обвязкой.

В качестве элемента индикации был взят популярный дисплей от Nokia 5110, в качестве элемента управления – роторный энкодер с кнопкой. Для питания турбины из закромов был взят старый импульсный блок питания от сканера, который имеет дежурный режим (около 7 В) и рабочий (24 В). Он же питает и контроллер через простой линейный стабилизатор LM7805 в корпусе TO-220. Потребляемый МК и дисплеем ток незначителен, и после установки небольшого алюминиевого радиатора на стабилизатор его нагрев не превысил 40 градусов. Питание нагревателя осуществляется симистором BTA12-600 (замечу, что он тут явно избыточен), который управляется МК через оптопару MOC3041M со встроенной схемой детекции перехода через ноль. Это, в совокупности со снабберной цепью, позволяет минимизировать уровень помех от переключения симистора. Выход термопары усиливается крайне простым и популярным ОУ LM358. Управление потоком воздуха осуществляется посредством мосфета IRLZ44N и ШИМ сигнала с МК. Такой же мосфет управляет переключением блока питания из дежурного режима в рабочий. Когда рукоятка фена снята с подставки, осуществляется нагрев потока воздуха до установленной температуры, турбина работает в соответствии с установленным потоком воздуха. После установки рукоятки в подставку нагрев прекращается, а турбина работает в режиме 50% в течении двух минут, после чего отключается и МК переводит блок питания в дежурный режим, выход из которого осуществляется при поднятии рукоятки с подставки. Режим работы станции отображается на дисплее рядом со значением установленной температуры латинской буквой (H – в данный момент осуществляемся нагрев, B – рукоятка в подставке, S — станция перешла в дежурный режим). Если использовать блок питания без дежурного режима, то транзистор T1, резисторы R8 и R9 можно исключить.
Скетч

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Encoder.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 8);                            // Определяем пины для подключения дисплея
Encoder myEnc(2, 3);                                                                   // Определяем пины для подключения энкодера
int encButton = 9;                                                                     // Определяем пин для подключения кнопки энкодера
int pinPWM = 10;                                                                       // Определяем пин для управления скорость вращения турбины
int pinSSR = 13;                                                                       // Определяем пин для управления коммутацией нагревателя
int pinOn = 12;                                                                        // Определяем пин для управления включением блока питания из дежурного режима
int pinBase = 11;                                                                      // Определяем пин для подключения геркона
static const unsigned char PROGMEM logo_bmp[] =                                        // Рисуем каркас меню
{ B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
  B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000
};

static const unsigned char PROGMEM cursor_bmp[] =                                      // Рисуем курсор
{ B11111111, B11111111,
  B10000000, B00000000,
  B10000000, B00000000,
  B10000000, B00000000,
  B10000000, B10000000,
  B10000000, B11100000,
  B10000000, B11111000,
  B10111111, B11111110,
  B10000000, B11111000,
  B10000000, B11100000,
  B10000000, B10000000,
  B10000000, B00000000,
  B10000000, B00000000,
  B11111111, B11111111
};

float realTemp = 0;                                                                    // Реальное значение температуры
int setTemp = 100;                                                                     // Установленное значение температуры
byte realPWM = 0;                                                                      // Реальное значение оборотов турбины
byte setPWM = 50;                                                                      // Установленное значение оборотов турбины
byte indexPWM = 0;                                                                     // Индекс для выбора правильных коэффициентов пересчета температуры
int realTempArray[100];                                                                // Массив для усреднения значения температуры при измерениях
unsigned long summTemp  = 0;                                                           // Сумма данных массива
int averTemp  = 0;                                                                     // Усредненная температура
int minTemp = 0;                                                                       // Минимальное значение температуры для станции
int maxTemp = 500;                                                                     // Максимальное значение температуры для станции
byte minPWM = 30;                                                                      // Минимальное значение оборотов турбины
byte maxPWM = 100;                                                                     // Максимальное значение оборотов турбины
long timeCurrent = 0;                                                                  // Таймер для хранения текущего времени
long timeMenu = 0;                                                                     // Таймер для управления меню
long timeMeasurement = 0;                                                              // Таймер для управления циклами измерений
long timeSleep = 0;                                                                    // Таймер для управления уходом в сон
long oldPosition  = 0;                                                                 // Переменная для чтения данных с энкодера
long newPosition = 0;                                                                  // Переменная для чтения данных с энкодера
bool selectMenu = LOW;                                                                 // Выбранное меню
bool flagEnc = LOW;                                                                    // Флаг для устранения дребезга при вращении энкодера
bool flagEncButton = LOW;                                                              // Флаг для устранения дребезга при нажатии энкодера
bool flagBase = HIGH;                                                                  // Флаг положения ручки в подставке
bool flagSleep = HIGH;                                                                 // Флаг состояния сна
bool heat = LOW;                                                                       // Флаг нагрева
int hysteresis = 3;                                                                    // Температурный гистерезис
float K[8] = {0.500, 0.528, 0.528, 0.535, 0.535, 0.522, 0.505, 0.492};                 // Мультипликативный коэффициент подсчета температуры
int A[8] = {36, 31, 32, 28, 23, 22, 22, 15};                                           // Аддитивный коэффициент подсчета температуры

void setup() {
  TCCR1B = TCCR1B & 0b11111000 | 0x02;                                                 // Устанавливаем частоту ШИМ на 10 выводе как 3906.25 Гц
  pinMode(A1, INPUT);                                                                  // Определяем аналоговый пин A1 на ввод (выход ОУ)
  pinMode(encButton, INPUT);                                                           // Определяем пин encButton на ввод
  pinMode(pinBase, INPUT);                                                             // Определяем пин pinBase на ввод
  pinMode(pinPWM, OUTPUT);                                                             // Определяем пин pinPWM на вывод
  pinMode(pinSSR, OUTPUT);                                                             // Определяем пин pinSSR на вывод
  pinMode(pinOn, OUTPUT);                                                              // Определяем пин pinOn на вывод
  digitalWrite(pinOn, HIGH);                                                           // Подаем на пин включения высокий уровень TTL (переводим блок питания из дежурного режима в рабочий)
  display.begin();
  display.setContrast(50);
  display.display();
}

void loop() {
  flagBase = !digitalRead(pinBase);                                                    // Получаем состояния пина pinBase
  timeCurrent = millis();                                                              // Получаем текущее время
  if ((timeCurrent - timeMeasurement) >= 100) {                                        // Если с прошлого измерения прошло больше 100 мсек
    heat = LOW;                                                                           // Выключаем нагрев
    digitalWrite(pinSSR, heat);                                                           // Отправляем на вывод состояние нагрева
    delay(50);                                                                            // Ждем 50 мсек (для исключения влияния помех от симистора)
    summTemp = 0;                                                                           // Обнуляем сумму
    for (byte i = 0; i <= 99; i++) {                                                      // И повторяем 100 раз цикл
      realTemp = analogRead(A1);                                                             // Считываем значение на A1
      realTempArray[i] = realTemp;                                                           // Записываем в массив показаний
      summTemp = summTemp + realTempArray[i];                                                // Складываем все элементы массива
    }
    averTemp = round(summTemp / 100);                                                     // Подсчитываем среднее арифметическое
    indexPWM = realPWM / 10 - 3;                                                          // Вычисляем индекс коэффициентов пересчета показаний в температуру
    realTemp = round(K[indexPWM] * averTemp + A[indexPWM]);                               // Вычисляем реальное значение температуры
    timeMeasurement = millis();                                                           // Записываем время проведения измерения
  }
  if (flagBase == LOW) {                                                               // Если ручка не в подставке
    digitalWrite(pinOn, HIGH);                                                            // Включаем блок питания из дежурного режима в рабочий
    flagSleep = LOW;                                                                      // Устанавливаем флаг сна в низкий уровень
    analogWrite(pinPWM, map(setPWM, 30, 100, 76, 255));                                   // Выводим ШИМ на pinPWM
    realPWM = setPWM;                                                                     // Приравниваем реальное значение PWM установленному
    if (setTemp > realTemp + hysteresis ) {                                               // Если установленная температуры выше чем сумма реальной и гистерезиса
      heat = HIGH;                                                                           // Включаем нагрев
    }
    if (setTemp < realTemp) {                                                             // Если установленная температура меньше реальной
      heat = LOW;                                                                            // Выключаем нагрев
    }
    digitalWrite(pinSSR, heat);                                                           // Отправляем на вывод состояние нагрева
    timeSleep = millis();                                                                 // Записываем последнее время, когда ручка не в подставке
  }
  else {                                                                               // Если ручка в подставке
    heat = LOW;                                                                           // Выключаем нагрев
    digitalWrite(pinSSR, heat);                                                           // Отправляем на вывод состояние нагрева
    if (((timeCurrent - timeSleep) <= 120000) && (flagSleep == LOW)) {                    // Если прошло меньше 120 секунд с последнего раза, когда ручка была не в подставке и станция не в режиме сна
      analogWrite(pinPWM, 128);                                                              // Выводим ШИМ с заполнением 50% на pinPWM
      realPWM = 50;                                                                          // Записываем в реальное значение ШИМ 50
    }
    else {                                                                             // Иначе
      digitalWrite(pinPWM, LOW);                                                          // Отключаем турбину
      realPWM = 0;                                                                        // Записываем в реальное значение ШИМ 0
      digitalWrite(pinOn, LOW);                                                           // Переводим блок питания в дежурный режим
      flagSleep = HIGH;                                                                   // Записываем в флаг сна высокое значение TTL
    }
  }
  display.clearDisplay();                                                              // Очищаем дисплей
  display.drawBitmap(0, 0,  logo_bmp, 84, 48, BLACK);                                  // Рисуем каркас меню
  display.setTextColor(BLACK);                                                         // Устанавливаем цвет текста
  display.setTextSize(2);                                                              // Устанавливаем размер текста
  display.setCursor(13, 3);                                                            // Устанавливаем координаты курсора
  display.println(realTemp, 0);                                                        // Выводим значение реальной температуры
  display.setCursor(56, 0);                                                            // Устанавливаем координаты курсора
  display.println("o");                                                                // Отрисовываем знак градуса
  display.setCursor(67, 3);                                                            // Устанавливаем координаты курсора
  display.println("C");                                                                // Отрисовываем "C"
  display.setTextSize(1);                                                              // Устанавливаем размер текста
  display.setCursor(22, 24);                                                           // Устанавливаем координаты курсора
  display.println(setTemp);                                                            // Выводим значение установленной температуры
  display.setCursor(46, 21);                                                           // Устанавливаем координаты курсора
  display.println("o");                                                                // Отрисовываем знак градуса
  display.setCursor(52, 24);                                                           // Устанавливаем координаты курсора
  display.println("C");                                                                // Отрисовываем "C"
  display.setCursor(70, 24);                                                           // Устанавливаем координаты курсора
  if (heat == HIGH) {                                                                  // Если нагрев включен
    display.println("H");                                                                 // Отрисовываем "H"
  }
  if (flagBase == HIGH) {                                                              // Если ручка в подставке
    if (flagSleep == LOW) {                                                               // Если станция не в режиме сна
      display.println("B");                                                                  // Отрисовываем "B"
    }
    else {                                                                                // Если станция в режиме сна
      display.println("S");                                                                  // Отрисовываем "S"
    }
  }
  display.setCursor(20, 37);                                                           // Устанавливаем координаты курсора
  display.print(realPWM);                                                              // Выводим значение реальных оборотов турбины
  display.print("/");                                                                  // Отрисовываем "/"
  display.print(setPWM);                                                               // Выводим значение установленных оборотов турбины
  display.print(" %");                                                                 // Отрисовываем " %"
  if (selectMenu == 0) {                                                               // Если выбран 0-ой пункт меню
    display.drawBitmap(0, 21, cursor_bmp, 16, 14, BLACK);                                 // Отрисовываем курсор напротив значения установленной температуры
  }
  else {                                                                               // Иначе
    display.drawBitmap(0, 34, cursor_bmp, 16, 14, BLACK);                                 // Отрисовываем курсор напротив значения оборотов турбины
  }
  display.display();                                                                   // Отображаем все на дисплее
  newPosition = myEnc.read();                                                          // Читаем позицию энкодера
  if (flagEnc == LOW) {                                                                  // Если флаг энкодера в низком уровне
    bool buttonState = digitalRead(encButton);                                              // Читаем в переменную buttonState значение с кнопки энкодера
    if (buttonState == 0) {                                                                 // Если это низкий уровень (кнопка нажата)
      if (flagEncButton == HIGH) {                                                             // Если флаг кнопки энкодера в высоком уровне
        selectMenu = !selectMenu;                                                                 // Выбираем следующий пункт меню
        flagEnc = HIGH;                                                                           // Устанавливаем флаг энкодера в высокий уровень
        timeMenu = millis();                                                                      // Записываем время, когда трогали меню
        flagEncButton = LOW;                                                                      // Устанавливаем флаг кнопки энкодера в низкий уровень
      }
      else {                                                                                   // Если флаг кнопки энкодера в низком уровне
        flagEncButton = HIGH;                                                                     // Устанавливаем его в высокий уровень
      }
    }
    else {                                                                                  // Если это высокий уровень (кнопка не нажата)
      flagEncButton = LOW;                                                                     // Устанавливаем флаг кнопки энкодера в низкий уровень
    }
    if (newPosition != oldPosition) {                                                       // Если позиция энкодера изменилась
      flagEnc = HIGH;                                                                          // Устанавливаем флаг энкодера в высокий уровень
      timeMenu = millis();                                                                     // Записываем время, когда трогали меню
      if (newPosition > oldPosition) {                                                            // Если новая позиция энкодера больше предыдущей
        if (selectMenu == 0 && setTemp < maxTemp) {                                                  // Если выбран пункт меню 0 и температура меньше максимальной
          setTemp = setTemp + 10;                                                                       // Увеличиваем температуру на 10
        }
        if (selectMenu == 1 && setPWM < maxPWM) {                                                    //  Если выбран пункт меню 1 и обороты меньше максимальных
          setPWM = setPWM + 10;                                                                          // Увеличиваем обороты на 10
        }
      }
      if (newPosition < oldPosition) {                                                            // Если новая позиция меньше предыдущей
        if (selectMenu == 0 && setTemp > minTemp) {                                                  // Если выбран пункт меню 0 и температура больше минимальной
          setTemp = setTemp - 10;                                                                       // Уменьшаем температуру на 10
        }
        if (selectMenu == 1 && setPWM > minPWM) {                                                    // Если выбран пункт меню 1 и обороты больше минимальных
          setPWM = setPWM - 10;                                                                         // Уменьшаем обороты на 10
        }
      }
    }
  }
  if ((timeCurrent - timeMenu) >= 250) {                                               // Если прошло больше 250 мсек с момента, как трогали меню
    flagEnc = LOW;                                                                        // Устанавливаем флаг энкодера в низкий уровень
    oldPosition = newPosition;                                                            // Сохраняем позицию энкодера
  }
}


Вся схема была опробована на макетке, после чего была изготовлена нормальная печатная плата, часть схемы, отвечающая за коммутирование сетевого напряжения, была вынесена на отдельную плату.


В качестве корпуса был использован пластиковый корпус Gainta G1034B с внешними размерами 151х90х53.2 мм. В передней части были изготовлены отверстия под дисплей, энкодер и разъем GX16-8, в задней под сетевой кабель и тумблер. Дисплей, энкодер и плата коммутации сетевого напряжения подключаются к основной через цанговые PLS разъемы с шагом 2.54 мм.



Сразу после постройки станция показывает нам значения напряжения на АЦП МК вместо температуры горячего воздуха, и ее нужно откалибровать. Для этого собираем «стенд» из собственно станции и прибора, которым будем измерять температуру.

Я не знаю реальных погрешностей прибора, и сразу укажу, что по факту мы не получим превосходной точности, и в той или иной степени показания нашей станции будут «попугаями». Но мне не нужна была точность до десятых долей градуса, а нужна была именно стабильность. Измерять мы будем температуру воздуха перед самым выходом из рукоятки, зафиксировав термопару прибора по которому производится калибровка. По факту, используя различные насадки, мы будем получать разную температуру воздуха на выходе из них, но этот недостаток присущ абсолютно всем фенам.

По результатам измерений мы получаем графики зависимости реальной температуры от показаний. Для каждого значения потока воздуха – свой график, то есть 8 графиков (от 30 до 100 % с интервалом в 10 %). Дело в том, что на такой длине провода на вход LM358 поступает существенная наводка от питания турбины, и ее значение нелинейно зависит от коэффициента заполнения ШИМ. Удобно результаты заносить сразу в Excel и использовать построение диаграмм с отображением формулы. Для каждого значения ШИМ мы получим формулу вида Y=K*X+A, где K — мультипликативный коэффициент, который записывается в массив значений K (для 30% это 0-ой член массива, для 40% 1-ый и так далее), а A — аддитивный коэффициент, записывающийся в скетч по тому же принципу с округлением до целого числа. Так мы сразу получаем два массива по 8 значений, которые и заносим в скетч с последующей загрузкой обновленной прошивки.

После этого мы получаем вполне пригодный для работы фен с установкой температуры в диапазоне 0 – 500 °С с шагом в 10 °С и установкой потока воздуха в диапазоне 30-100 % с шагом в 10 %. Диапазоны и шаг можно откорректировать в скетче.
Для подсчета экономической целесообразности подсчитаем затраты:
Рукоятка — 607,89 руб.
Подставка рукоятки – 267,83 руб.
Корпус – 160 руб.
Контроллер AtMega328P-PU – 90,08 руб.
ОУ LM358 (99,27 руб. за 20 шт.) – 4,96 руб.
Оптопара MOC3041M – 24 руб.
Энкодер – 40,53 руб.
Экран – 109,70 руб.
Разъем GX16-8 — 82,23 руб.
Кварц (96,92 руб. за 10 шт.) – 9,69 руб.
Мосфет IRLZ44N (102,79 за 10 шт., понадобилось 2 шт.) – 20,56 руб.
Симистор BTA12-600 (148,02 за 10 шт.) – 14,80 руб.
Плата FR4 размером 10x7 см (211,45 руб. за 5 шт.) – 42,29 руб.
Тумблер сетевой, разъем сетевой – около 100 руб.
СМД резисторы, конденсаторы, термоусадка, провода, термоклей и прочие расходники – еще около 100 руб.
Итого: 1674,56 руб.
Цены указаны на момент покупки оффлайн или заказа с учетом стоимости доставки. С одной стороны, это снижает стоимость (ведь никто вам не продаст всего 1 кварц за 9,69 руб.), с другой стороны почти все заказы содержали не одну позицию мелочевки, и на самом деле реальная стоимость доставки для каждой конкретной мелочи получается меньше.
UPD: Действительно, в подсчете не учтена стоимость блока питания, так как я использовал доставшийся бесплатно. За дешевый блок питания на напряжение 24 В и ток около 1 А придется выложить в районе 300 рублей, и общий бюджет упрется в сумму около 2 000 рублей.
Эта стоимость соответствует самому нижнему ценовому диапазону на фены и, можно сказать, что экономически постройка фена самому обоснованна. Однако, стоит учитывать количество потраченного времени на создание схемы, написание скетча, исполнение это «в металле» и последующее допиливание.

Файлы:
Основная плата
Плата коммутации
Библиотеки
Скетч прошивки

В схему, скетч и печатную плату периодически вносятся изменения на основе выявленных недостатков от меня самого и других людей, собравших фен. Прошу отнестись с пониманием, наиболее полные и функциональные варианты доступны по ссылке на google-диск.
Планирую купить +50 Добавить в избранное +92 +167
+
avatar
+4
Сегодня день рукояток
+
avatar
+9
Вообще-то это не ручка для фена, а сам фен:)
Все что надо — в наличии — и турбинка, и нагреватель…
+
avatar
  • alex323
  • 11 января 2018, 22:11
+2
Хороший обзор. Правильное решение.
Сколько на фен STM'ок с AMOLED'ами ни навесь, кроме красивостей дополнительных плюшек не получишь.
А тут гармоничное решение.
+
avatar
  • kvolk
  • 11 января 2018, 22:11
+8
Хорошая работа. Тоже хотел собрать на ардуино, но по деньгам самопал получается дороже, купил готовое решение — термофен 8858 за 1700 с копейками.
В экономической части обзора отсутствует стоимость блока питания, так что экономическая целесообразность в этом продукте отсутствует напрочь.
+
avatar
  • tirarex
  • 12 января 2018, 08:48
0
100 рублей на блок
+
avatar
  • kvolk
  • 12 января 2018, 11:34
0
Можно ссылочку, пожалуйста.
+
avatar
  • Bald
  • 12 января 2018, 09:25
+4
Если всё покупать, а не собирать зачем тогда нужен фен. А если нравиться собирать то и фен можно собрать
+
avatar
0
Хороший обзор. Себе покупал готовый. Сам бы не смог собрать.
Прошу прощения, а нет ли ошибки с расположением R15?
+
avatar
  • Am0k
  • 11 января 2018, 22:36
+1
Огромное спасибо, да, конечно там ошибка. Платку коммутации просто сразу в Sprint-Layout делал. Поправил.
+
avatar
  • noss
  • 11 января 2018, 23:24
0
Можно было бы добавить к обзору и печатку.
А так давольно красиво и бюджетно получитесь.
Молодец! :)
+
avatar
  • Am0k
  • 11 января 2018, 23:39
+2
Добавил в конце обзора.
+
avatar
  • noss
  • 12 января 2018, 00:36
0
Может в печатке сразу добавить фильт для lmки?
+
avatar
  • Am0k
  • 12 января 2018, 01:14
0
Там уже есть площадка типоразмера 1206 к земле, которая не использована. С8 кажется.
+
avatar
+1
Вы мой герой! Все думал на чем собирать фен)
+
avatar
+4
Вот вам еще вариант, надеюсь автор будет не против. Плата только для фена — 13.60$, для фена и паяльника — 16.15$, доставка бесплатная. Только надо будет еще трансформатор колхозить, или готовый искать
+
avatar
  • Serg32
  • 11 января 2018, 22:39
+2
Уважаю!
Если бы у меня не было покупной станции, собрал бы по этому обзору себе.
+
avatar
  • Rzzz
  • 11 января 2018, 23:05
+1
Термин «турбина» некорректен. Турбина — это когда наоборот, от потока воздуха крутится колёсико. А здесь — вентилятор. Центробежный.
+
avatar
+2
Турбина — это когда наоборот, от потока воздуха крутится колёсико.
В самолетных двигателях турбина создает давление воздуха
+
avatar
  • anapogo
  • 12 января 2018, 09:18
+4
Турбина крутит соосный вентилятор, который и создает давление воздуха…
+
avatar
  • Rzzz
  • 13 января 2018, 01:30
+2
Давление в самолётном моторе создаёт компрессор, потом камера сгорания. В турбине давление и температура снижается, поскольку часть энергии уходит на привод компрессора, вентилятора и вспомогательных механизмов.
+
avatar
  • Goga59
  • 13 января 2018, 15:07
0
Давление в самолётном моторе создаёт компрессор, потом камера сгорания.
Вы уверены, что досконально разобрались в принципе работы авиадвигателей? Которые, кстати, так и называются — «турбовентиляторными»?
+
avatar
  • Rzzz
  • 13 января 2018, 16:46
+2
К чему вопрос-то? Вы о моем образовании заботитесь и что-то новое хотите сообщить, дополнить, так сказать мой багаж знаний?
+
avatar
+2
Да только лишь к тому, что Ваши познания в мире «самолётных моторов», как бы сказать, неточны. В турбовентиляторном авиадвигателе повышенное давление на входе создаёт вентилятор, а его приводит в движение турбина, которая находится после основной камеры сгорания, как и уточнил уважаемый anapogo. Как то так. Это совершенно не ново, это, так сказать, азы и классика авиадвигателестроения.
+
avatar
  • Rzzz
  • 14 января 2018, 22:11
+2
Уважаемый, вы хоть читаете посты, которые комментируете? Пожалуйста, перечитайте повнимательнее, что я написал.
Вентилятор, кстати, присутствует далеко не во всяком газотурбинном двигателе, и если он присутствует, то большая часть воздуха, проходящего через вентилятор в двигатель вообще не попадает.
+
avatar
0
Уважаемый, прежде чем кого то поучать, перечли бы собственные каменты. Речь зашла про самолётные двигатели, где
В самолетных двигателях турбина создает давление воздуха
На что было справедливо замечено, что
Турбина крутит соосный вентилятор, который и создает давление воздуха…
Каким боком к этому относится Ваше
Давление в самолётном моторе создаёт компрессор, потом камера сгорания. В турбине давление и температура снижается, поскольку часть энергии уходит на привод компрессора, вентилятора и вспомогательных механизмов.
?
+
avatar
  • Rzzz
  • 19 января 2018, 10:20
0
А я что-то неправильно написал?
И вы немного путаете последовательность комментов.
+
avatar
+6
Дело в том, что на такой длине провода на вход LM358 поступает существенная наводка от питания турбины
Ох… У термопары сопротивление — омы. Поставьте на входе резистор на общий провод 100 Ом и конденсатор, и не будет никаких наводок от питания турбины. Но нет, лучше 8 графиков :)

Сразу не заметил наличие выключателя на входе устройства (по схеме его нет, а на фото такой ракурс, что кажется, что это какое другое устройство). Хочу сказать, что выключатель тут обязателен! (Посмотрите видео про возгорание паяльных станций Lukey.) Идея проста — в выключенном состоянии идет высоковольтная помеха из сети и пробивает симистор. Включается нагреватель фена, но без турбины. Нагреватель разогревается до «красна», плавится и загорается пластмасса. И ни один автомат или УЗО этому процессу помешать не смогут — ведь 700 Вт вполне себе нормальная нагрузка.
+
avatar
0
del
+
avatar
  • Am0k
  • 11 января 2018, 23:13
+1
Выключателя нет в схеме, действительно, просто потому что схема приведена скорее для тех, кто сможет из нее что то для себя взять, добавив свой блок питания и коммутацию. В изделии он стоит, что видно на фотографии и отображено в подсчете итоговой стоимости. Пары проводов — это на питание БП и на нагреватель.
Насчет помех на входе ОУ — вы, вероятно, правы, но добавить 2 массива по 8 значений в скетч мне тоже было совсем не сложно.
+
avatar
0
Понял вас, прошу прощения. Имелось в виду именно устройство.
+
avatar
  • CuMr
  • 12 января 2018, 01:39
0
У термопары сопротивление — омы. Поставьте на входе резистор на общий провод 100 Ом и конденсатор, и не будет никаких наводок от питания турбины.
с терморезистором не попутано?
+
avatar
+4
Нет. Откуда у термопары большое сопротивление? Это спай двух проводов разных материалов, в котором (в месте спая) возникает ЭДС (напряжение то есть), именно его измеряет мультиметр. Т.е. её сопротивление можно сделать почти 0 Ом, если взять большую площадь спая. Например, в жале паяльника Т12 термопара включена последовательно с нагревателем и через неё идет ток до 3 А.

А вот терморезистор — это строго наоборот. Большое сопротивление, никакого ЭДС.
+
avatar
  • CuMr
  • 12 января 2018, 03:49
0
del
(попробовал)
+
avatar
0
Отличная работа, отличный обзор! Побольше бы таких!
Завтра ещё раз перечитаю на свежую голову.
+
avatar
  • yurannn
  • 12 января 2018, 00:43
0
+
avatar
  • Am0k
  • 12 января 2018, 01:22
+2
Насколько мне известно, в фенах 8018 нет термостабилизации. Подобный фен уже обозревался тут уважаемым kirich.
+
avatar
+3
Вот обзор подобного, я купил тут все нравится только жестоват и коротковат сетевой кабель…
+
avatar
0
Существует ли термофен для bakon'a?
+
avatar
  • woddy
  • 12 января 2018, 05:09
0
ссылка на подставку есть?
видимо пришла пора продавать люкей852. давно паяю Т12, держал его только ради фена
+
avatar
0
а не проще использовать цифровой преобразователь для термопары типа MAX6675?
+
avatar
  • CuMr
  • 12 января 2018, 07:06
0
А зачем? Там ведь все равно попугаи плюс-минус километр.
+
avatar
  • sir0ta
  • 12 января 2018, 07:15
0
А почему километр? Чем термопара плоха?
+
avatar
  • Am0k
  • 12 января 2018, 09:28
+2
Термопара, в принципе, не плоха. Плох сам принцип измерения температуры на выходе нагревателя (насадки разные, они будут ее немного менять). Да и в целом не нужна тут точность. Выставил 300, попробовал — сдувает нормально, и работай. К тому же цена lm358 совсем уж копейки, а диапазон измеряемых температур регулируется коэффициентом усиления.
+
avatar
  • sir0ta
  • 12 января 2018, 09:42
0
Да не будет там такой дикой смены температуры. Дело все в том что эти поверье пошло еще из первых фенов, где не было термостабилизации и… ну короче поделки на коленке. Я просто сколько делал, не было такой дичи. Ну одеваешь насадку, ну начинает подниматься температура из-за ухудшевшейся проходимости воздуха, но я же шимлю нагреватель не просто так в процентном соотношении от повернутой ручки, а от текущей температуры. В этот раз дюже хочу пид попробовать.
И еще я как-то не понял по схеме где у вас фаза разрывается? Я что-то… вообще туплю дико… Можно суть конденсатора C9 и резистора R17?
И ниже камрад спросил по поводу библы для энкодера. Я бы тоже поинтересовался.
+
avatar
  • Am0k
  • 12 января 2018, 10:15
+1
Я добавил ссылку на комплект библиотек и сам скетч. Фаза разрывается на симисторе.
+
avatar
  • sir0ta
  • 12 января 2018, 10:21
0
А
И еще я как-то не понял по схеме где у вас фаза разрывается? Я что-то… вообще туплю дико… Можно суть конденсатора C9 и резистора R17?
+
avatar
  • Am0k
  • 12 января 2018, 12:47
0
Применена стандартная схема управления нагрузкой через симистор с опторазвязкой. Конденсатор C9 и резистор R17 служат для подавления помех при переключениях симистора.
+
avatar
  • pesche
  • 12 января 2018, 12:52
+2
C9 R17 уменьшает скорость dV/dt на симисторе, отчасти. Сделано это для снижения его шансов самопроизвольно включиться. Примерно как в импульсных БП диоды вторичной цепи шунтируют такими же цепочками.
+
avatar
  • sir0ta
  • 12 января 2018, 15:35
0
Спасибо. Значит попробуем заюзать, но проблем с подобным не имел )
+
avatar
0
Такой вопрос. Хочу исследователь усиление на lm358, исследовать буду в orcad 9.2. Нужно указать параметры входного сигнала на лм-ку (сигнал термопары), вы можете указать характеристики, которые поступают с термопара фена? (ток, напряжение, частота и тд и какой тип сигнала(синусоидальный или какой-то другой))
+
avatar
  • Am0k
  • 12 января 2018, 13:35
0
С термопары на вход ОУ поступает постоянное напряжение. Зависимость этого напряжения от температуры спая близка к линейной в интересующем нас диапазоне температур, и для K типа составляет 40 μV/°C, для J типа 55 μV/°C. На входе ОУ шум в отсутствии внешних помех незначителен. На выходе конктретно у этого ОУ шум будет, есть гораздо более современные и качественные ОУ.
+
avatar
-2
Температура регулируется за счет обратной связи термопары внутри корпуса, а она измеряет температуру горячего воздуха (вблизи термопары), поэтому если одеть другую насадку, то температура не измениться, так как контроллер будет поддерживать температуру внутри одинаковую. Расход воздуха, да, измениться.
+
avatar
  • Am0k
  • 12 января 2018, 17:09
+2
Температура не изменится на термопаре. А вот на выходе из насадки слегка может, так как разная геометрия насадок предполагает разные потери температуры при прохождении воздуха сквозь них. По факту, это колебания после выхода температуры на стабильную по величине сопоставимы с гистерезисом в скетче в 3 °C. Для меня совершенно не критичные, а для кого то может быть и да.
+
avatar
  • sir0ta
  • 14 января 2018, 19:04
0
Для меня совершенно не критичные, а для кого то может быть и да.
Я даже не представлю для кого. 20-30 градусов — уже конечно может и критично, но 2-3-5 градусов… ни о чем.
+
avatar
  • sir0ta
  • 14 января 2018, 19:03
0
С чего изменится расход воздуха? Не изменится. Увеличится скорость выходная с фена, но объем продуваемого воздуха (в пределах возможности ветродуя) будет не изменен. И сорян, промахнулся и минус поставил.
+
avatar
0
А зачем? Там ведь все равно попугаи плюс-минус километр.
ну почему километр? MAX6675 снята с производства. есть более вкусный вариант MAX31855.

теперь следите за руками:
— точность MAX31855 в диапазоне -200°C..+700°C всего ±2°C и скорее всего чип может и больше (мои догадки) просто точность любой К-термопары как раз и есть ±2°C и точнее делать смысла нет
— шаг измерения температуры термопары 0.25°C. выше смысла нет, см пункт первый
— MAX31855 имеет компенсацию холодного спая. у автора ее нет. стоит температуре в корпусе фена подняться выше комнатной, а она подымется. все его калибровки и температура поплывут.
— с наводками у нее проблем меньше

так что вполне себе решение и замена архаичному оу.
+
avatar
  • sir0ta
  • 14 января 2018, 19:12
0
стоит температуре в корпусе фена подняться выше комнатной, а она подымется. все его калибровки и температура поплывут.
Не ясно как температура в корпусе именно фена скажется на отображаемую температуру. В тех же т12 ручках часто и густо ставят термистор для корректировки отображаемой температуры в зависимости от окружающей, но я так и не понял в чем фишка.
А так заказал одну на попробовать. Спасибо.
+
avatar
  • CuMr
  • 14 января 2018, 22:17
+1
Не ясно как температура в корпусе именно фена скажется на отображаемую температуру.
Как работает термопара — знаете?
Термопара показывает не абсолютное значение температуры, а разницу температур между холодным и горячим спаем.
В тех же т12 ручках часто и густо ставят термистор для корректировки отображаемой температуры в зависимости от окружающей, но я так и не понял в чем фишка.
Вот для того и ставят.
+
avatar
  • sir0ta
  • 15 января 2018, 06:55
0
Термопара показывает не абсолютное значение температуры, а разницу температур между холодным и горячим спаем.
Но как их поведение изменится от температуры окружающей среды. Как-нибудь по штудируем.
+
avatar
0
А откуда брали билиотеку от энкодера?
+
avatar
  • sir0ta
  • 12 января 2018, 07:14
+1
Норм конечно. Но один энкодер… 2 потенциометра и ляпота.
Это с паяльником вполне одного энкодера хватит. А тут и воздух и температуру. Сам делал подобное, но продал. Сейчас осталось ОУ дождаться и буду новый собирать. Хотел с сенсорным экраном, интерфейс нарисовал, на макетку загрузил, потыкал и понял что это так же не удобно как и один энкодер…
+
avatar
  • Am0k
  • 12 января 2018, 09:30
0
А чем плох энкодер? Покрутил температуру, нажал покрутил обороты. Нажатие переключает пункт меню.
+
avatar
  • sir0ta
  • 12 января 2018, 09:43
+4
А чем плох энкодер?
Ни чем. Просто 2 крутилки это круто ) Ну и как по мне довольно удобно. Лишний раз не тыкаешь. Тут дело вкуса )
+
avatar
  • Am0k
  • 12 января 2018, 10:20
+1
Да, две крутилки лучше. Но у Atmega328 только 2 прерывания (а без использования прерываний энкодер работает крайне нестабильно), поэтому добавить второй энкодер (это к тому же даст вторую кнопку — появится возможность расширить меню и добавить набор из нескольких пресетов, хранящихся в EEPROM) пока что план на далекое будующее. Можно конечно добавить эту функциональность длинными, короткими и прочими нажатиями энкодера, но мне очень не нравится такое управление во многих изделиях из поднебесной. В любой самоделке главное — вовремя остановиться, потому что правило 30% работы дают 70% результата еще никто не отменял.
+
avatar
+1
правило 30% работы дают 70% результата
20х80 же
+
avatar
0
Нужно 1нф на ноги A и B к земле повесить от дребезга контактов.
Есть PCINT1-XX. Есть прерывание по таймеру. Почему нужно использовать именно INT1-2 не понятно.
+
avatar
+1
вот тут я вам открою секрет. кто мешает вешать первое прерывание на только на ОДНУ ногу первого эткода и дочитывать значение второй ноги первого энкодера после срабатывания прерывания.

а второе прерывание вешать на только на ОДНУ ногу втрого эткода и дочитывать значение второй ноги втрого энкодера после срабатывания прерывания.

даже библиотеку для этого написал, где это можно легко реализовать — elchupanibrei.livejournal.com/29025.html
+
avatar
  • Am0k
  • 12 января 2018, 17:11
0
Да, действительно, это удобно. Я думаю кто захочет, добавит сюда и второй. У меня уже не влезет нормально в корпус, да и потребности нет.
+
avatar
0
Еще вместо операционника лучше применить MAX31855 он не так критичен к наводкам и имеет компенсацию холодного спая. Точность от этого будет вразы выше (кончно если вы поставите микросхему возле холодного спая), а код меньше, тк ненужна линеаризация и прочи танцы с экселем.
+
avatar
0
А есть что то подобное но готовое? Без ручки, без БП… просто контроллер.
Аналогично платке для т12.
+
avatar
  • anapogo
  • 12 января 2018, 09:41
0
Так Вам-же дали ссылку в коментариях — на Али, но увы там нет ни энкодера, ни графического дисплея, ни…
Уже 1.5 года лежит такой фен, все ждал подходящую схему.
А здесь все хотелки и сразу, даже печатка и исходник прошивки…
Огромное спасибо автору.
+
avatar
  • anapogo
  • 12 января 2018, 12:41
0
в том-то и дело, что дорого…
+
avatar
  • snag
  • 12 января 2018, 09:57
0
Если не сложно, можете более подробно объяснить использование МНК при формировании массива коэффициентов
Спасибо — отличный проект!!!

И еще вопрос — обязательно использовать 40амперный мосфет? Он же управляет вентиляторов только?.. Подойдут менее мощные, с материнки например?
+
avatar
  • Am0k
  • 12 января 2018, 10:24
+1
Снимаем показания, записываем в табличку в Excel. В нем строим диаграмму отображения зависимости Y (реальная температура) от X (показания нашей станции) с отображением графика, получаем формулу Y = K*X+A. Для каждого значения ШИМ записываем в массивы K и A, для 30% как 0-ой член массива, для 40% как 1-ый и так далее до 7-ого для 100% ШИМ. В итоге 2 массива по 8 чисел. Массив A округляем до целых, он аддитивный, и точность в десятые доли градуса в нем ничего нам не даст.
+
avatar
  • Am0k
  • 12 января 2018, 12:55
0
Конечно, мосфет подойдет и на гораздо меньший ток. Главное, чтобы он нормально переключался от логических ТТЛ уровней (параметр Gate threshold voltage в даташите должен быть меньше 5 В, а лучше в диапазоне 2...4 В), обычно это транзисторы с буквой L в маркировке (logic level). Небольшой запас по току тоже стоит иметь (хотя сейчас наверное сложно найти мосфет на ток меньше 0.25 А), транзистор переключается часто и в момент переключения какая то мощность на нем все равно рассеивается. Я взял этот просто потому что он всегда лежит в запасе в достаточном количестве, с ним никогда не было проблем с управлением логическими уровнями и он действительно «дубовый».
+
avatar
  • snag
  • 12 января 2018, 13:17
0
Огромное спасибо. К своему стыду не знал что в екселе через трендовую линию можно построить аппроксимацию.
К слову довольно удобно подобный результат можно получить в бесплатном Graph.
Теперь знаю чем займусь в ближайшее время. С той разницей, что есть жменька семисегментников, сдвиговых регистров и потенциометров 10К. Цена вопроса 556 рублей заказать фен (у этого же продавца есть лот с платной доставкой в Россию :-) дешевле получается).
Еще раз спасибо!
+
avatar
  • Am0k
  • 12 января 2018, 13:27
0
Не за что. Было бы интересно почитать про использование семисегментников с динамической индикацией.
+
avatar
  • snag
  • 12 января 2018, 17:49
0
Еще несколько вопросов, если я Вам не надоел :-)
— на странице продавца в описании лота и в комментах, если я правильно понял, есть версии 12в и 24в.
есть какие то преимущества?, 12-ти вольтовый БП проще подобрать.
— за что отвечает uint32_t currentFrequency;?
— переменная pars дважды обнуляется и больше ни где не используется. Я правильно понял, что она использовалась при подборе количества выборок для усреднения и сейчас не нужна?
— по поводу динамической индикации, боюсь Вы правы, в лупе есть задержка для подавления помех, тем более я хотел их два приспособить. Впрочем есть дисплей от телефона 3110. Но он на 3,3в, или на Вашем шилде есть преобразователи уровней?
— как я понял в качестве опорного для АЦП используется Vcc. Но 7805 может выдавать от 4,8 до 5,2 в. Или коэффициенты компенсируют все возможные погрешности?
-у меня в наличии МОС 3036. Нужно ли менять параметры R13, R3?
— ОУ нет. Покупать такой же или посоветуете другой?
+
avatar
  • snag
  • 12 января 2018, 18:30
0
МОС 3063 — описАлся
+
avatar
  • Am0k
  • 12 января 2018, 19:35
+1
Да, у продавца можно выбрать. Я не знаю, на какой ток рассчитана 12 В версия вентилятора, если по мощности он сопоставим с 24 В версией, то не вижу разницы какой брать.
uint32_t currentFrequency, так же как и переменная pars, действительно просто занимают пару байт памяти. Первая осталась по ошибке от родственного проекта на дисплее, вторая использовалась для усреднений. Я подправил, спасибо.
На шилде дисплея преобразователя уровней нет. Я пока не сталкивался с проблемами по поводу толерантности дисплея 5110, рассчитанного на 3.3 В логику с 5 вольтовой логикой. Может мне просто везло.
Да, в качестве опорного напряжения для АЦП используется Vcc. Можно использовать внутренний 1.1 В, уменьшив примерно в 4 раза коэффициент усиления ОУ, но я бы не сказал что он намного стабильнее.
3063 аналог этой оптопары, так же имеет встроенную детекцию перехода через ноль как и вся серия 304X и 306X.
Если ОУ нет, то LM358 отличный вариант для покупки, это самый дешевый ОУ, который есть везде. Из популярного есть еще TL072, он дороже и лучше, но для этого применения разницы нет.
+
avatar
0
На шилде дисплея преобразователя уровней нет. Я пока не сталкивался с проблемами по поводу толерантности дисплея 5110, рассчитанного на 3.3 В логику с 5 вольтовой логикой. Может мне просто везло.
говорят проблем то нет — работают. только не долго. у вас как раз рельный шанс это опровергнуть. ждем отчет через полгода-год.
+
avatar
  • sir0ta
  • 12 января 2018, 11:34
+3
Да схем вагон. Вопрос термоконтроля и простоты настройки и отладки схемы. Ну и в наш век не юзать мк при их копеечной цене… такое себе )
+
avatar
  • Imho
  • 14 января 2018, 20:21
0
Так чем Вас подобный вариант не устраивает arduino.ru/forum/proekty/kontroller-payalnogo-fena?page=3
И просто и защита присутствует и релейное управление, все по феншую. Дешево и безопасно )))
+
avatar
  • sir0ta
  • 14 января 2018, 20:54
0
Меня? В данном случае кнопки. Крутилки всегда быстрее.
А что такое релейное управление?
Плюс хочу пид контроль… Да много что хочу )
Я ж говорю реализаций вагон.
И экран… Хочу большой 12864. Но может и маленький такой. Олед не хочу. Он убер мелкий. У меня есть парочка. Один в более или менее пользовании на минидельте. Не удобно. Слишком мелкое все.
+
avatar
  • Imho
  • 14 января 2018, 22:08
0
Ну на вкус и цвет как говориться )))
Пид контроль и большой экран все хотят, хотя… ))
Кстати у Олега как раз на энкодере, хотя кто то требует кнопки )))
Я бы не сказал что реализаций именно фена так уж много, по мне так всего то несколько проектов и уж тем более на Атмеге.
Реле, имеется ввиду управление защитой через реле, тиристоры и иже с ними, слишком это все пожароопасно, зато безопасно, ну и что бы контроль нуля, тут же (при всем уважение к автору), в данной схеме защита отсутствует вовсе и при пробитии тиристора, фен уйдет в неконтролируемый нагрев со всеми вытекающими… ) )) Все исключительно ИМХО
+
avatar
  • sir0ta
  • 15 января 2018, 06:54
0
Реле, имеется ввиду управление защитой через реле
Сказать честно и эта защита такая себе по надежности ) Механическая кнопка на входе в разрыв 220В и все будет норм. А так правило хорошего тона «уходя гасите Свет» )))
при пробитии тиристора
Не факт что его пробьет на кз. 50/50. Да и как уже сказал выше… Плюс я хочу бипер. На новой плате на паяльник такая тема удобная. Включил и даже не смотришь на экран, чисто бик. Можно паять. Хотя и Т12 и и так ждать надо 5 секунд.
+
avatar
  • Demz
  • 12 января 2018, 11:51
+1
ну всё. теперь у меня нет отмазок, чтобы не сделать фен, учитывая, что все запцацки уже пару лет пылятся в коробочке…
+
avatar
  • aponya
  • 12 января 2018, 15:58
0
Огромное спасибо за обзор. Лежит такой фен надо будет заняться.
+
avatar
  • Beest
  • 12 января 2018, 21:00
+1
Все хорошо, но на заметку автору я бы схему доработал, включил защиту в цепи нагревателя то может случится так как в 58 посте arduino.ru/forum/proekty/ocherednaya-payalnaya-stantsiya?page=1#comment-180495
+
avatar
0
Уважаемые, а можете посоветовать бюджетно-качественный фен для демонтажа электронных компонентов с плат?
+
avatar
  • rmb
  • 13 января 2018, 10:45
0
Можно ссылку на энкодер, чтобы в схему подошел?
+
avatar
  • Am0k
  • 14 января 2018, 00:39
0
Я использовал такой. Можно использовать голый энкодер, тогда нужно добавить два резистора по 10 КОм, подтягивающих A и B выводы к плюсу питания.
+
avatar
0
+
avatar
  • Am0k
  • 15 января 2018, 15:42
+1
Да, будет. Насколько позволяет судить схема, используется программная компенсация температуры холодного спая, так что если добавить в ручку терморезистор на 10КОм, она будет работать.
+
avatar
0
Огород! Замечания:
1. по паспорту 7805 на входе держит не более 18 вольт, можно заменить на любой импульсный.
2. блок питания 24+3 — блок от принтера Canon(k30292), 24+3 — 850ма.
3. Контроллер заменяем Arduino mini — размеры минимальны, цена меньше в разы по сравнению с изготовлением платы.
4. MOC3041M, IRLZ44N и дисплей — есть готовые платы на али.
Таким образом, всё что указано можно заказать в виде конструктора и собрать в любой корпус, в течении 30 минут.
+
avatar
  • Am0k
  • 15 января 2018, 15:38
0
На вкус и цвет. Кроме жгутов к энкодеру и экрану полусим еще кучу жгутов от ардуино ко всему остальному. Я и сам как писал планировал с нано, шить удобно если еще чтото захотел добавить, не надо жгут из 5 проводов через программатор кидать. Но потом захотелось сделать более менее по взрослому. А в чем цена платы? 20 рублей за текстолит?
+
avatar
0
А что за платы? Линк есть?
+
avatar
0
для примера , всё можно найти еще дешевле.
+
avatar
0
по паспорту 7805 на входе держит не более 18 вольт
Это с какого перепугу??
Первый попавшийся даташит

Input Voltage (VO = 5V to 18V) 35 V
+
avatar
  • kiv69
  • 16 января 2018, 20:10
0
Хороший фен. Правда, с разработкой платы на него заморачиваться не стал, купил на алике родную плату.
Немного её переделал для полной запитки от 24VDC.
Остальное просто распечатал.
+
avatar
0
Фьюзы для atmega328p какие выставлять?
+
avatar
  • snag
  • 29 января 2018, 13:39
0
Здесь скетч под Arduino IDE. Если не усложнять, просто из нее же прошейте загрузчик для UNO по ISP. Она же автоматом установит нужные фьюзы. Мегу можно поставить в макетку (кварц и кондеры желательно то же поставить).
+
avatar
0
Все понял, спасибо за ответ.
+
avatar
0
Здравствуйте. Как на странно, приехал такой же фен, распаял разъем, собрал станцию, ветер дует, жар идет, но… При обращении с феном было не понятно, пока шевелишь (трясешь) в руке, температура держится, как только в «спокойствии» падает. Много искал причину в станции, но оказалось всё проще при разборе данного девайса. Оказалось наши «желтолицые братья по мастерингу» вместо геркона (датчика) прибабахали датчик вибрации, как на паяльниках. ОФ.ИГЕТЬ!!! Чуть станцию не выкинул. Вот напрашивается вывод — неужель прежде чем включать китайское изделие, нужно у него в мозгах порыться? Всем удачи!!!
+
avatar
  • Sanglier
  • 02 февраля 2018, 01:59
0
Здравствуйте! Давно лежит такой фен, только на 12в, конструкция, считаю, замечательная, нарисовал другую плату под свой корпус… Не могу понять как работает дежурный режим в вашем блоке питания, он что 24в с 3в через резистор замыкает? Как это? Поясните, пожалуйста.
+
avatar
  • Am0k
  • 02 февраля 2018, 09:57
0
На выходе блока питания около 7 вольт без нагрузки. При подаче их через резистор на 3 вход БП формируется 24 вольта. Мне кажется, если есть фен на 12 вольт, проще взять дешевый 1 амперный блок, а соответствующие транзистор и два резистора из схемы исключить.
+
avatar
  • Sanglier
  • 02 февраля 2018, 15:19
0
Да, так и будет, спасибо за ответ. Для общего развития:)
+
avatar
0
Здравствуйте.Подскажите куда копать.Собрал схему а курсор скачет все время верх низ даже без енкодера.
+
avatar
  • Am0k
  • 27 марта 2018, 18:52
0
Добавил в файл Sprint-Layout резистор R18 для подтяжки вывода МК к +5В на случай, если такого резистора нет на плате энкодера.
+
avatar
  • aidar_i
  • 02 апреля 2018, 11:47
0
Получил такую же ручку, попробовал подключить к ардуино через мосфет(схема такая же) к 10 пин с изменением частоты ШИМ, как у Вас, моторчик ниже 90% начинает свистеть, у Вас не шумит? И что можно сделать?

Сделал шаг 1%, при 65% перестает крутиться моторчик, может шкалу сделать с учетом этого? Ставил при испытании
analogWrite(pinPWM, map(setPWM, 30, 100, 76, 255));.
+
avatar
  • aidar_i
  • 02 апреля 2018, 14:29
0
У автора статьи с первого поста кулер работает при шкале 30-100/76-255 при частоте ШИМ на 3906.25 Гц. Изменил частоту ШИМ на 3906.25 Гц. Начал отдельно испытывать кулер, создав шкалу 0-100/0-255 обнаружил, что при оборотах 65% (на ШИМ 165) двигатель перестает крутиться и пищит, померил напряжение тестером 19,05в.
Без изменения частоты ШИМ двигатель включается при оборотах 20%, напряжение тестером 5,9в.Решил оставить без изменения частоты ШИМ.
+
avatar
0
Я как ни бился ничего не выходило.Движок работал только на 100 %. Возможно это связано с тем, что я изменил схему. Основное питание у меня 5 вольт, 24 вольта делает преобразователь. Помог конденсатор 22 мкФ на входе движка. Теперь регулируется от 5% с шагом 5. Для измерения температуры поставил МаХ6675.
При выключении изменен алгоритм, теперь пока температура не падает до 20 градусов, турбина дует на100%.
+
avatar
0
Как подключить модуль max6675 к данной схеме и если можно как изменить скетч для этого модуля
+
avatar
0
Какого номинала должен быть резистор R18 для подтяжки вывода МК к питанию чтобы курсор не прыгал на экране?
+
avatar
  • Am0k
  • 07 сентября 2019, 21:44
0
10 кОм
+
avatar
0
Спасибо собрал всё работает осталось собрать в корпус и купить на али подставку для фена вот только дисплей работает не стабильно то показывает то нет.Можно ли подключить другой дисплей
+
avatar
0
Можно ли заменить дисплей на oled дисплей?
+
avatar
  • Am0k
  • 27 сентября 2019, 21:45
0
Заменить дисплей конечно можно, тут не то что oled, но и в 1602 lcd все уместить можно. Но разумеется придется установить нужную библиотеку, подправить немного код и графику.
+
avatar
0
Помогите построить графики в экселе не могу выставить деления горизонтальной шкалы как у вас на рисунке у меня получается 1 2 3 4 5 6 7 а не 200 400 600 800, как это сделать? я в экселе не силён
+
avatar
  • Am0k
  • 03 декабря 2019, 08:06
0
Попробуйте сразу в мой файл калибровки свои значения забить, чтобы не заморачиваться с Exel-ем, я и сам не силен в нем, но нужда заставила:
drive.google.com/open?id=1kIVslnNhh_wwUYiPS6cWZgkMM5ohE07Z
+
avatar
0
спасибо что откликнулись с шкалой разобрался, но у меня в уравнении получаются целые числа пример:y=77.929x+21 R*=0.9888 пробовал по вашим параметрам строить графики программа выводит уравнение тоже с целыми числами что делать?
+
avatar
  • Am0k
  • 04 декабря 2019, 07:19
0
Как тогда вы что-то измерили, ведь при показаниях всего 10 у вас получится 800+ градусов? Для правильной калибровки необходимо вначале в скетче задать коэффициенты, равные

float K[8] = {1, 1, 1, 1, 1, 1, 1, 1};
int A[8] = {0, 0, 0, 0, 0, 0, 0, 0}; 

и затем снять показания, получить нужные коэффициенты в Exel, внести их в скетч и перепрошиться.
+
avatar
0
попробую сегодня, у меня при 30% кулер вообще стоит на месте и пищит, как снять показания при 30% если нет потока воздуха может нужно что то поменять в скетче?
+
avatar
  • Am0k
  • 05 декабря 2019, 08:59
0
Ну если при 30 % стоит то это либо такая турбинка, либо напряжение заниженное для нее. А так можно просто исключить эту скорость если она не нужна.
+
avatar
0
Не могу победить эту калибровку может эксель стоит не тот у меня 13 года.Температура на выходе отличается от установленной на 100 градусов а так всё работает хорошо.Пробовал менять лмку не помогло, может подскажете что не так
+
avatar
  • Am0k
  • 06 декабря 2019, 11:12
0
Чудес не бывает, реальная температура рассчитывается из показаний АЦП в этой строке

realTemp = round(K[indexPWM] * averTemp + A[indexPWM]);

Меняете калибровочные коэффициенты K (мультипликативный) и A (аддитивный), прошиваете — меняются показания. Чтобы из Exel получить первоначальные коэффициенты, нужно изначально в прошивке задать их равными 1 и 0

float K[8] = {1, 1, 1, 1, 1, 1, 1, 1};
int A[8] = {0, 0, 0, 0, 0, 0, 0, 0}; 

и уже потом полученные показания забить в Exel и получить их истинные значения. Они в свою очередь будут зависеть от коэффициента усиления ОУ.
+
avatar
0
Я прошивал с такими коэффициентами, снимал показания, строил графики в эксель но коэффициент К получается всё равно целым числом уровнение ведь выводится автоматически в экселе на каждом графике.Не пойму как так получается
+
avatar
0
Повторил самодельный термо-фен, работает отлично, спасибо за хороший обзор.

+
avatar
  • Am0k
  • 27 октября 2021, 13:25
0
Вам спасибо, что поделились своей работой.