Очередная паяльная станция

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Добрый день всем. Планируется заказ печатных плат на производстве. За основу взята плата от Руслана, вынесен модуль усилителя и причёсана платка под заводское изготовление. Платы планируются с металлизацией, маской. Текстолит 1,6-2мм. На одном куске размещены основная плата и модули усилителя под термопару и терморезистор.

Примерная стоимость составит примерно 350р. за комплект. Пробная партия будет заказываться через неделю. 5 комплектов. Возможно большее число комплектов. Один оставляю себе, второй другу. Если кому еще надо, обращайтесь.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Кто подскажет как картинки под спойлер прятать.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

При включении паяла иногда появляется небольшой косячёк. При включении паяльника температура растет, немного забегает за установленную, тут же снижается, и вместо того, чтобы пикнуть пару раз и перейти в режим поддержки температуры, паяльник отключается с ошибкой i6. Если его сразу опять включить с кнопки, то дальше работает как ни в чем не бывало. Паяльник китаец прислал с термопарой. Фен тоже с термопарой, но на нем все нормально работает. Каналы усилителя идентичны, только номиналы резисторов немного отличаются. Связывался с автором на Ютубе, посоветовал уменьшить коэффициент #define sKp 50. Пробовал и уменьшать и увеличивать. Не помогает. Прошивка 2.2 от Руслана, сравнивал с оригинальной автора, разница только в выводе информации на дисплей. Кто что думает по этому поводу?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

alex1978 пишет:
паяльник отключается с ошибкой i6. Если его сразу опять включить с кнопки, то дальше работает как ни в чем не бывало.

Это дополнительная защита, срабатывает по условию "если до момента стабилизации, температура падает или не изменяется в течении 5 сек". Можно попробовать увеличить время if (t_cnt == 5) в функции SDoProtect() до 7-10 сек.
А вообще, если что, доп. защиты можно деактивировать закомментив дефайн S_ADV_PROT_ON

Цитата:
#define sKp 50. Пробовал и уменьшать и увеличивать. Не помогает.

До какой величины уменьшали? Увеличивать точно не стоит - могут возникнуть автоколебания. Уменьшая коэфф. несколько увеличивается время выхода на заданную температуру, но уменьшается и перерегулирование. Можно снять график набора температуры - нагляднее будет.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Добрый вечер, Олег, sKp 50 уменьшал как вы и советовали до 20-ти, при 40-ка немного стабильнее, но один фиг ошибки бывали, при 60-ти кстати ошибки вылетали реже чем при 40-ка и 50-ти. Вообще может быть проблема в ОУ? Просто операционники я заказывал естественно из поднебесной, у нас в городе не было в дип корпусах. Из 10-ти штук 4 были битые, да ещё китаёза прислал LM358P вместо LM358. Я вот тоже кстати подумывал об увеличении времени, но не знал как это сделать. В программировании я не силён. У паяльника инерция намного больше чем у фена. Да и качество китайских паяльников и фенов по ходу с каждым днём все хуже и хуже...

 

 

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Кстати при 20-ти и 30-ти вообще паяло не работает, только ошибки сыпет.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Всё заработало как надо после увеличения времени до 10 секунд. Ещё раз спасибо за данную разработку! Кстати, заказаны пять комплектов плат, по цене вышло 340р. за штуку. Кому надо, обращайтесь.

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

У меня в текущей версии - 7, ложных срабатываний не было.
Правда и нагреватель не нихромовый, возможно, у него поменьше инерционность.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Мне просто некогда сейчас подбирать, поставил сразу 10 секунд, заработало. Поосвобожусь, подберу поменьше. Да и паяльник заменить хочу, китаец прислал откровенное фуфло, он уже разваливается. Платы придут, соберу всё по нормальному, пока у меня на самодельной плате, а они у меня никогда нормально не получались...

peterzonda
Offline
Зарегистрирован: 25.11.2016

Привет, у меня тоже проблема. Я хочу переделать станцию сращивания, я сделал печатную плату, я загрузил программу в ардуин, но у меня есть только оригинальный писатель, чтобы не писать мне все. Так что из Словакии так переведено на переводчика, я не знаю, как переводить, я пытаюсь отправить фотографию, загрузите на этот дисплей 2004A.

peterzonda
Offline
Зарегистрирован: 25.11.2016

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

peterzonda, привет.
Пару вопросов.
Библиотека для дисплея из моего архива?
Какая версия Arduino IDE?

PS. Возможно это поможет (сообщение 38).

 

 

 

peterzonda
Offline
Зарегистрирован: 25.11.2016

Версия Arduino - 1,8,4, дисплей, который я точно не знаю, с какой версией я работал, я установил их для новой.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Я думаю, что у Вас старая библиотека. Попробуйте удалить её и использовать эту.

peterzonda
Offline
Зарегистрирован: 25.11.2016

И разве вы не знаете, как я должен загрузить версию этой станции?

peterzonda
Offline
Зарегистрирован: 25.11.2016

Спасибо, спасибо. И программное обеспечение на станции, которое сработало для меня?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Не совсем понял, о чём речь, но последнюю версию скетча и требуемые библиотеки (1.5) можно скачать здесь.
Ссылка также есть в сообщении #2 темы.

Andrey__01
Offline
Зарегистрирован: 06.03.2017

alex1978 я бы хотел преобрести плату как мне связатса с вами

 

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Напишите на alexfree78@yandex.ru Платы уже якобы отправлены, думаю недели через 2-3 будут у меня. Проверю, спаяю свой экземпляр и буду рассылать желающим. Цена вышла 350р. за штуку, плюс стоимость пересылки.

peterzonda
Offline
Зарегистрирован: 25.11.2016

Я хочу узнать, где присоединиться к GerKon.Fen, начнется сука и примерно через 3 секунды.

peterzonda
Offline
Зарегистрирован: 25.11.2016

на котором булавка arduina - это GерKон?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Геркон подключается к D10.

Русл@н
Offline
Зарегистрирован: 14.04.2016

DEL

peterzonda
Offline
Зарегистрирован: 25.11.2016

Где я могу подключить его к этой схеме?

Русл@н
Offline
Зарегистрирован: 14.04.2016

pin d10(13)

peterzonda
Offline
Зарегистрирован: 25.11.2016

есть письменная CS и 4-контактный разъем

peterzonda
Offline
Зарегистрирован: 25.11.2016

   Я не хочу нагреть меня HotAir, напишите мне! 6 Разве вы не знаете, что может быть?

aleksandrov
Offline
Зарегистрирован: 08.07.2017

Вопрось к alex1978. Можно получить файл Вашей плате в формате .lay ?

Благодарю.

 

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Конечно можно. Не жалко. https://yadi.sk/d/UTXaf4or3Mw4i2

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Вопрос к автору. Я запихал в ручку паяльника геркон, как в фене. Что нужно изменить в коде, чтобы таймер начинал отсчет только когда паяльник на подставке, и канал паяльника вырубался по истечении времени таймера. А когда паяльник не на подставке чтоб никаких таймеров и работал постоянно.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

peterzonda пишет:
Я не хочу нагреть меня HotAir, напишите мне! 6

Насколько я понял - Вы включаете фен, он не нагревается и на дисплей выводится защита №6?
В таком случае всё верно - нет нагрева, поэтому и ошибка.
Фен может не нагреваться по двум причинам -
1. Не работает симисторный узел.
2. Не работает узел контроля 0 сети.
Как проверить и то и другое уже описывалось в теме.

alex1978 пишет:
Что нужно изменить в коде, чтобы таймер начинал отсчет только когда паяльник на подставке, и канал паяльника вырубался по истечении времени таймера.

Скетч с возможностью выбора поведения таймера паяльника под спойлером.
Для включения режима "отсчёт таймера выключения паяльника только на подставке" нужно
раскомментировать #define SOLDER_TIMER_ON_STAND

/* * * * * * * * * * * * * * * * * * */
/*       Soldering Station v 1.6     */
/*           coded by OlegK          */
/*    arduino.ru/forumy/proekty      */
/* * * * * * * * * * * * * * * * * * */

#include <EEPROM.h>
#include <CyberLib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>
#include <avr/io.h>
#include <avr/interrupt.h>

/* it's fuckin' magic! */
#if 1
__asm volatile ("nop");
#endif

/* Options */

/* if you need to create themperature diagramm then uncomment it */
//#define NEED_GRAPH

/* if used not rail-to-rail OPA, then uncomment it */
//#define LM358

/* if used passive busser, then uncomment it */
//#define PASSIVE_BUZZER

/* if you want deactivate additional protection, then COMMENT it */
#define HA_ADV_PROT_ON
#define S_ADV_PROT_ON

/* if used LCD 1602, then uncomment it */
//#define LCD_1602

/* Soldering iron - if you want to remove the digit jumps, then uncomment it */
//#define SOLDER_DIGIT_JUMPS_REMOVE

/* Hot Air - if you want to remove the digit jumps, then uncomment it */
//#define HOTAIR_DIGIT_JUMPS_REMOVE

/* if you want soldering iron soft start, then uncomment it */
//#define SOLDER_SOFT_START

/* if you want to activate soldering iron off-timer only on stand, then uncomment it */
//#define SOLDER_TIMER_ON_STAND

/* End options */


#define FIRMWARE_VERSION "1.6"

#ifdef LCD_1602
LiquidCrystal_I2C lcd(0x27, 16, 2);
#else
LiquidCrystal_I2C lcd(0x27, 20, 4);
#endif


/* Degree symbol */
uint8_t degree[8] = {
    B01100,
    B10010,
    B10010,
    B01100,
    B00000,
    B00000,
    B00000,
    B00000
};

/* Arrow symbol */
uint8_t arrow[8] =  {
    B00000,
    B00100,
    B00010,
    B11111,
    B00010,
    B00100,
    B00000,
    B00000
};

/* mode selector */
#define  modeSolder 1
#define  modeHotAir 2
#define  modeFanPWM 3

boolean need_S_countdown = false;
byte selected_Mode = modeSolder;
byte HA_countdown = 1;
byte S_countdown = 1;
uint16_t HA_sleeptime = 10;
uint16_t S_sleeptime = 10;
uint16_t Graph_count = 0;
uint32_t UPbuttonPressTime = 0;
uint32_t DWNbuttonPressTime = 0;
uint32_t SONbuttonPressTime = 0;
uint32_t HAONbuttonPressTime = 0;

boolean UPbuttonState, DWNbuttonState, SONbuttonState, HAONbuttonState;
byte Count;
uint16_t Duration, Interval;

char bspace[ ] = "    ";

#define pinBuzzer 12
#define pinFanPwm 6
#define pinSolderPwm 5

#define min_solder_temp 100
#define max_solder_temp 400
#define min_hotair_temp 20
#define max_hotair_temp 450
#define min_rpm 30
#define max_rpm 100
#define default_temp 280
#define default_rpm 50

/* Buttons */
#define sw_HA 10
#define sw_S 9
#define bt_SON 13
#define bt_HAON 14
#define bt_Sel 15
#define bt_Up 16
#define bt_Dwn 17

/* Bounce killers */
Bounce swHotAir = Bounce();
Bounce swSolder = Bounce();
Bounce SolderOnButton = Bounce();
Bounce HotAirOnButton = Bounce();
Bounce SelButton = Bounce();
Bounce UpButton = Bounce();
Bounce DwnButton = Bounce();

/* Hot Air */

/* states */
#define st_stop 0
#define st_work 1
#define st_pause 2
#define st_protection 3
//#define st_lowpower 4

byte hotair_state = st_stop;

volatile uint16_t ots = 9990;
volatile float HAPower = 0.0;
uint16_t GetHotAirT = 0;
uint16_t SetHotAirT = 100;
byte SetHotAirRPM = 100;
boolean HA_temp_stable = false;
boolean need_Cooling = true;
boolean scr_blink = false;

byte ha_error = 0;
boolean HA_prot_beep = false;
boolean ha_f1 = false;
boolean ha_f2 = false;
uint32_t prevHAcontrol;

/* HA PI regulator */
#define Kp 1.0
#define Ki 0.007 //0.003 //0.005 //0.05
int integral = 0;

/* Soldering iron */
uint16_t GetSolderT = 0;
uint16_t SetSolderT = 100;
boolean S_temp_stable = false;
boolean SolderON = false;
boolean SolderProtect = false;
int SPower = 0;
//byte solder_state = st_stop;

byte s_error = 0;
uint32_t prevScontrol;
boolean S_prot_beep = false;
boolean s_f1 = false;
boolean s_f2 = false;

/* Solder P regulator */
#define sKp 50

uint16_t last_HotAirT, last_SolderT;
byte last_RPM;


/********************************************* MAIN PROCEDURES *********************************************/

void setup() {
    //ADC speedup
    //ADCSRA &= ~(1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0); // reset 128
    //ADCSRA |= 1 <<ADPS2; // set to 16 (1MHz)

    pinMode(3, INPUT_PULLUP); //Zero cross pin
    D5_Out; //pinSolder
    D5_Low;
    D4_Out; //pinSolderProt
    D4_Low;
    D7_Out; //pinHotAirProt
    D7_Low;
    D8_Out; //pinHotAir
    D8_Low;
    D12_Out; //pinBuzzer
    D12_Low;
    ButtonsSetup();

#ifdef NEED_GRAPH
    Serial.begin(9600);
#endif

    Serial.begin(9600);

    lcd.begin();
    lcd.backlight();
    lcd.createChar(0, degree);
    lcd.createChar(1, arrow);
    Splash();
    MemRead();

    delay_ms(2000);

    initDisplay();
    attachInterrupt(1, ZC, FALLING);
}

void loop() {
    ScanButtons();

    /* Off-timer for HotAir, countdown with 1 min */
    static uint32_t prevHAmillis = millis();
    if (hotair_state == st_pause) {
        if (millis() - prevHAmillis > 60000) {
            prevHAmillis = millis();
            if (HA_countdown > 1) {
                HA_countdown--;
                if (HA_countdown == 1) {
                    Beep(100);    //Beep, if 1 minute left
                }
            } else {
                hotair_state = st_stop;
                Beep(200);
            }
        }
    } else {
        prevHAmillis = millis();
    }

    /* Off-timer for Solder, countdown with 1 min */
    static uint32_t prevSmillis = millis();
    if (need_S_countdown) {
        if (millis() - prevSmillis > 60000) {
            if (S_countdown > 1) {
                S_countdown--;
                if (S_countdown == 1) {
                    Beep(100);    //Beep, if 1 minute left
                }
            } else {
                MemSolder();
                need_S_countdown = false;
                SolderON = false;
                Beep(200);
            }
            prevSmillis = millis();
        }
    } else {
        prevSmillis = millis();
    }

    /* Update LCD with 500ms interval */
    static uint32_t prevDisplayMillis = millis();
    if (millis() - prevDisplayMillis > 500) {
        scr_blink = ! scr_blink;
        prevDisplayMillis = millis();
        DisplayUpdate();

        /* Send data to Serial port */
#ifdef NEED_GRAPH
        if (SolderON || hotair_state == st_work) {
            Graph_count++;
            //Serial.print(Graph_count);
            //Serial.print(";");
        } else {
            Graph_count = 0;
        }
        if (SolderON && hotair_state != st_work) {
            Serial.println(GetSolderT);
        } else if (!SolderON && hotair_state == st_work) {
            Serial.println(GetHotAirT);
        }
#endif
    }

    WorkWithHotAir();
    WorkWithSolder();
}

/* HotAir working procedure */
void WorkWithHotAir() {

    /* Read the thermocouple value */
    //GetHotAirT = A7_Read >> 1;

#ifdef LM358
    GetHotAirT = getOversampled_HA();
#else
    GetHotAirT = getOversampled_HA() >> 1;
#endif

    switch (hotair_state) {
    case st_stop: {
        HotAirOff();
        Cooling();
        break;
    }

    case st_work: {
        /* Set the cooler rpm (convert from 30-100% to 80-255 PWM) */
        analogWrite(pinFanPwm, map(SetHotAirRPM, min_rpm, max_rpm, 80, 255));

        ha_error = HADoProtect();

        /* Turn ON protection relay */
        if (ha_error == 0) D7_High;

        /* Themperature PI regulator */
        HA_PI();

        /* If themperature was stable for 100 times (+/-2 degrees), then signalize about it */
        int delta = ABS(SetHotAirT, GetHotAirT);
        static byte HAgood;
        if (!HA_temp_stable) {
            if (delta < 3) {
                HAgood++;
                if (HAgood == 100) {
                    Beep(50);
                    delay_ms(200);
                    Beep(50);
                    HAgood = 0;
                    HA_temp_stable = true;
                }
            } else {
                HAgood = 0;
            }
        } else {
            if (delta > 5) {
                HA_temp_stable = false;
            }
        }
        break;
    }

    case st_pause: {
        HAPower = 0.0;
        HA_temp_stable = false;
        CalctImpulseControl();
        Cooling();
        ha_error = HADoProtect();
        break;
    }

    case st_protection: {
        need_Cooling = true;
        break;
    }

    } //switch (state)
}

/* Solder working procedure */
void WorkWithSolder() {

    /* Read the thermoresistor value */
    //GetSolderT = A6_Read >> 1;
#ifdef LM358
    GetSolderT = getOversampled_S();
#else
    GetSolderT = getOversampled_S() >> 1;
#endif

    if ( SolderON ) {
        s_error = SDoProtect();

        /* Turn ON relay */
        if (s_error == 0) D4_High;

        /* themperature P regulator */
        S_P();

        /* If themperature was stable for 200 times loop (+/- 2 degrees) then signalize about it */
        uint16_t delta = ABS(SetSolderT, GetSolderT);
        static byte Sgood;
        if (!S_temp_stable) {
            if (delta < 3) {
                Sgood++;
                if (Sgood == 200) {
                    Beep(50);
                    delay_ms(200);
                    Beep(50);
                    //Sgood = 0;
                    S_temp_stable = true;
                }
            } else {
                Sgood = 0;
            }
        } else {
            if (delta > 5) {
                S_temp_stable = false;
            }
        }
    } else {
        SolderOff();
        need_S_countdown = false;
        S_countdown = 1;
    }
}

/***************************************** END OF MAIN PROCEDURES ******************************************/



/****************************************** PROTECTION & ON-OFF ********************************************/

/* HotAir protection */
byte HADoProtect() {

    /* ------------------------------------------------------------------------------------------------------- */

    /* Crytical protection: high overheat or thermocouple value is not valid or wire break */
    if (GetHotAirT > max_hotair_temp + 20) {
        HAProtectionOut();
        return 1;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Crytical protection: thermocouple value is not valid or wires short circuit */
    if (GetHotAirT < 10) {
        HAProtectionOut();
        return 2;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Overheat protection */
    if (ha_f1 && GetHotAirT > SetHotAirT + 20) {
        ha_f1 = false;
        HAProtectionOut();
        return 3;
    }

    if (ha_f2 && GetHotAirT < SetHotAirT + 15) {
        ha_f1 = true;
        ha_f2 = false;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Deviation themperature protection +/- 10 degrees */
    //if (HA_temp_stable) {
    //ha_f3 = true;
    //}
//
    //if (ha_f3) {
    //if (GetHotAirT > SetHotAirT + 10) {
    //HAProtectionOut();
    //return 4;
    //}
//
    //if (GetHotAirT < SetHotAirT - 10) {
    //HAProtectionOut();
    //return 5;
    //}
    //}

    /* ------------------------------------------------------------------------------------------------------- */

#ifdef HA_ADV_PROT_ON

    /* Advanced protection: the themperature falls down/not changed & power > 0 */
    /* & */
    /* Advanced protection: the themperature rise up & power < 0 */
    static byte t_cnt = 0;
    static byte t_cnt2 = 0;
    static boolean ha_ctrl = true;
    if (!HA_temp_stable) {
        static uint16_t prev_t;
        if (ha_ctrl) {
            prev_t = GetHotAirT;
            ha_ctrl = false;
            prevHAcontrol = millis();
        }

        if (!ha_ctrl && millis() - prevHAcontrol > 1000) {
            ha_ctrl = true;

            if (HAPower > 0.0) {

                /* themperature falls or not changed */
                if (prev_t >= GetHotAirT && GetHotAirT < SetHotAirT) {
                    t_cnt++;
                    if (t_cnt == 5) {
                        HAProtectionOut();
                        t_cnt = 0;
                        return 6;
                    }
                } else t_cnt = 0;

            } else { //HAPower == 0.0

                /* themperature rise */
                if (prev_t < GetHotAirT && GetHotAirT > SetHotAirT) {
                    t_cnt2++;
                    if (t_cnt2 == 5) {
                        HAProtectionOut();
                        t_cnt2 = 0;
                        return 7;
                    }
                } else t_cnt2 = 0;
            }
        }
    } else {
        prevHAcontrol = millis();
        t_cnt = 0;
        t_cnt2 = 0;
        ha_ctrl = true;
    }

#endif

    /* ------------------------------------------------------------------------------------------------------- */

    /* if everything is OK */
    return 0;
}

/* Solder protection */
byte SDoProtect() {

    /* ------------------------------------------------------------------------------------------------------- */

    /* Crytical protection: high overheat or thermoresistor value is not valid or wire break */
    if (GetSolderT > max_solder_temp + 20) {
        SProtectionOut();
        return 1;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Crytical protection: thermoresistor value is not valid or wires short circuit */
    if (GetSolderT < 10) {
        SProtectionOut();
        return 2;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Overheat protection */
    if (s_f1 && GetSolderT > SetSolderT + 20) {
        s_f1 = false;
        SProtectionOut();
        return 3;
    }

    if (s_f2 && GetSolderT < SetSolderT + 15) {
        s_f1 = true;
        s_f2 = false;
    }

    /* ------------------------------------------------------------------------------------------------------- */

    /* Deviation themperature protection +/- 10 degrees */
    //if (S_temp_stable) {
    //s_f3 = true;
    //}
//
    //if (s_f3) {
    //if (GetSolderT > SetSolderT + 10) {
    //SProtectionOut();
    //return 4;
    //}
    //Not required for soldering iron
    //if (GetSolderT < SetSolderT - 10) {
    //SProtectionOut();
    //return 5;
    //}
    // }

    /* ------------------------------------------------------------------------------------------------------- */

#ifdef S_ADV_PROT_ON

    /* Advanced protection: the themperature falls down/not changed & power > 0 */
    /* & */
    /* Advanced protection: the themperature rise up & power < 0 */
    static byte t_cnt = 0;
    static byte t_cnt2 = 0;
    static boolean s_ctrl = true;
    if (!S_temp_stable) {
        static uint16_t prev_t = 0;
        if (s_ctrl) {
            prev_t = GetSolderT;
            s_ctrl = false;
            prevScontrol = millis();
        }

        if (!s_ctrl && millis() - prevScontrol > 1000) {
            s_ctrl = true;

            if (SPower > 0) {
                /* themperature falls or not changed */
                if (prev_t >= GetSolderT && GetSolderT < SetSolderT) {
                    t_cnt++;
                    if (t_cnt == 7) {
                        SProtectionOut();
                        t_cnt = 0;
                        return 6;
                    }
                } else t_cnt = 0;
            } else { //SPower == 0
                /* themperature rise */
                if (prev_t < GetSolderT && GetSolderT > SetSolderT) {
                    t_cnt2++;
                    if (t_cnt2 == 7) {
                        SProtectionOut();
                        t_cnt2 = 0;
                        return 7;
                    }
                } else t_cnt2 = 0;
            }
        }
    } else {
        prevScontrol = millis();
        t_cnt = 0;
        t_cnt2 = 0;
        s_ctrl = true;
    }

#endif

    /* ------------------------------------------------------------------------------------------------------- */

    /* everything is OK */
    return 0;
}

/* Solder full off */
void SolderOff() {
    analogWrite(pinSolderPwm, 0);
    D5_Low;
    D4_Low;
    resetSolderStablePoint();
    if (S_prot_beep) {
        S_prot_beep = false;
        Beep(1000);
        MemSolder();
    }
}

/* HotAir full off */
void HotAirOff() {
    HAPower = 0.0;
    D8_Low;
    delay_ms(10);
    D7_Low;
    hotair_state = st_stop;
    resetHotAirStablePoint();
    if (HA_prot_beep) {
        HA_prot_beep = false;
        Beep(1000);
        MemHotAir();
    }
}

/* Cooling the heater until the temperature is below 50 degrees */
void Cooling() {
    if (GetHotAirT >= 50 && need_Cooling) {
        analogWrite(pinFanPwm, 255);
    } else {
        analogWrite(pinFanPwm, 0);
        need_Cooling = false;
    }
}

/* internal procedure */
void set_ha_f() {
    boolean a = SetHotAirT >= GetHotAirT;
    ha_f1 = a;
    ha_f2 = !a;
}

/* internal procedure */
void set_s_f() {
    boolean a = SetSolderT >= GetSolderT;
    s_f1 = a;
    s_f2 = !a;
}

/* Solder protection */
void SProtectionOut() {
    SolderProtect = true;
    S_prot_beep = true;
    SolderON = false;
    SolderOff();
}

/* HotAir protection out */
void HAProtectionOut() {
    analogWrite(pinFanPwm, 255);
    HA_prot_beep = true;
    HotAirOff();
    hotair_state = st_protection;
}

/****************************************** END OF PROTECTION & ON-OFF *************************************/



/************************************************ OTHER ROUTINES *******************************************/

/* Read integer value */
int EEPROM_int_read(int addr) {
    byte raw[2];
    for (byte i = 0; i < 2; i++) {
        raw[i] = EEPROM.read(addr + i);
    }
    int &num = (int&)raw;
    return num;
}

/* Write integer value */
void EEPROM_int_write(int addr, int num) {
    byte raw[2];
    (int&)raw = num;
    for (byte i = 0; i < 2; i++) {
        EEPROM.write(addr + i, raw[i]);
    }
}

/* Read last parameters from memory */
void MemRead() {
    SetSolderT = EEPROM_int_read(0);
    if (SetSolderT < min_solder_temp || SetSolderT > max_solder_temp)  {
        SetSolderT = default_temp;
        last_SolderT = SetSolderT;
    }
    SetHotAirT = EEPROM_int_read(4);
    if (SetHotAirT < min_hotair_temp || SetHotAirT > max_hotair_temp) {
        SetHotAirT = default_temp;
        last_HotAirT = SetHotAirT;
    }
    SetHotAirRPM = EEPROM_int_read(8);
    if (SetHotAirRPM < min_rpm || SetHotAirRPM > max_rpm) {
        SetHotAirRPM = default_rpm;
        last_RPM = SetHotAirRPM;
    }
}

/* Write last used solder themperature to memory */
void MemSolder() {
    if (last_SolderT != SetSolderT) {
        EEPROM_int_write(0, SetSolderT);
        last_SolderT = SetSolderT;
    }
}

/* Write last used HotAir themperature and fan r.p.m. to memory */
void MemHotAir() {
    if (last_HotAirT != SetHotAirT) {
        EEPROM_int_write(4, SetHotAirT);
        last_HotAirT = SetHotAirT;
    }
    if (last_RPM != SetHotAirRPM) {
        EEPROM_int_write(8, SetHotAirRPM);
        last_RPM = SetHotAirRPM;
    }
}

/* Sound procedure */
void Beep(uint16_t duration) {
#ifdef PASSIVE_BUZZER
    tone(pinBuzzer, 1000, duration);
#else
    D12_High;
    delay_ms(duration);
    D12_Low;
#endif
}

/* HotAir oversampling function */
uint16_t getOversampled_HA() {
    uint32_t tmp = 0;
    for (byte z = 0; z < 64; z++) {
        tmp +=  A7_Read;
    }
    return tmp >> 6;
}

/* Solder oversampling function */
uint16_t getOversampled_S() {
    uint32_t tmp = 0;
    for (byte z = 0; z < 64; z++) {
        tmp +=  A6_Read;
    }
    return tmp >> 6;
}

/* Get absolute difference function */
uint16_t ABS(uint16_t a, uint16_t b) {
    if (a > b) {
        return (a - b);
    }
    return (b - a);
}

/****************************************** END OF OTHER ROUTINES ******************************************/



/*************************************** TRIAC CONTROL & AUTOMATHIC ****************************************/

/* Zero cross INT1 */
void ZC() {
    StartTimer1(HeaterOn, ots);
    RestartTimer1();
}

/* Triac open impulse */
void HeaterOn() {
    if (HAPower > 0.0) {
        D8_High;
        delay_us(100);
    }
    D8_Low;
    StopTimer1();
}

/* Calculate triac open delay */
void CalctImpulseControl() {
    ots = (uint16_t)(acos(HAPower / 50.0 - 1.0 ) * 9900.0 / pi);
}

/* HotAir PI regulator */
void HA_PI() {
    int err = SetHotAirT - GetHotAirT;
    float tmp_power = ((Kp * err) + (Ki * integral));
    float max_power = map(SetHotAirT, min_hotair_temp, max_hotair_temp, 10.0, 60.0);
    if (tmp_power < max_power && tmp_power > 0.0) {
        integral += err;
    }
    HAPower = constrain(tmp_power, 0.0, max_power);
    CalctImpulseControl();
}

#ifdef SOLDER_SOFT_START
/* Solder P regulator with soft start */
void S_P() {
    int TempPower = sKp * (SetSolderT - GetSolderT);
    byte maxPower = 255;
    if (GetSolderT < 100) {
        maxPower = 100;
    }
    SPower = constrain(TempPower, 0, maxPower);
    analogWrite(pinSolderPwm, SPower);
}
#else
/* Solder P regulator */
void S_P() {
    int TempPower = sKp * (SetSolderT - GetSolderT);
    SPower = constrain(TempPower, 0, 255);
    analogWrite(pinSolderPwm, SPower);
}
#endif

/************************************* END OF TRIAC CONTROL & AUTOMATHIC ***********************************/



/**************************************** INTERFACE CONTROLS & TIMERS **************************************/

/* Scan buttons */
void ScanButtons() {

    /* HotAir stand switch */
    if (swHotAir.update() && hotair_state != st_stop) {
        if (swHotAir.fell()) {
            hotair_state = st_pause;
            need_Cooling = true;
            resetHotAirCountown();
        } else {
            if (hotair_state == st_pause) {
                hotair_state = st_work;
                integral = 0;
                set_ha_f() ;
            }
        }
        Beep(50);
    } else if (hotair_state == st_work && D10_Read == LOW) {
        D7_High;
        hotair_state = st_pause;
        need_Cooling = true;
        resetHotAirCountown();
    }

#ifdef SOLDER_TIMER_ON_STAND

    /* Solder stand switch - only on stand */
    swSolder.update();
    if (swSolder.fell() && SolderON) {
        if (!need_S_countdown) {
            Activate_S_countdown();
            Beep(50);
        }
    }
	
    if (swSolder.rose())  {
        if (need_S_countdown) {
            need_S_countdown = false;
            Beep(50);
        }
    }

#else

    /* Solder stand switch simple check user activity */
    if (swSolder.update() && SolderON) {
        resetSolderCountdown();
        Beep(50);
    }

#endif // SOLDER_TIMER_ON_STAND

    /* Solder "on-off" button */
    if (SolderOnButton.update()) {
        if (SolderOnButton.read()) {
            SONbuttonState = false;
        } else {
            if (!SolderON) {
                SolderON = true;
                SolderProtect = false;
                Activate_S_countdown();
                Graph_count = 0;
                selected_Mode = modeSolder;
                resetSolderStablePoint();
                set_s_f();
            } else {
                resetSolderCountdown();
            }
            SONbuttonState = true;
            SONbuttonPressTime = millis();
            Beep(50);
        }
    }

    if  (SONbuttonState) {
        if ( millis() - SONbuttonPressTime >= 1000 ) { //long press
            SONbuttonPressTime = millis();
            if (SolderON) {
                SolderON = false;
                resetSolderStablePoint();
                MemSolder();
                Beep(200);
            }
        }
    }

    /* HotAir "on-off" button */
    if (HotAirOnButton.update()) {
        if (HotAirOnButton.read()) {
            HAONbuttonState = false;
        } else {
            if (hotair_state != st_work) {
                hotair_state = st_work;
                Graph_count = 0;
                selected_Mode = modeHotAir;
                need_Cooling = true;
                resetHotAirStablePoint();
                set_ha_f();
                integral = 0;
            } else {
                resetHotAirCountown();
            }
            HAONbuttonState = true;
            HAONbuttonPressTime = millis();
            Beep(50);
        }
    }

    if  (HAONbuttonState) {
        if ( millis() - HAONbuttonPressTime >= 1000 ) { //long press
            HAONbuttonPressTime = millis();
            resetHotAirStablePoint();
            if (hotair_state == st_work || hotair_state == st_pause) {
                hotair_state = st_stop;
                need_Cooling = true;
                MemHotAir();
                Beep(200);
            }
        }
    }

    /* Select button */
    if (SelButton.update()) {
        if (SelButton.fell()) {
            Beep(50);
            (selected_Mode < modeFanPWM) ? (selected_Mode++) : (selected_Mode = modeSolder);
        }
    }

    /* UP button */
    static boolean short_press_flag = false;

    if (UpButton.update()) {
        if (UpButton.rose()) {
            UPbuttonState = false;
            short_press_flag = false;
        } else {
            switch (selected_Mode) {
            case modeSolder:
                if (SetSolderT < max_solder_temp) {
                    SetSolderT += 5;
                }
                set_s_f();
                resetSolderStablePoint();
                resetSolderCountdown();
                break;
            case modeHotAir:
                if (SetHotAirT < max_hotair_temp) {
                    SetHotAirT += 5;
                }
                break;
            case modeFanPWM:
                if (SetHotAirRPM < max_rpm) {
                    SetHotAirRPM += 5;
                }
                break;
            }

            if (selected_Mode > 1) {
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
            }

            UPbuttonState = true;
            short_press_flag = true;
            UPbuttonPressTime = millis();
            Beep(50);
        }
    }

    /* UP button (long press) */
    if  (UPbuttonState) {
        if ( millis() - UPbuttonPressTime >= 500 ) {
            UPbuttonPressTime = millis();
            byte step = 10;
            if (short_press_flag) {
                step = 5;
                short_press_flag = false;
            }
            switch (selected_Mode) {
            case modeSolder:
                SetSolderT += step;
                if (SetSolderT > max_solder_temp) SetSolderT = max_solder_temp;
                set_s_f();
                resetSolderStablePoint();
                resetSolderCountdown();
                break;
            case modeHotAir:
                SetHotAirT += step;
                if (SetHotAirT > max_hotair_temp) SetHotAirT = max_hotair_temp;
                break;
            case modeFanPWM:
                SetHotAirRPM += step;
                if (SetHotAirRPM > max_rpm) SetHotAirRPM = max_rpm;
                break;
            }
            if (selected_Mode > 1) {
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
            }
        }
    }

    /* Down button */
    if (DwnButton.update()) {
        if (DwnButton.read()) {
            DWNbuttonState = false;
            short_press_flag = false;
        } else {
            switch (selected_Mode) {
            case modeSolder:
                if (SetSolderT > min_solder_temp) {
                    SetSolderT -= 5;
                }
                set_s_f();
                resetSolderStablePoint();
                resetSolderCountdown();
                break;
            case modeHotAir:
                if (SetHotAirT > min_hotair_temp) {
                    SetHotAirT -= 5;
                }
                break;
            case modeFanPWM:
                if (SetHotAirRPM > min_rpm) {
                    SetHotAirRPM -= 5;
                }
                break;
            }

            if (selected_Mode > 1) {
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
            }

            DWNbuttonState = true;
            short_press_flag = true;
            DWNbuttonPressTime = millis();
            Beep(50);
        }
    }

    /* Down button (long press) */
    if  (DWNbuttonState) {
        if ( millis() - DWNbuttonPressTime >= 500 ) {
            DWNbuttonPressTime = millis();

            byte step = 10;
            if (short_press_flag) {
                step = 5;
                short_press_flag = false;
            }

            switch (selected_Mode) {
            case modeSolder:
                SetSolderT -= step;
                if (SetSolderT < min_solder_temp) SetSolderT = min_solder_temp;
                set_s_f();
                resetSolderStablePoint();
                resetSolderCountdown();
                break;
            case modeHotAir:
                SetHotAirT -= step;
                if (SetHotAirT < min_hotair_temp) SetHotAirT = min_hotair_temp;
                break;
            case modeFanPWM:
                SetHotAirRPM -= step;
                if (SetHotAirRPM < min_rpm) SetHotAirRPM = min_rpm;
                break;
            }

            if (selected_Mode > 1) {
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
            }
        }
    }
}

/* Buttons initialise */
void ButtonsSetup() {
    pinMode(sw_HA, INPUT_PULLUP);
    swHotAir.attach(sw_HA);
    swHotAir.interval(50);

    pinMode(sw_S, INPUT_PULLUP);
    swSolder.attach(sw_S);
    swSolder.interval(50);

    pinMode(bt_SON, INPUT_PULLUP);
    SolderOnButton.attach(bt_SON);
    SolderOnButton.interval(5);

    pinMode(bt_HAON, INPUT_PULLUP);
    HotAirOnButton.attach(bt_HAON);
    HotAirOnButton.interval(5);

    pinMode(bt_Sel, INPUT_PULLUP);
    SelButton.attach(bt_Sel);
    SelButton.interval(10);

    pinMode(bt_Up, INPUT_PULLUP);
    UpButton.attach(bt_Up);
    UpButton.interval(5);

    pinMode(bt_Dwn, INPUT_PULLUP);
    DwnButton.attach(bt_Dwn);
    DwnButton.interval(5);
}

/* internal procedure */
void resetHotAirStablePoint() {
    HA_temp_stable = false;
}

/* internal procedure */
void resetSolderStablePoint() {
    S_temp_stable = false;
}

/* Reset HotAir countdown */
void resetHotAirCountown() {
    HA_countdown = HA_sleeptime;
}

/* Reset Solder countdown */
void resetSolderCountdown() {
    S_countdown = S_sleeptime;
}

/* Activate Solder countdown procedure */
void Activate_S_countdown() {
    need_S_countdown = true;
    S_countdown = S_sleeptime;
}

/**************************************** INTERFACE CONTROLS & TIMERS **************************************/



/************************************************* DISPLAY *************************************************/

/* "Hello" screen */
void Splash() {
    lcd.clear();
#ifdef LCD_1602
    lcd.setCursor(0, 0);
    lcd.print(F("Soldering Station"));
    lcd.setCursor(6, 1);
#else
    lcd.setCursor(2, 1);
    lcd.print(F("Soldering Station"));
    lcd.setCursor(7, 2);
#endif
    lcd.print(F("v "));
    lcd.print(FIRMWARE_VERSION);
}

/* Set LCD design */
void initDisplay() {
    lcd.clear();
#ifdef LCD_1602

#else
    lcd.setCursor(11, 0);
    lcd.print(F("Set"));

    lcd.setCursor(16, 0);
    lcd.print(F("Act"));

    lcd.setCursor(0, 1);
    lcd.print(F("Solder"));

    lcd.setCursor(0, 2);
    lcd.print(F("HotAir"));

    lcd.setCursor(0, 3);
    lcd.print(F("FanRPM"));
#endif
}

/* Update LCD */
void DisplayUpdate() {

#ifdef LCD_1602

    lcd.setCursor(0, 0);
    lcd.print(bspace);
    lcd.setCursor(0, 0);
    if (SolderProtect) {
        lcd.print(F("!"));
        lcd.print(s_error);
    } else if (need_S_countdown) {
        lcd.print(S_countdown);
    }

    lcd.setCursor(3, 0);
    lcd.print(bspace);
    lcd.setCursor(3, 0);
    lcd.print(SetSolderT);
    lcd.write((byte)0);

    byte pos;
    uint16_t s_view_t;

    if (GetSolderT > 505) {
        lcd.setCursor(8, 0);
        lcd.print(F("---"));
    } else {
        uint16_t s_view_t;
#ifdef SOLDER_DIGIT_JUMPS_REMOVE
        (S_temp_stable)? (s_view_t = SetSolderT) : (s_view_t = GetSolderT);
#else
        s_view_t = GetSolderT;
#endif
        pos = GetPos(s_view_t);
        lcd.setCursor(8, 0);
        lcd.print(bspace);
        lcd.setCursor(8+pos, 0);
        lcd.print(s_view_t);
    }
    lcd.write((byte)0);

    lcd.setCursor(0, 1);
    lcd.print(bspace);
    lcd.setCursor(0, 1);

    switch (hotair_state) {
    case st_stop: {
        break;
    }

    case st_work: {
        if (HA_temp_stable) {
            lcd.print(F(" *"));
        } else {
            lcd.print(F(" :"));
        }
        break;
    }

    case st_pause: {
        lcd.print(HA_countdown);
        break;
    }

    case st_protection: {
        lcd.print(F("!"));
        lcd.print(ha_error);
        break;
    }

    }

    pos = GetPos(SetHotAirT);
    lcd.setCursor(3, 1);
    lcd.print(bspace);
    lcd.setCursor(3+pos, 1);
    lcd.print(SetHotAirT);
    lcd.write((byte)0);

    if (GetHotAirT > 505) {
        lcd.setCursor(8, 1);
        lcd.print(F("---"));
    } else {
        uint16_t ha_view_t;
#ifdef HOTAIR_DIGIT_JUMPS_REMOVE
        (HA_temp_stable)? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT);
#else
        ha_view_t = GetHotAirT;
#endif
        pos = GetPos(ha_view_t);
        lcd.setCursor(8, 1);
        lcd.print(bspace);
        lcd.setCursor(8+pos, 1);
        lcd.print(ha_view_t);
    }
    lcd.write((byte)0);

    lcd.setCursor(13, 1);
    lcd.print(bspace);
    lcd.setCursor(13, 1);

    pos = GetPos(SetHotAirRPM);
    if (need_Cooling && hotair_state != st_work) {
        lcd.print(F("100%"));
    } else {
        lcd.setCursor(13+pos, 1);
        lcd.print(SetHotAirRPM);
        lcd.print(F("%"));
    }

    lcd.setCursor(2, 0);
    lcd.print(F(" "));
    lcd.setCursor(2, 1);
    lcd.print(F(" "));
    lcd.setCursor(12, 1);
    lcd.print(F(" "));

    switch (selected_Mode) {
    case modeSolder: {
        lcd.setCursor(2, 0);
        break;
    }

    case modeHotAir: {
        lcd.setCursor(2, 1);
        break;
    }

    case modeFanPWM: {
        lcd.setCursor(12, 1);
        break;
    }
    }
    lcd.write((byte)1);

//if (hotair_state == ha_pause) {
//(scr_blink) ? (lcd.backlight()) : (lcd.noBacklight());
//} else {
//lcd.backlight();
//}

    if (hotair_state == st_pause) {
        lcd.setCursor(2, 1);
        lcd.blink_on();
    } else {
        lcd.blink_off();
    }

#else //LCD2004

    lcd.setCursor(6, 1);
    lcd.print(bspace);
    lcd.setCursor(7, 1);

    if (SolderProtect) {
        lcd.print(F("!"));
        lcd.print(s_error);
    } else if (need_S_countdown) {
        lcd.print(S_countdown);
    }

    lcd.setCursor(11, 1);
    lcd.print(bspace);
    lcd.setCursor(11, 1);
    lcd.print(SetSolderT);
    lcd.write((byte)0);

    byte pos;
    uint16_t s_view_t;

    if (GetSolderT > 505) {
        lcd.setCursor(16, 1);
        lcd.print(F("---"));
    } else {
        uint16_t s_view_t;
#ifdef SOLDER_DIGIT_JUMPS_REMOVE
        (S_temp_stable)? (s_view_t = SetSolderT) : (s_view_t = GetSolderT);
#else
        s_view_t = GetSolderT;
#endif
        pos = GetPos(s_view_t);
        lcd.setCursor(16, 1);
        lcd.print(bspace);
        lcd.setCursor(16+pos, 1);
        lcd.print(s_view_t);
    }
    lcd.write((byte)0);

    lcd.setCursor(6, 2);
    lcd.print(bspace);
    lcd.setCursor(7, 2);

    switch (hotair_state) {
    case st_stop: {
        break;
    }

    case st_work: {
        if (HA_temp_stable) {
            lcd.print(F(" *"));
        } else {
            lcd.print(F(" :"));
        }
        break;
    }

    case st_pause: {
        lcd.print(HA_countdown);
        break;
    }

    case st_protection: {
        lcd.print(F("!"));
        lcd.print(ha_error);
        break;
    }

    }

    pos = GetPos(SetHotAirT);
    lcd.setCursor(11, 2);
    lcd.print(bspace);
    lcd.setCursor(11+pos, 2);
    lcd.print(SetHotAirT);
    lcd.write((byte)0);

    if (GetHotAirT > 505) {
        lcd.setCursor(16, 2);
        lcd.print(F("---"));
    } else {
        uint16_t ha_view_t;
#ifdef HOTAIR_DIGIT_JUMPS_REMOVE
        (HA_temp_stable)? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT);
#else
        ha_view_t = GetHotAirT;
#endif
        pos = GetPos(ha_view_t);
        lcd.setCursor(16, 2);
        lcd.print(bspace);
        lcd.setCursor(16+pos, 2);
        lcd.print(ha_view_t);
    }
    lcd.write((byte)0);

    lcd.setCursor(11, 3);
    lcd.print(bspace);
    lcd.setCursor(11, 3);

    pos = GetPos(SetHotAirRPM);
    if (need_Cooling && hotair_state != st_work) {
        lcd.print(F("100%"));
    } else {
        lcd.setCursor(11+pos, 3);
        lcd.print(SetHotAirRPM);
        lcd.print(F("%"));
    }

    for (byte z = 1; z < 4; z++) {
        lcd.setCursor(10, z);
        lcd.print(F(" "));
    }

    lcd.setCursor(10, selected_Mode);
    //lcd.print(F(">"));
    lcd.write((byte)1);

    //if (hotair_state == st_pause) {
    //(scr_blink) ? (lcd.backlight()) : (lcd.noBacklight());
    //} else {
    //lcd.backlight();
    //}

    if (hotair_state == st_pause) {
        lcd.setCursor(6, 2);
        lcd.blink_on();
    } else {
        lcd.blink_off();
    }

#endif

}

/* Get print position */
byte GetPos(uint16_t number) {
    if (number >= 100) {
        return 0;
    } else if (number < 10) {
        return 2;
    }
    return 1;
}

/*********************************************** END OF DISPLAY ********************************************/

ЗЫ.

По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.

aleksandrov
Offline
Зарегистрирован: 08.07.2017

Благодарю Вам alex1978 за быстрий ответ, но мне интересуеть плата которая показана в пост #1751. 

Благодарю.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

aleksandrov
Так в том файле она и есть, вкладки внизу смотрите - "все платы вместе"

aleksandrov
Offline
Зарегистрирован: 08.07.2017

Прошу извинения я не досмотрел. Все в порядке. Спасибо.

peterzonda
Offline
Зарегистрирован: 25.11.2016

Я уже получил его, у меня был Pc817, но он не дает мне температуры, не показывает, что есть большая разница, когда я устанавливаю так, что не могу достичь температуры, как на термометре.

pter
Offline
Зарегистрирован: 15.02.2016

Здравствуйте,Olegk попробовал скетч 1.6,режим  "отсчёт таймера выключения паяльника только на подставке" работает,но возник вопрос по каналу фена температура отображается теперь 100-36,раньше этой черточки небыло,это какая то задумка или случайность.

P.S.Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.

void S_P() {

    int TempPower = sKp * (SetSolderT - GetSolderT);

   if (TempPower==sKp) TempPower = 255;

    SPower = constrain(TempPower, 0, 255);

    analogWrite(pinSolderPwm, SPower);}

 Черточка появляется,если включить станцию без фена(т.к. на дисплее отображается ---^^ и если я подключу фен будет отображаться - 18^),но если включить станцию с подключенным феном все отображается нормально,но  если я выдерну фен из разъема будет отображаться ---^^ и вставлю обратно черточка уже остается.

SERG_K
Offline
Зарегистрирован: 06.08.2017

Попробовал предложенные изменения SERG_K для убириния писка паяльника,мне не помогло.

 

 Писка нет только при отклонении от заданной температуры на 1 градус( у меня просто всегда так) 100% заполнение потому и не пищит, дальше Шим и 490 герц ни кто  не отменял. Кстати я вернул код как был, без шима  у меня БП не тянет, если включаешь фен и паяльник одновременно кулер дует не стабильно.  

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

pter пишет:
температура отображается теперь 100-36

Спасибо на найденный "косяк" )) Это, походу, в какой-то из предыдущих версий появилось.
Вроде поправил (в #1781). Посмотреть пока не могу, убегаю на смену. Попробуйте.

peterzonda пишет:
Я уже получил его, у меня был Pc817, но он не дает мне температуры, не показывает, что есть большая разница, когда я устанавливаю так, что не могу достичь температуры, как на термометре.

Я совсем ничего не понял. Вы каким переводчиком пользуетесь?
У вас фен не нагревается или показания температуры не можете настроить?

pter
Offline
Зарегистрирован: 15.02.2016

 Olegk,протестировал скетч теперь все отображаеться правильно.

peterzonda
Offline
Зарегистрирован: 25.11.2016
 
Я не могу установить температуру фен
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

peterzonda

В чём проблема? Мала температура или совсем не настраивается?

Какой операционный усилитель установлен?

peterzonda
Offline
Зарегистрирован: 25.11.2016
 
Операционный усилитель LM385, и температура была низкой для увеличения
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

peterzonda пишет:
Операционный усилитель LM385, и температура была низкой для увеличения

Раскомментируйте #define LM358.
Если раскомментировали и всё равно мало, то нужно увеличить резистор в цепи обратной связи ОУ.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

OlegK пишет:

ЗЫ.

По альтерантивным платам.
Смотрю, до сих пор "тащится" распиновка разъёма, обозванного как "концевики, опционально".
Изначально он был планировался для подключения микросхемы-перобразователя сигнала
для термопары К-типа max6675. Отсюда и обозначения SC, SCK, SO, которые уже не нужны и могут сбить с толку.
В общем, можно переименовать распиновку этого разъёма, с учётом, что D10 - фен, D9 - паяльник, D11 - зарезервирован. Пин D2, выведенный на отдельный разъём, также зарезервирован.

Ну вообще я сначала хотел выкинуть пин D2 и разъём под концевики сократить до трёх пинов, но потом подумал пусть торчат, вдруг автор решит на них какую полезную штуку повесить. А вот насчёт кирилицы это косячёк. Платы заказаны у китайцев и, возможно, вместо кирилицы будут крякозябры. Толщину шрифта причесал, а про кирилицу забыл. Так то пофиг, на работу не влияет...

Вопрос к автору!!! Что означает это?

/* Soldering iron - if you want to remove the digit jumps, then uncomment it */
//#define SOLDER_DIGIT_JUMPS_REMOVE

/* Hot Air - if you want to remove the digit jumps, then uncomment it */
//#define HOTAIR_DIGIT_JUMPS_REMOVE

 

pter
Offline
Зарегистрирован: 15.02.2016

 Здравствуйте,alex1978 эти строчки в скетче отключают прыганье цифр,к примеру у меня при выставленных 250 градусах(в канале паяльника) температуру отображает 249-250,если я раскоментирую эту строчку будет всегда показывать 250.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

Ага, понятно. Теперь еще один вопрос. Я взял последний скетч версии 1,6, и поменял в нем процедуру обновления экрана на процедуру из скетча 2,2 от Руслана. Теперь если паяло положить на подставку, то таймер запускается и отсчёт идет, но если снять его с подставки, то на экране остаётся цифра. Скажем положил паяльник, прошло пару минут, на экране стоит восьмерка, если паяльник снять то эта восьмёрка так и светится. Как сделать чтоб вообще цифры не было, а светилась звездочка например, как в канале фена? Скетч https://yadi.sk/d/kJK16Q8O3N2TMR

pter
Offline
Зарегистрирован: 15.02.2016

 А чем вас не устраивает скетч от автора,в нем же тоже можно подключить lcd1602.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

У Руслана покрасивше сделано. :) Ну если ни как, то буду так юзать.

dr-baks
Offline
Зарегистрирован: 26.01.2017

Олег подскажите пожалуйста что лучше поставить AD8552 или LM358.Ваше мнение как создателя паяльной станции.

alex1978
alex1978 аватар
Offline
Зарегистрирован: 09.09.2017

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