
Но мне хотелось большей информативности и возможности менять некоторые характеристики станции.
Решил сделать «с нуля» свою станцию(без фена, т.к. хотелось некой мобильности) на основе 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(); } }
Если есть вопросы, задавайте. По возможности буду отвечать.
(c) 2017 Источник материала