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

serg1968-09
Offline
Зарегистрирован: 18.04.2019

Вот еще информация кассающая адресов дисплея этих платокhttp://arduino.ru/sites/default/files/u7266/i2c_module_150.jpg https://www.robotics.org.za/image/data/Display/I2C_display/LCD2004_02_address.jpg

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

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

Лучше сразу картинкой

sergik5
Offline
Зарегистрирован: 28.01.2018

Всем привет, при разогреве паяльника пропала индикация ":" и "*", сразу после щелчка реле при включении канала, начинает расти температура жала и сразу светит мигающий "10" , хотя бип на стабилизации присутствует. Что может быть ?

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

sergik5 пишет:
Что может быть ?

Это нормальное поведение.
Если паяльник запущен на подставке, то индикации ":" и "*" не будет, а высветится время таймера до выключения (т.н. "мигающий 10"). Звуковая индикация будет.
При снятии с подставки таймер отключится и заработает индикация ":" и "*", равно как и при запуске вне подставки.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

OlegK пишет:

При снятии с подставки таймер отключится и заработает индикация ":" и "*", равно как и при запуске вне подставки.

Давненько Вас не видно было. :)

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

Ага, на место преступления потянуло ))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А мы рады Вас видеть. Надеюсь, в добром здравии. :) 

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

Спасибо, взаимно :)
Катаклизмы преходящи, а желание что-нибудь куда-нибудь припаять или потыкать в кнопки неистребимо.

sergik5
Offline
Зарегистрирован: 28.01.2018

OlegK пишет:
Если паяльник запущен на подставке

А если нет геркона и на пине D9 0Вольт при вкл. или выкл. канале паяльника ?

Блин, похоже пин отгорел, при подтяжке резистора на 10кОм с D9 на +5Вольт, на D9 0.1Вольта. Между пином и массой 180 Ом !

достаточно ли поменять пин в разделе /* Buttons */, чтобы геркон на D11 повесить ?

с

#define sw_S 9

на

#define sw_S 11

 

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

Да, поменяйте на другой свободный.
Вообще, по уму, конечно, лучше отвязать "концевики" и фена и паяльника оптопарами, что бы исключить
любые внешние воздействия на эти пины.

sergik5
Offline
Зарегистрирован: 28.01.2018

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

Alsi2010
Offline
Зарегистрирован: 25.09.2017

.

Сибиряк
Offline
Зарегистрирован: 08.09.2018

  Вопрос к OlegK хочу прикошачить к Вашей станции нижний подогрев примерно такой https://ru.aliexpress.com/item/1-150-60x70/33001958290.html?spm=a2g0o.cart.0.0.27213c00x13Df1

Верхняя строка индикатора фактически пустая пусть будет Prehitor  xxx. Т.е. выводить температуру от еще одной LM.  У контроллера пустые ноги еще есть. Подогрев штука инерционная поэтому температуру можно регулировать тупо диммером что-бы не заморачиваться.

Если есть время и интерес помогите пожалуйста со скетчем.

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

Ха, у меня как раз в планах на базе данной станции термостол сделать. Но, пока только в планах :))))

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

Сибиряк пишет:
Если есть время и интерес помогите пожалуйста со скетчем.

Приветствую. К сожалению, и с тем и с другим напряг жёсткий ))
Попробуйте самостоятельно или может кто ещё присоединится.
Я бы посоветовал начать плясать пошагово вот от чего -

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

1. Управление-измерение. Понадобится один аналоговый вход под усилитель термодатчика, один пин под кнопку включения стола подогрева и один под оптопару с  симистором для релейного регулирования ("вкл-выкл"). Т.к. в оригинальной схеме все аналоговые входы заняты, то придётся освободить от какой либо кнопки и переподключить её на другой пин. Тут можно, например, выкинуть выход на буззер. По выход на оптопару использовать пин 2 (на оригинальной схеме он зарезервирован). Под кнопку вкл. стола - пин 11

2. Индикация. Можно, да, использовать верхнюю строку дисплея, тут смысл в том, что надписи, которые не меняются, выводятся один раз, в процедуре initDisplay, а всё остальное в DisplayUpdate, по аналогии с остальным.

3. Регулирование. По причине инерционности, можно попробовать порегулировать релейно, путём вкл-выкл нагревателя (если температура ниже заданной, то включаем, выше - выключаем). Тут лучше поставить оптосимистор со встроенным зеро-кросс + симистор.

4. Защита. Релейное отключение добавить не плохо бы также, но пины уже закончились (если не считать 0 и 1).

Итого - может проще сделать стол на отдельном контроллере? ))

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

Ага, я как раз так и собираюсь делать. Сначала стол, а потом, если понадобится и верх инфракрасный.

Sergey38
Offline
Зарегистрирован: 23.02.2017

Добрый вечер!! Как раз дополнил скетч еще на два доп. входа.. Только нужны аналоговые входы. Пришлось перепаять провода от кнопок..

#define bt_SON 13
#define bt_HAON 11
#define bt_Sel 17   //(А3)
#define bt_Up 2
#define bt_Dwn16    //(А2)
 
Up и HAON подключил к резервным пинам (D2 и D11)
И на А0 и А1 подключил AD-шку
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*                    Soldering Station v 1.6.1              */
/*                        coded by OlegK                     */
/* arduino.ru/forumy/proekty/ocherednaya-payalnaya-stantsiya */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */


#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.1"

#ifdef LCD_1602
LiquidCrystal_I2C lcd(0x3F, 16, 2);
#else
LiquidCrystal_I2C lcd(0x3F, 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 70
#define max_solder_temp 400
#define min_hotair_temp 20.0
#define max_hotair_temp 450.0
#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 11
#define bt_Sel 17
#define bt_Up 2
#define bt_Dwn 16

/* 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 GetDT = 0;
uint16_t GetRT = 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
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 30

uint16_t last_HotAirT, last_SolderT;
byte last_RPM;


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

void setup() {
    //ADC change speedup
    //ADCSRA &= ~(1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0); // reset default divider 128
    //ADCSRA |= 1 <<ADPS2; // set div to 16 (1MHz)
    //ADCSRA |= 1 <<ADPS1; // set div to 64 (250kHz)

    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

    lcd.init();
    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();
    static boolean blink_state = true;
    if (millis() - prevDisplayMillis > 500) {
        scr_blink = ! scr_blink;
        prevDisplayMillis = millis();
        DisplayUpdate(blink_state);
        blink_state = !blink_state;

        /* 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();
    Work();
}

void Work() {
  #ifdef LM358
    GetDT = getOversampled_D();
    GetRT = getOversampled_R();
  #else
    GetDT = getOversampled_D() >> 1;
    GetRT = getOversampled_R() >> 1;
#endif
}
/* HotAir working procedure */
void WorkWithHotAir() {

    /* Read the thermocouple value */
#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 < 5) {
                Sgood++;
                if (Sgood == 100) {
                    Beep(50);
                    delay_ms(200);
                    Beep(50);
                    //Sgood = 0;
                    S_temp_stable = true;
                }
            } else {
                Sgood = 0;
            }
        } else {
            if (delta > 7) {
                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;
    }

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

#ifdef HA_ADV_PROT_ON

    /* 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;
    //}
    //}

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



    /* 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 == 7) {
                        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 == 7) {
                        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;
    }

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

#ifdef S_ADV_PROT_ON

    /* 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;
    //}
    // }

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



    /* 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 == 10) {
                        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 == 10) {
                        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 >= 60) need_Cooling = true;
    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;
//}

uint16_t getOversampled_HA() {
    uint32_t tmp = 0;
    for (byte z = 0; z < 128; z++) {
        tmp +=  A7_Read;
    }
    return tmp >> 7;
}

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

uint16_t getOversampled_D() {
    uint32_t tmp = 0;
    for (byte z = 0; z < 64; z++) {
        tmp +=  A0_Read;
    }
    return tmp >> 6;
}

uint16_t getOversampled_R() {
    uint32_t tmp = 0;
    for (byte z = 0; z < 64; z++) {
        tmp +=  A1_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() {
    StopTimer1();
    if (HAPower > 0.0) {
        D8_High;
        delay_us(30);
    }
    D8_Low;
}

/* 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 * (float)err) + (Ki * (float)integral));
    float max_power = map((float)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 + 1);
    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 + 1);
    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 */
    if (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;

#ifdef SOLDER_TIMER_ON_STAND
                if (!D9_Read) Activate_S_countdown();
#else
                Activate_S_countdown();
#endif

                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();
                integral = 0;
            }

            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();
                integral = 0;
            }
        }
    }

    /* 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();
                //integral = 0;
            }

            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();
                //integral = 0;
            }
        }
    }
}

/* 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(boolean blink_state) {

#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) {
        if (blink_state) lcd.print(S_countdown);
    } else if (SolderON) {
        (S_temp_stable) ? (lcd.print(F(" *"))) : (lcd.print(F(" :")));
    }

    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: {
        if (blink_state) 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);

#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) {
        if (blink_state) lcd.print(S_countdown);
    } else if (SolderON) {
        (S_temp_stable) ? (lcd.print(F(" *"))) : (lcd.print(F(" :")));
    }

    lcd.setCursor(11, 1);
    lcd.print(bspace);
    lcd.setCursor(11, 1);
    lcd.print(SetSolderT);
    lcd.write((byte)0);
    lcd.setCursor(0, 0);
    lcd.print(GetDT - 5);
    lcd.write((byte)0);
    lcd.print(GetRT);
    lcd.write((byte)0);
    lcd.print("   ");

    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: {
        if (blink_state) 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.write((byte)1);

#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 ********************************************/

 

 

Sergey38
Offline
Зарегистрирован: 23.02.2017

На базе прошивки 1.6.1 от Олега. Ничего больше не менял.

kret.a.v@gmail.com
Offline
Зарегистрирован: 14.07.2017

Sergey38

очень интересны ваши изменения

можете схему выложить , со всеми изменениями 

схему , так как у Вас все работает

 

kret.a.v@gmail.com
Offline
Зарегистрирован: 14.07.2017

Sergey38

очень интересны ваши изменения

можете схему выложить , со всеми изменениями 

схему , так как у Вас все работает

 

Sergey38
Offline
Зарегистрирован: 23.02.2017

Основная схема без изменений (под несколько плат- Олега). только с кнопок 2 провода подключены вместо А0 и А1 к резервным D2 и D11. Остальные кнопки остались на своих местах. А на А0 иА1 подкличены выходы со второго ОУ.

Sergey38
Offline
Зарегистрирован: 23.02.2017

Вообще у меня 1й канал второй AD8552 занят термопарой вмонтированной в корпус ПС(для большого паяльника, оловоотсоса и т.д.), а второй канал хотел пустить на защиту фена от неисправного вентилятора. на вход подал сигнал от датчика Холла, которое с фиритовым кольцом измеряет ток потребления вентилятора. И если ток равен нулю(обрыв, либо может полевик полетел) или больше заданного, например заклинило моторчик(как у меня однажды было) то должна сработать защита(пока в прошивке её нет, просто вывел на экран значения).. Никак не могу подобрать номиналы обвязки усилителя..

Сибиряк
Offline
Зарегистрирован: 08.09.2018

         Sergey38     Выложите пожалуйста скетч.

Sergey38
Offline
Зарегистрирован: 23.02.2017

Сибиряк, в сообщении 3017 есть скетч!

Igor22
Offline
Зарегистрирован: 26.06.2019

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

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

Igor22,
Сумбурно как-то проблему описали...
Какие конкретно транзисторы вылетели?
БП - китайский импульсник?
Нагреватель паяльника нихром или керамика?

Цитата:
если вытянуть ЛМ и включить паяльник пару секунд он греется,, а дальше автоматика отрубает его

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

Igor22
Offline
Зарегистрирован: 26.06.2019

Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.

Igor22
Offline
Зарегистрирован: 26.06.2019

Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.

Igor22
Offline
Зарегистрирован: 26.06.2019

Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.

Igor22
Offline
Зарегистрирован: 26.06.2019

Извиняюсь, телефон глюканул

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

Тут логично заподозрить китайский блок, ведь с ноутбучным работало нормально.
Нагреватели с терморезистором (керамические), при холодном старте потребляют большой ток (порядка 8А), кратковременно, правда, но этого может хватать для срабатывания защиты питальника. Для этого в скетче есть вариант работы с "мягким стартом" в начале нагрева (просто скважность уменьшена до определённой температуры) вроде помогает.
Если не включать канал паяльника а просто подать питание нагреватель не греется? КОнтакты защитного реле само-собой замкнуть надо.
Если да, то помимо транзистора неплохо было бы проверить и оптопару им управляющую - возможно она неисправна, мосфет сразу распахивается и нагреватель большим током "садит" БП.

Igor22
Offline
Зарегистрирован: 26.06.2019

К стати, если станцию выключить и подать 24 вольта те транзисторы за пару секунд разогреваются так, что пальцем дольше 2х секунд не удержишь и на блоке от ноутбука сейчас тоже не работает

Igor22
Offline
Зарегистрирован: 26.06.2019

Если на включённой станции подключаю блок от ноутбука, то блок сразу в защиту уходит и без разницы включён нагрев паяльника или нет.

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

Извините, что вмешиваюсь, но по моему если включить логику получается мосфет греется от чрезмерной нагрузки соответственно снимаем нагрузку ищем коротыш . мосфет без нагрузки по определению не должен нагреваться так как путь тока а мосфете от стока к истоку и по идее в этом месте нагрев . либо если оптопара пробита и пропускает ток на ворота мосфета тогда он постоянно открыт в любом случае вам искать или в обвязка мосфета или в его нагрузке ещё примите к сведению, что максимальное напряжение для вывода gate вашего мофета скорее всего до 20 вольт .Отсюда возникает вопрос сколько импульсный китайчонок не самого высокого качества может выдать вольт в пике и сколько являются летальными для мосфетов... Ведь от бп от нубука всё работало.

Igor22
Offline
Зарегистрирован: 26.06.2019

Спасибо, завтра проверю.

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

Согласен с Секешфехервар, вполне возможно превышение допустимого на затворе.
Если в этом проблема, то лучше увеличить резистор от эмиттера оптопары на затвор мосфета до 3кОм - напряжение на затворе понизится с 24 до 18В. Также, к этому, можно с затвора на землю поставить стабилитрон на 15-18 вольт.

snake9x
Offline
Зарегистрирован: 21.01.2017

Добрый день , подскажите куда копать, пересобрал данную станцию но уже под терморезистор в паяльнике (3.8 0м) в итоге фен работает нормально , паяльник греется но на дисплее температура не меняется , номиналы обвязки лмки проверил , перепрошил Ардуино , пробовал настраивать канал паяльника многоооборотными резисторами результат 0 .
https://youtu.be/JvbrfGgl1_E
Может виной нагреватель , я его покупал отдельно с Али а нужно было купить паяльник в сборе ?
До этого мучался месяца 3 с паяльником на ТП так и не смог настроить , забил с заделал новую плату.

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

При нагреве паяльника Ваш измерительный элемент должен реагировать на изменения проверяйте возле лм'ки, в паяльнике. В моём случае кабель паяльника сломался через примерно 3 месяца неактивного использования.
Симптомы нагрев в определённом положении паяльника
Лечение 4 жильный кабель 0.5 кв мм, не советую использовать длинный кабель с ним больше мороки чем удобства.
По фену сейчас тож проблема : неконтролируемый нагрев до срабатывания защиты если фен лежит на столе то всё норм подозреваю, что виноват кабель, но разбираться нет времени.

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

snake9x пишет:
под терморезистор в паяльнике (3.8 0м)

Около 3-х ом - это сопротивление нагревателя, у терморезистора - в районе 50 Ом. Похоже, что перепутаны нагреватель с термодатчиком. Тут уже было такое.
Во втором посте темы я выкладывал - 

По нагревателям.
Сопротивление керамического нагревателя при комнатной температуре составляет около 2,5–3,5 Ом.
Термодатчик - терморезистор. Его сопротивление — примерно 43–58 Ом.
У нихромовых нагревателей при комнатной температуре нагреватель имеет сопротивление около 10–17 Ом, а термодатчик - термопара, сопротивление, приблизительно 2–3 Ом.

Цитата:
паяльник греется но на дисплее температура не меняется

Под терморезистор схема усилителя несколько отличается от того, что для термопары.

snake9x
Offline
Зарегистрирован: 21.01.2017

Да, вы правы, спасибо, я лоханулся, причем читал на форуме этот случай ,и пересматривал много раз сопротивление и почему то тупил, поменял местами провода датчика и нагревателя, как надо и теперь другая проблема похоже на кз и станция перезагружается в понедельник думаю всё ещё раз перепроверить https://youtu.be/fv92ii-mSNU

Igor22
Offline
Зарегистрирован: 26.06.2019

Что не делал, не хочет работать,
поменял транзисторы bc337, irfz44n, отпаял оптроны и все равно кз, заметил то, что если подать 24 в, то норм, если потом включаю питание станции, то блок в защиту уходит

serg1968-09
Offline
Зарегистрирован: 18.04.2019

Igor22 Диоды защитные правильно хоть впаяны

Igor22
Offline
Зарегистрирован: 26.06.2019

Да, правильно

kret.a.v@gmail.com
Offline
Зарегистрирован: 14.07.2017

я свою так и не довел до ума , застрял на калибровке

можно как то упростить этот процесс?

Igor22
Offline
Зарегистрирован: 26.06.2019

Заработала, все дело в китайских бракованный деталях, заменил диоды (был один сгоревшей) и как на зло один новый оказался бракованным и с bc 337 тоже самое, и все, заработало, заменил на китайском импульснике конденсаторы, на получше и поемче, все равно в защиту уходит, до замены до 100 градусов уходил, после до 80, мягкий старт включён

Igor22
Offline
Зарегистрирован: 26.06.2019

Теперь другая проблема, не греет фен, куда копать?

serg1968-09
Offline
Зарегистрирован: 18.04.2019

Меняйте местами выводы на семисторе Т1 и Т2

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

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

Oleg_D
Offline
Зарегистрирован: 13.06.2018

Igor22 пишет:
Теперь другая проблема, не греет фен, куда копать?

Проверка мос и симистора. Пост 1466
Проверка срабатывания реле
Проверка zero cross.
Ищите, подробнее уже писали.

snake9x
Offline
Зарегистрирован: 21.01.2017

snake9x пишет:
Да, вы правы, спасибо, я лоханулся, причем читал на форуме этот случай ,и пересматривал много раз сопротивление и почему то тупил, поменял местами провода датчика и нагревателя, как надо и теперь другая проблема похоже на кз и станция перезагружается в понедельник думаю всё ещё раз перепроверить https://youtu.be/fv92ii-mSNU

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