Soldering Station v5.0 – Hakko 936 "на стероидах"

Есть у меня «рабочая лошадка» — Hakko 936. Работает исправно уже больше 2х лет.
Но мне хотелось большей информативности и возможности менять некоторые характеристики станции.

Решил сделать «с нуля» свою станцию(без фена, т.к. хотелось некой мобильности) на основе atmega328 на «китайдуино nano».

Скетч честно пытался писать сам, но не осилил, и заказал его. Потом дорабатывал под себя(символы, заставка).

Корпус решил взять в магазине электротоваров. Подошла по габаритам коробка распаячная Tyco 200х140х75 IP55.

Блок питания взял с запасом: XK-2412-24 (220В.->24В.6a)

Экран решил использовать двухстрочный:LCD1602 с зелёной подсветкой.

Адаптер I2C к экрану на PCF8574AT

Пошла мелочевка: Разъем для паяльника GX12 5 Pin

Энкодер с кнопкой EC11

«Степ-даун» конвертер gw1584 для питания ардуинки и экрана.

Двухканальный операционный усилитель LM358P для снятия даных с датчика температуры паяльника.

Полевой транзистор — IRFZ44N для управления нагревательным элементом паяльника путем ШИМ-модуляции.

Кнопка включения, разъем для питающего шнура, держатель плавких вставок(Fuse), резисторы, керамические конденсаторы, светодиод, провода итд — все это было в наличии у меня, покупать не пришлось.

Схема была скопирована и доработана из «схемы паяльной станции Aleks Link для ардуино NANO». Изменена под управление инкрементным энкодером с защитой от «дребезга».
Вот оригинальная схема:

Почти все в схеме осталось нетронутым — заменил только экран.

Приступаю к сборке — высверлил все нужные отверстия и пропилил прямоугольник для экрана:

Этапы установки элементов

Платка операционника — коряво, из того что было…

Полевик — все контакты залил изолятором потом.

Энкодер с припаянным делителем на резисторах:

Проверка работоспособности скетча:

Готовый вид — невзрачно, но работоспособно:

С разных ракурсов но еще не собран окончательно



По итогу: Вышло не плохо, набор температуры от комнатной до 300гр. за ~20-25сек.
Поддержание заданной температуры(но паять массивные детали не стоит.)
Есть режим «сон», который вырубает поддержку температуры(жало перестает нагреваться)через 10минут(в моем случае), при этом, станция работает, но на экране справа будет знак «S» — sleep. Для выхода из режима сна, нужно повернуть энкодер в любую сторону, и тогда знак поменяется на «W» — work, и начнется набор температуры до выставленной.

Скетч, по понятным причинам, не публикую, но покажу скетч от первоисточника — там нужно подправить вывод на экран(семисегментник) и всё.

Скетч первоисточника
/*  Arduino IDE 1.5.4  Паяльник на Arduino Pro Mini v0.4    Alex link  http://www.youtube.com/c/AlexLink-Free  http://vk.com/linklife  http://www.facebook.com/groups/Arduno.life/  // Пины еодключения индикаторов  ANODES(CATHODES):  D1 — a  D2 — b  D4 — c  D6 — d  D7 — e  D5 — f  D3 — g  D0 — dp (digital point) Я НЕ подключал — резерв… индикатора :)))    a1  ********  * *  f * * b2  5 * g3 *  ********  * *  e * * c4  7 * d6 *  ******** # dp0    CATHODES(ANODES):  D16 — cathode 3  D15 — cathode 2  D12 — cathode 1  */    // ————————————————————————————————  int indicator = 1; // 0 = Катод  1 = Анод  — Выбрать под Ваш индикатора !!!!    byte digits[] = {  B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};    int digit_common_pins[]={16,15,12}; // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)  int refresh_delay = 5;  int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000  long actual_count_delay = 0;  long actual_refresh_delay = 0;  int increment = 0; //Стартовое значение на сегментах  int max_digits =3; // Кол-во знакомест  int current_digit=max_digits-1;  int increment_max = pow(10,max_digits);  // ————————————————— не изменять, это для Сегментов ————————————————    //——————— переменные паяльника ——————————  int knopka = 3; //Пин кнопки    int tin = 0; // Пин Датчика температуры IN Analog через LM358N  int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM    int tempust = 230; // установленная температура  int tempmin = 200; // минимальная температура  int tempmax = 480; // максимальная температура  int tempreal = 250; // переменная датчика текущей температуры  int temppwmmin = 40; // минимальное значение PWM нагревателя  int temppwmmax = 180; // максимальное значение PWM нагревателя  int temppwmreal = 0; // текущее значение PWM нагревателя  int airreal = 100; // стартовое значение PWM вентилятора(если нужно)    int temperror = -50; // разница температур(установленная — реальная)    int temprazn = 0; // переменная разницы температуры(установленная — текущая)    void setup(){    if(indicator == 0){ //Если вначале был выбран общий Катод  for(int i=0; i<10;i++){  digits[i] = ~ digits[i];  }  }    pinMode(pinpwm,OUTPUT); // Порт нагрузки(паяльника) настраиваем на выход  analogWrite(pinpwm, temppwmreal); //Вывод шим в нагрузку паяльника (выводим 0 — старт с выключеным паяльником- пока не опредилим состояние температуры)    // ————————————————— не изменять, это для Сегментов ————————————————  DDRD = B11111111;  for (int y=0;y<max_digits;y++)  {  pinMode(digit_common_pins[y],OUTPUT);  digitalWrite(digit_common_pins[y], LOW);  }  // ————————————————— не изменять, это для Сегментов ————————————————    }    void loop() {    show(increment); // Вывести значение переменной на экран(LED)    if (tempreal < tempust ){ // Если температура паяльника ниже установленной температуры то:    if ((tempust — tempreal) < 16 & (tempust — tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,  // Если разница меньше 10 градусов то  {  temppwmreal = 99; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева  }  else if ((tempust — tempreal) < 7 & (tempust — tempreal) > 3)  {  temppwmreal = 80; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева  }    else if ((tempust — tempreal) < 4 ) { temppwmreal = 45; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева } else { temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255 мы делаем 230) на максимум для быстрого нагрева до нужной температуры } analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } else { //Иначе (если температура паяльника равняется или выше установленной) temppwmreal = 0; // Выключаем мощность нагрева (шим 0-255 мы делаем 0) — таким образом мы отключаем паяльник analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } if(millis() — actual_count_delay > count_delay) // это для сегментов    {  actual_count_delay = millis();  // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)    tempreal = analogRead(0);// считываем текущую температуру    tempreal=map(tempreal,-50,700,0,500); // нужно вычислить  increment=tempreal;    //———————————————————- Кнопки ————————————————————————-  if (analogRead(knopka) == 0) // Если нажата вниз кнопка то понизить температуру на 5  {  if( tempust <= tempmin || (tempust-5) <= tempmin ) { tempust= tempmin; increment = tempust; } else { tempust=tempust-5; increment = tempust; show(increment); // Вывести значение переменной на экран(LED) } } else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 ) // Если нажата вверх кнопка то повысить температуру на 5 { tempust=tempust+5; if( tempust >=tempmax)  {  tempust= tempmax;  }  increment = tempust;  show(increment); // Вывести значение переменной на экран(LED)    }    }  }    void show(int value) { //——————————- подпрограмма для вывода на сегменты — лучше не изменять ———————————————  int digits_array[]={};  int y=0;  boolean empty_most_significant = true;    if(millis() — actual_refresh_delay >= refresh_delay)  {    for (int z=max_digits-1;z>=0;z—)  {    digits_array[z] = value / pow(10,z); //rounding down by converting from float to int    if(digits_array[z] != 0 ) empty_most_significant = false; // DON’T SHOW LEADING ZEROS    value = value — digits_array[z] * pow(10,z);    if(z==current_digit)  {  if(!empty_most_significant || z==0){ // DON’T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT    PORTD = digits[digits_array[z]];  }  else  {  if(indicator == 0){ //Если вначале был выбран общий Катод  PORTD = B00000000;  }  else{  PORTD = B11111111;  }  }    if(indicator == 0){  digitalWrite(digit_common_pins[z], LOW);  }  else{  digitalWrite(digit_common_pins[z], HIGH);  }  }  else{    if(indicator == 0){  digitalWrite(digit_common_pins[z], HIGH);  }  else{  digitalWrite(digit_common_pins[z], LOW);  }  }    }    current_digit—;  if(current_digit < 0)  {  current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS  }    actual_refresh_delay = millis();  }    }    

И обновленный скетч от первоисточника:

/*  Arduino IDE 1.5.4  Паяльник на Arduino Pro Mini  v0.4    Alex link  http://www.youtube.com/c/AlexLink-Free  http://vk.com/linklife  http://www.facebook.com/groups/Arduno.life/   // Пины еодключения индикаторов   ANODES(CATHODES):   D1 - a   D2 - b   D4 - c   D6 - d   D7 - e   D5 - f   D3 - g   D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))           a1     ********     *      *   f *      * b2   5 *  g3  *     ********     *      *   e *      * c4   7 *  d6  *     ******** # dp0      CATHODES(ANODES):   D16 - cathode 3   D15 - cathode 2   D12 - cathode 1   */    // ------------------------------------------------------------------------------------------------  int indicator = 1; // 0 = Катод  1 = Анод  Выбрать под Ваш индикатор !!!!    byte  digits[] = {    B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};    int digit_common_pins[]={16,15,12};  // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)  int refresh_delay = 5;  int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000  long actual_count_delay = 0;  long actual_refresh_delay = 0;  int increment = 0;   //Стартовое значение на сегментах  int max_digits =3;  //  Кол-во знакомест  int current_digit=max_digits-1;  int increment_max = pow(10,max_digits);  // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------      //--------------------- переменные паяльника -----------------------------  int knopka = 3; //Пин кнопок      int tin = 0; // Пин Датчика температуры IN Analog через LM358N  int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM    int tempust = 230; // установленная температура  int tempmin = 200; // минимальная температура  int tempmax = 480; // максимальная температура  int tempreal = 250; // переменная датчика текущей температуры  int temppwmmin = 40; // минимальное значение PWM нагревателя    int temppwmmax = 180; // максимальное значение PWM нагревателя  int temppwmreal = 0; // текущее значение PWM нагревателя  int airreal = 100; // стартовое значение PWM вентилятора(если нужно)    int temperror = -50; // разница температур(установленная - реальная)    int temprazn = 0; // переменная разницы температуры(установленная - текущая)    void setup(){       if(indicator == 0){   //Если вначале был выбран общий Катод                      for(int i=0; i<10;i++){                                             digits[i] = ~ digits[i];                                             }                     }        pinMode(pinpwm,OUTPUT);     // Порт нагрузки(паяльника) настраиваем на выход    analogWrite(pinpwm, temppwmreal);     //Вывод  шим в нагрузку паяльника (выводим 0 - старт с выключеным паяльником- пока не опредилим состояние температуры)           // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------    DDRD = B11111111;    for (int y=0;y<max_digits;y++)            {             pinMode(digit_common_pins[y],OUTPUT);             digitalWrite(digit_common_pins[y], LOW);                }    // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------    }    void loop() {          show(increment);   // Вывести значение переменной на экран(LED)                if (tempreal < tempust ){   // Если температура паяльника ниже установленной температуры то:                      if ((tempust - tempreal) < 16 & (tempust - tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,                                       // Если разница меньше 10 градусов то                                {                                 temppwmreal = 99;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева                                }               else  if ((tempust - tempreal) < 7 & (tempust - tempreal) > 3)                                                                  {                                                                                  temppwmreal = 80;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева                                                                   }                                                           else if ((tempust - tempreal) < 4 )                                                        {                                                                       temppwmreal = 45;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева                                                         }                                                                                                                                              else {                                    temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255  мы делаем 230) на максимум для быстрого нагрева до нужной температуры                                   }                                                                  analogWrite(pinpwm, temppwmreal);     //Вывод в шим порт (на транзистор) значение мощности      }   else { //Иначе (если температура паяльника равняется или выше установленной)                             temppwmreal = 0;  // Выключаем мощность нагрева (шим 0-255  мы делаем 0)  - таким образом мы отключаем паяльник              analogWrite(pinpwm, temppwmreal);   //Вывод в шим порт (на транзистор) значение мощности            }            if(millis() - actual_count_delay > count_delay) // это для сегментов       {        actual_count_delay = millis();       // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)           tempreal = analogRead(0);// считываем текущую температуру            tempreal=map(tempreal,-50,700,0,500);   // нужно вычислить      increment=tempreal;        //---------------------------------------------------------- Кнопки -------------------------------------------------------------------------              if (analogRead(knopka) == 0)  // Если нажата вниз кнопка то понизить температуру на 5                                 {                                 if( tempust <= tempmin || (tempust-5) <= tempmin )                                                            {                                                              tempust= tempmin;                                                              increment = tempust;                                                            }                                         else {                                                tempust=tempust-5;                                               increment = tempust;                                               show(increment);   // Вывести значение переменной на экран(LED)                                                                                              }                                                                                                                                        }                else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 )  // Если нажата вверх кнопка то повысить температуру на 5                                         {                                         tempust=tempust+5;                                         if( tempust >=tempmax)                                                            {                                                              tempust= tempmax;                                                            }                                         increment = tempust;                                         show(increment);   // Вывести значение переменной на экран(LED)                                                                                 }              }  }    void show(int value) { //------------------------------- подпрограмма для вывода на сегменты   - лучше не изменять ---------------------------------------------    int digits_array[]={};      int y=0;    boolean empty_most_significant = true;               if(millis() - actual_refresh_delay >= refresh_delay)    {        for (int z=max_digits-1;z>=0;z--)    {          digits_array[z] = value / pow(10,z); //rounding down by converting from float to int            if(digits_array[z] != 0 ) empty_most_significant = false;  // DON'T SHOW LEADING ZEROS            value = value - digits_array[z] * pow(10,z);                if(z==current_digit)          {           if(!empty_most_significant || z==0){ // DON'T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT                                                            PORTD = digits[digits_array[z]];                                              }                                         else                                              {                                               if(indicator == 0){   //Если вначале был выбран общий Катод                                                                  PORTD = B00000000;                                                                    }                                                       else{                                                             PORTD = B11111111;                                                            }                                                }           if(indicator == 0){                            digitalWrite(digit_common_pins[z], LOW);                           }               else{                    digitalWrite(digit_common_pins[z], HIGH);                   }        }   else{              if(indicator == 0){                            digitalWrite(digit_common_pins[z], HIGH);                           }               else{                    digitalWrite(digit_common_pins[z], LOW);                   }     }    }              current_digit--;        if(current_digit < 0)         {          current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS        }      actual_refresh_delay =  millis();        }    }  

Если есть вопросы, задавайте. По возможности буду отвечать.

Добавить в избранное +3 +6

(c) 2017 Источник материала

Пролистать наверх