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

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

Всем доброго дня. Это обращение к OlegK. Оргромное Вам спасибо за разработку и предоставленные вусловия для изготовлениявсем желающим. Неделя активной работы с этой паяльной станцией принесли только положительные эмоции.

Доработал печатные платы под свои размеры корпуса и вот что получилось

Еще раз СПАСИБО.

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

 Здравсвтуйте,Aisis2010 поделитесь пожалуйста печатными платами,заранее благодарю за ответ.

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

Возможно pter обращался ко мне. Все варианты пчатных плат можно найти по ссылкам на первой странице. Каждый сам, при необходимости, дорабатывает платы под размер своего корпуса и тех комплектующих, которые будут применены (это касается, в основном, применяемого источника(ов) питания. У меня их два- 24 и 5 вольт, оба импульсные). Так что выбирай корпус, продумай компановку (или наоборот), определись сколько плат будет применено и с камими размерами. Будут вопросы, пиши, участники форума не оставят без их решения. Ну а если собрался делать в корпусе CD-ROM, то тут нужно хорошо проработать вопрос с компановкой блоков, монтаж очень плотный и на счету каждый миллиметр. Как пример использования с другими устройствами.

Warcan
Offline
Зарегистрирован: 23.05.2018

Не работает у меня что-то фен, поведение следующее, нажимаю кнопку включения фена и на диспоее появляется двоеточие в строчке фена, включается вентилятор фена.  Фен не греется и питание на сооответствующие контакты не поступает.

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

quote=Warcan]

.... на диспоее появляется двоеточие в строчке фена.

[/quote]
А перед двоеточием какая цыфра (номер ошибки) ? Скорее всего уходит в защиту из-за температуры. Реле фена щёлкает?

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017


/* * * * * * * * * * * * * * * * * * */
/*       Soldering Station v 1.5     */
/*           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

/* End options */


#define FIRMWARE_VERSION "1.5enc"

#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  modeHotAir 2
#define  modeFanPWM 3

boolean need_S_countdown = false;
byte selected_Mode = modeHotAir;
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 Enc_ButtonPressTime = 0;
boolean Enc_ButtonState;
uint32_t Enc2_ButtonPressTime = 0;
boolean Enc2_ButtonState;

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 50
#define max_hotair_temp 450
#define min_rpm 30
#define max_rpm 100
#define default_temp 280
#define default_rpm 50

/* Gercons */
#define sw_HA 10
#define sw_S 9

#define e_button 15 //pin A1 button
#define e_dir 16    //pin A2 enc_a
#define e_step 17   //pin A3 enc_b
#define e2_button 14 //pin A0 button2
#define e2_dir 13    //pin D13 enc2_a
#define e2_step 11   //pin D11 enc2_b

/* Bounce killers */
Bounce swHotAir = Bounce();
Bounce swSolder = Bounce();
Bounce Enc_Button = Bounce();
Bounce Enc2_Button = 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

    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 & power > 0 */
    /* & */
    /* Advanced protection: the themperature is not changed within 10 secs */
    /* & */
    /* Advanced protection: the themperature rise up & power < 0 */

    if (!HA_temp_stable) {
        static uint16_t prev_t;
        static byte t_cnt = 0;
        static byte t_cnt2 = 0;
        static boolean ha_ctrl = true;

        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();

#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 & power > 0 */
    /* & */
    /* Advanced protection: the themperature is not changed within 5 secs */
    /* & */
    /* Advanced protection: the themperature rise up & power < 0 */
    if (!S_temp_stable) {
        static uint16_t prev_t;
        static byte t_cnt = 0;
        static byte t_cnt2 = 0;
        static boolean s_ctrl = true;

        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 == 5) {
                        SProtectionOut();
                        t_cnt = 0;
                        return 6;
                    }
                } else t_cnt = 0;
            } else { //SPower == 0.0

                /* themperature rise */
                if (prev_t < GetSolderT && GetSolderT > SetSolderT) {
                    t_cnt2++;
                    if (t_cnt2 == 5) {
                        SProtectionOut();
                        t_cnt2 = 0;
                        return 7;
                    }
                } else t_cnt2 = 0;
            }
        }
    } else prevScontrol = millis();

#endif

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

    /* everything is OK */
    return 0;
}

/* Solder full off */
void SolderOff() {
    analogWrite(pinSolderPwm, 0);
    D5_Low;
    D4_Low;
    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;
    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();
}

/* Solder P regulator */
void S_P() {
    int TempPower = sKp * (SetSolderT - GetSolderT);
    SPower = constrain(TempPower, 0, 255);
    analogWrite(pinSolderPwm, SPower);
}

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

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

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

/* Encoder1 short & long button press */
    /* Encoder button short press */
    if (Enc_Button.update()) {
        if (Enc_Button.fell()) {
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = true;
        } else {
            if (SolderON) {
              resetSolderCountdown();
              Beep(50);
            }    
            Enc_ButtonState = false;
        }
    }

    /* Encoder1 button long press */
    if  (Enc_ButtonState) {
        if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            if (SolderON) {
                SolderON = false;
                MemSolder();
                Beep(200);
            } else {
                Beep(100);
                SolderON = true;
                SolderProtect = false;
                Activate_S_countdown();
                Graph_count = 0;
                resetSolderStablePoint();
                set_s_f();
            }
            Enc_ButtonState = false;
        }
    }
    
    /* Encoder2 button short press */
    if (Enc2_Button.update()) {
        if (Enc2_Button.fell()) {
            Beep(50); 
            Enc2_ButtonPressTime = millis();
            Enc2_ButtonState = true;
        } else {
            if (hotair_state == st_work) { resetHotAirCountown(); }
            if (Enc2_ButtonState) { (selected_Mode < modeFanPWM) ? (selected_Mode++) : (selected_Mode = modeHotAir); }
            Enc2_ButtonState = false;
        }
    }

    /* Encoder2 button long press */
    if  (Enc2_ButtonState) {
        if ( millis() - Enc2_ButtonPressTime >= 1000 ) {
            Beep(200);
            Enc_ButtonPressTime = millis();
            if (hotair_state == st_work || hotair_state == st_pause) {
                hotair_state = st_stop;
                need_Cooling = true;
                MemHotAir();
                Beep(200);
            } else {
                Beep(100);
                hotair_state = st_work;
                Graph_count = 0;
                selected_Mode = modeHotAir;
                need_Cooling = true;
                resetHotAirStablePoint();
                set_ha_f();
                integral = 0;
            }
        }
            Enc_ButtonState = false;
        }
}

/* Encoder interrrupt */
//Solder encoder
ISR(PCINT1_vect) {
    static byte old_n=PINC & B1100; // маска B00001100 что б читать только нужные 2 бита
    byte new_n = PINC & B1100;

    if (old_n == B0100 && new_n == B1100 || old_n == B1000 && new_n == B0000) { //CW turn
            
                if (SetSolderT < max_solder_temp)
                   { SetSolderT += 5; }
                resetSolderStablePoint();
                set_s_f();
                resetSolderCountdown();
                Beep(50);
    }
    
    if (old_n == B1000 && new_n == B1100 || old_n == B0100 && new_n == B0000) { //CCW turn
            
                if (SetSolderT > min_solder_temp)
                   { SetSolderT -= 5; }
                resetSolderStablePoint();
                set_s_f();
                resetSolderCountdown();
                Beep(50);
    }
    old_n = new_n;
}

//Hotair encoder
ISR(PCINT0_vect) {
    static byte old_n2=PINB & B101000; // 
    byte new_n2 = PINB & B101000;

    if (old_n2 == B100000 && new_n2 == B101000 || old_n2 == B001000 && new_n2 == B000000) { //CW turn
            switch (selected_Mode)
            {
            case modeHotAir:
                if (SetHotAirT < max_hotair_temp)
                   { SetHotAirT += 5; }
                break;
            case modeFanPWM:
                if (SetHotAirRPM < max_rpm) 
                   { SetHotAirRPM += 5; }
                break;
            }
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
                Beep(50); 
    }
    
    if (old_n2 == B001000 && new_n2 == B101000 || old_n2 == B100000 && new_n2 == B000000) { //CCW turn
            switch (selected_Mode) 
            {
            case modeHotAir:
                if (SetHotAirT > min_hotair_temp) 
                   { SetHotAirT -= 5; }
                break;
            case modeFanPWM:
                if (SetHotAirRPM > min_rpm) 
                   { SetHotAirRPM -= 5; }
                break;
            }
                set_ha_f();
                resetHotAirStablePoint();
                resetHotAirCountown();
                Beep(50); 
    }
    old_n2 = new_n2;
}

/* 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(e_button, INPUT_PULLUP);//enc button 
    Enc_Button.attach(e_button);
    Enc_Button.interval(5);
    
    pinMode(e_dir, INPUT_PULLUP);   //pin A2 enc_a
    
    pinMode(e_step, INPUT_PULLUP);  //pin A3 enc_b

    pinMode(e2_button, INPUT_PULLUP);//enc2 button 
    Enc2_Button.attach(e2_button);
    Enc2_Button.interval(5);
    
    pinMode(e2_dir, INPUT_PULLUP);   //pin D13 enc2_a
    
    pinMode(e2_step, INPUT_PULLUP);  //pin D11 enc2_b

    PCICR |= (1 << PCIE0) | (1 << PCIE1);       // enable interrupt for group 0 & 1
    PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);  // This enables the interrupt for pin 2 and 3 of Port C.  
    PCMSK0 |= (1 << PCINT5) | (1 << PCINT3);    // This enables the interrupt for pin 3 and 5 of Port B.   
}

/* 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 (SolderON) {
        lcd.print(S_countdown);
    }

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

    byte pos;
    pos = GetPos(GetSolderT);
    lcd.setCursor(8, 0);
    lcd.print(bspace);
    lcd.setCursor(8+pos, 0);
    if (GetSolderT > 505) {
        lcd.print(F("---"));
    } else {
        lcd.print(GetSolderT);
    }
    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);

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

    if (GetHotAirT > 505) {
        lcd.print(F("---"));
    } else {
        pos = GetPos(GetHotAirT);
        lcd.setCursor(8+pos, 1);
        lcd.print(GetHotAirT);
    }
    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_Mode2) {
    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 (SolderON) {
        lcd.print(S_countdown);
    }

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

    byte pos;
    pos = GetPos(GetSolderT);
    lcd.setCursor(16, 1);
    lcd.print(bspace);
    lcd.setCursor(16+pos, 1);
    if (GetSolderT > 505) {
        lcd.print(F("---"));
    } else {
        lcd.print(GetSolderT);
    }

    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);

    lcd.setCursor(16, 2);
    lcd.print(bspace);
    lcd.setCursor(16, 2);

    if (GetHotAirT > 505) {
        lcd.print(F("---"));
    } else {
        pos = GetPos(GetHotAirT);
        lcd.setCursor(16+pos, 2);
        lcd.print(GetHotAirT);
    }
    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 ********************************************/
  

Доброго времени суток всем)) Прошу не кидатся камнями за догое отсутствие - пытался устроить личную холостяцкую жизнь, и было чуток не до форума. Вот давно обещанный вариант прошивки для 2 энкодеров. Подключение: A1 - кнопка, А2,А3 - выводы энкодера на паяльник. А0 - кнопка, D13,D11 - выводы энкодера на фен. Все подтянуты конденсаторами по 20 пикофарад на землю. Логика работы: длинное нажатие - включение-выключение. Короткое нажатие - сброс таймера. Для фена коротким нажатием выбирается обороты-температура. Заранее прошу прощения за найденные косяки. Жду отзывов

 

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

.

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

.

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

Спасибо за труды! Опробуем. Скажите, а энкодеры подключать по схеме на микросхемах 74hc74 и 74hc14? Каждый на своей плате, или можно общую плату на 2 энкодера сделать?

Warcan
Offline
Зарегистрирован: 23.05.2018

О не совсем я верно расписал поведение фена. Пробовал с выставленной температурой 50 градусов. А вот попробовал выставить на 400 и вот тут индикация поменялась.  Вначале появляется ":" и спустя минуту "!6". Реле при этом щёлкает два раза 1 раз когда загорается ":" и 2 раз когда загорается "!6". При этом на спираль фена не подаётся ни какого напряжения. 12

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

Warcan, 

Перепрошей ардуино. 

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

Warcan, 

Перепрошей ардуино. 

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

Warcan, 

Перепрошей ардуино. 

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

Warcan, 

Перепрошей ардуино. 

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

ух ты, один клик и 4 сообщения. Круто.

 

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

напрямую.

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

напрямую.

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

напрямую.

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

ух ты, один клик и 4 сообщения. Круто.

 

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

мда. коллеги - форум тупит неимоверно

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

Warcan пишет:
Реле при этом щёлкает два раза 1 раз когда загорается ":" и 2 раз когда загорается "!6".

Первый раз срабатывает, второй раз - отключается.
Цитата:
При этом на спираль фена не подаётся ни какого напряжения.

Это очевидно, при несработанном реле.

Предполагаю, что усилитель не может измерить выше 325 град.
Сколько показывает дисплей, если отключить фен из разъёма?

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

Warcan пишет:

... Вначале появляется ":" и спустя минуту "!6". Реле при этом щёлкает два раза 1 раз когда загорается ":" и 2 раз когда загорается "!6". При этом на спираль фена не подаётся ни какого напряжения.


Читаем в описании :
6. Температура падает или не изменяется ("зависла") при подаваемой мощности больше 0. Возможные ситуации - обрыв в цепи нагревателя, неисправность усилителя термодатчик.
Вопрос: как у вас там 325 градусов появилось, если спираль не греет?
Также проверьте отдельно блок симистора, подав принудительно 5в вместо ардуино, при этом ардуино вытащить., и отдельно спираль фена. Соблюдайте осторожность! Симистор даже в закрытом состоянии под напряжением. Потом исправность и возможность регулировки оу.

Warcan
Offline
Зарегистрирован: 23.05.2018

OlegK пишет:

Warcan пишет:
Реле при этом щёлкает два раза 1 раз когда загорается ":" и 2 раз когда загорается "!6".

Первый раз срабатывает, второй раз - отключается.
Цитата:
При этом на спираль фена не подаётся ни какого напряжения.

Это очевидно, при несработанном реле.

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

OlegK пишет:

Сколько показывает дисплей, если отключить фен из разъёма?

270 

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

Проверьте термопару фена. Можете погреть над плитой металлическую часть, градусов больше 60, аккуратно. Подключите и посмотрите на температуру. Если не показывает больше 325, то OlegK прав. Настройте "Начало" так, чтобы при подключённом фене показывало комнатную температуру, подбором резисторов. При этом для "Шкалы" используйте типовые номиналы, как на схеме. Пардон, влез в Вашу беседу.

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

Warcan пишет:
270

Это ненормально мало. При выключенном канале и отключенном из разъёма фене или паяльнике (или обрыве термодатчика) показания должны быть "---", что означает, что температура аварийна, т.е. более 505 град. В этом случае, на вход ОУ приходит напряжение только с цепи смещения, что вводит ОУ практически в насыщение.
Вам нужно, если ОУ не rail-to-rail раскомментировать дефайн

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

и настроить усилитель, как описывалось в теме.

Oleg_D
Offline
Зарегистрирован: 13.06.2018
 
Попробовал залить скетч для 2х энкодеров:
Основной дисплей у меня 1602, и тут :
Arduino: 1.6.5 (Windows 8.1), Плата"Arduino Nano, ATmega328"
'selected_Mode2' was not declared in this scope
Строка 1244   switch (selected_Mode2) выдает ошибку и скетч не заливается ...
при этом раскомментровал #define LCD_1602
при закомментированом //#define LCD_1602 ошибка не выходит, заливается.
 
Пробовал на запасном дисплее 2004 - все работает хорошо. Пропусков при быстром вращении не заметил. Очень удобно быстро перематывать температуру, класс. Еще бы под 1602 доработать и вообще было бы отлично! Конечно и за это уже огромное спасибо!
Sergey38
Offline
Зарегистрирован: 23.02.2017

Oleg_D пишет:

'selected_Mode2' was not declared in this scope

Здравствуйте. У меня раньше частенько подобные ошибки выдовал.. Попробуйте следующее: 

откройте скетч, и подготовьте его (раскомментируйте дефайны). скопируйте весь текст скетча. Создайте новый документ, и вставте туда скопированное. Главное НЕ СОХРАНЯТЬ!! должен скомпилиться..

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

Кстати при компиляции, он предложит сохранить.. Тоже отказывайтесь..

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

хм. действительно не компилируется. у самого то дисплей 2004 - на двухстрочнике не проверял. исправимся))

Warcan
Offline
Зарегистрирован: 23.05.2018

Разобрался в проблеме с температурой, на плате AMP была микро трещина. 

Но проблемы на этом не окончились, у меня судя по всему дохлый D8 вывод на ардуино.  Я хочу отпаять штырёк от этого вывода ардуино и сделать перемычку допустим с D0 на D8. Но вот в прошивке где поправить не понимаю, не подскажите что надо в ней поменять?

Warcan
Offline
Зарегистрирован: 23.05.2018

Вроде разобрался вот 

 pinMode(3, INPUT_PULLUP); //Zero cross pin
    D5_Out; //pinSolder
    D5_Low;
    D4_Out; //pinSolderProt
    D4_Low;
    D7_Out; //pinHotAirProt
    D7_Low;
    D0_Out; //pinHotAir вот это и в следующей строчке
    D0_Low;
    D12_Out; //pinBuzzer
    D12_Low;
    ButtonsSetup();

Я прав?

Warcan
Offline
Зарегистрирован: 23.05.2018

Не прав. Но я попробовал прошить в ардуино вот такой код

boolean butt_flag = 0;
boolean butt;
boolean led_flag = 0;
unsigned long last_time;
byte LEDcounter = 4;
void setup() {
  Serial.begin(9600);
  pinMode(0, OUTPUT);   // сюда подключена кнопка
  pinMode(1, OUTPUT);        // сюда подключен светодиод
  pinMode(2, OUTPUT);        // сюда подключен светодиод
  pinMode(3, OUTPUT);        // сюда подключен светодиод
  pinMode(4, OUTPUT);        // сюда подключен светодиод
  pinMode(5, OUTPUT);        // сюда подключен светодиод
  pinMode(6, OUTPUT);        // сюда подключен светодиод
  pinMode(7, OUTPUT);   // сюда подключена кнопка
  pinMode(8, OUTPUT);        // сюда подключен светодиод
  pinMode(9, OUTPUT);        // сюда подключен светодиод
  pinMode(10, OUTPUT);        // сюда подключен светодиод
  pinMode(11, OUTPUT);        // сюда подключен светодиод
  pinMode(12, OUTPUT);        // сюда подключен светодиод
  pinMode(13, OUTPUT);        // сюда подключен светодиод
  digitalWrite(0, 0);
  digitalWrite(1, 0);
  digitalWrite(2, 0);
  digitalWrite(3, 0);
  digitalWrite(4, 0);
  digitalWrite(5, 0);
  digitalWrite(6, 0);
  digitalWrite(7, 0);
  digitalWrite(8, 0);
  digitalWrite(9, 0);
  digitalWrite(10, 0);
  digitalWrite(11, 0); 
  digitalWrite(12, 0);
  digitalWrite(13, 0);
}

void loop() {
   if (millis() - last_time > 50000){
    butt_flag = 1;
    Serial.println("Button pressed");
    digitalWrite(7, 1);
    digitalWrite(8, 1);
    digitalWrite(13, 1);
  }
}

При исполнении которого ардуино через 50 секунд поставит 1 на выходах D7 D8 единичку. На выходах появилось 4В, после этого я вставил ардуино в плату и о чудо, напяжение на нагреватель фена подаётся. Что может быть не так и почему при штатной прошивке не включается фен?

John Frezer
Offline
Зарегистрирован: 26.05.2018

Oleg_D пишет:

 
 
'selected_Mode2' was not declared in this scope
 

Я ещё очень начинающий, но убрал 2, скетч компилируется. Заливать не пробовал, но думаю зальётся. Не  знаю, правильно или нет.

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

Вопрос к автору. Олег, я правильно понимаю, что пины ардуино можно менять как угодно, кроме пинов D5 и D6? Хочу сделать плату на 168 меге в дип корпусе, а у неё нет аналоговых входов A6, A7. Да и для простоты разводки порты не плохо бы переназначить.

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

alex1978 пишет:
пины ардуино можно менять как угодно, кроме пинов D5 и D6?

Нужно учитывать ещё, что используется аппаратное прерывание (D2 или D3) и шина I2C (A4 и A5).

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

Oleg_D пишет:

 
Попробовал залить скетч для 2х энкодеров:
Основной дисплей у меня 1602, и тут :
Arduino: 1.6.5 (Windows 8.1), Плата"Arduino Nano, ATmega328"
'selected_Mode2' was not declared in this scope
Строка 1244   switch (selected_Mode2) выдает ошибку и скетч не заливается ...
при этом раскомментровал #define LCD_1602
при закомментированом //#define LCD_1602 ошибка не выходит, заливается.
 

 

Похоже, John Frezer был прав)) В 'selected_Mode2' - 2 это опечатка. Трудно вспомнить то, что писалось пол года назад)) Опробуете с исправлением?)) А то под рукой ни одного 2 строчника нет

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

Да, верно. Убрал 2 и скетч залился. Всё работает.  Только с 13 ноги надо подтяжку 470ом отпаять, а то энкодер так не реагирует. Курсор бегает между температурой фена и оборотами вентилятора. Пробовал энкодер на готовой платке с Али, которая со всеми распаянными резисторами и конденсаторами. Спасибо!

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

Oleg_D пишет:

Да, верно. Убрал 2 и скетч залился. Всё работает.  Только с 13 ноги надо подтяжку 470ом отпаять, а то энкодер так не реагирует. Курсор бегает между температурой фена и оборотами вентилятора. Пробовал энкодер на готовой платке с Али, которая со всеми распаянными резисторами и конденсаторами. Спасибо!

Ой, блин! Забыл уточнить, что с D13 надо отпаять сопротивление от светодиода. Еще раз извиняюсь за свой косяк

Spinne
Spinne аватар
Offline
Зарегистрирован: 03.09.2017

Жду еще отзывов и косяков по скетчу. Если все отловим - тогда и в шапку можно.

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

OlegK пишет:

alex1978 пишет:
пины ардуино можно менять как угодно, кроме пинов D5 и D6?

Нужно учитывать ещё, что используется аппаратное прерывание (D2 или D3) и шина I2C (A4 и A5).

Про I2C в курсе, а вот про прерывание даже не подумал. Спасибо.

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

Spinne пишет:

Жду еще отзывов и косяков по скетчу. Если все отловим - тогда и в шапку можно.

У автора уже вышла прошивка версии 1.6 Может ее под энкодера сделаете?

Warcan
Offline
Зарегистрирован: 23.05.2018

Как проверить плату AMP моя станция упорно не включает фен. При этом защитное реле включено, питание на симистор приходит, но нет управления. Я написал скейч, конечно он корявый, но тем не менее он включает обе оптопары. И соответственно на фен подаётся питание через 50 секунд. Я пробовал греть зажигалкой фен судя по показаниям на экране реакция есть, температура увеличивается, значит плата исправна, и ардуино видет от него сигнал. Элементы установлены согласно схеме в файле "усилители термодатчиков.doc"

В канале термопары:
R7, R12 и R10 по 330 Ом
R13 подстроечник на 50 кОм, введён на 8,2 кОм,
В ОС - R8 на 100 кОм, подстроечник тоже на 100 кОм. Суммарное сопротивление - 149,9 кОм.
Остальные номиналы соответствуют схеме.

 Попробовал сегодня поменять AD8552 на LM358, станция как будто этого не заметила, всё тоже самое нет сигнала на включение оптопары симистора. Естественно в скейче раскоментировал #define LM358. Надеюсь на коллективный разум.

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

Здравствуйте,Warcan проверьте узел детектор нуля подробно #147.

Warcan
Offline
Зарегистрирован: 23.05.2018

Вы абсолютно правы, спасибо большушее ;)

yuraanapa
Offline
Зарегистрирован: 31.05.2017

Spinne пишет:

  

Доброго времени суток всем)) Прошу не кидатся камнями за догое отсутствие - пытался устроить личную холостяцкую жизнь, и было чуток не до форума. Вот давно обещанный вариант прошивки для 2 энкодеров. Подключение: A1 - кнопка, А2,А3 - выводы энкодера на паяльник. А0 - кнопка, D13,D11 - выводы энкодера на фен. Все подтянуты конденсаторами по 20 пикофарад на землю. Логика работы: длинное нажатие - включение-выключение. Короткое нажатие - сброс таймера. Для фена коротким нажатием выбирается обороты-температура. Заранее прошу прощения за найденные косяки. Жду отзывов

 

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

Warcan
Offline
Зарегистрирован: 23.05.2018

Я опять со своей проблемой обращаюсь к гуру!

Настраивыю плату усилителей термодатчиков, и вот что обнаружил. Вроде подстороил канал фена на температурах 200, 300, и 400 градусов.  В коде естественно доп защиты отключены.  Правда резистор включенный последовательно с подстроечником "начало пришлось увеличить до 6,8ком.  Не много ли это? Всё вроде нормально, разница с термопарой конечно есть 10-15 градусов, выключип станцию и на следующий день, прошил скейч с включенными доп защитами.  Включаю паяльную станцию и опс комнатная температура уплыла, опять подстраиваю выключаю включаю доп защиты, а на следующий день, опять комнатная температура уползает. Причём может и вниз и вверх градусов на 10. С отключенными защитами всё работает,  а вот как только включиш защиту, может выскачить ошибка !6. Что посоветуете? П.С. Усилитель AD8552.

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

Кто подскажет, КТ503 можно заменить на BC547?

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

alex1978 

Можно. У меня именно они.

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

Спасибо

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

Warcan пишет:

..... резистор включенный последовательно с подстроечником "начало пришлось увеличить до 6,8ком. Не много ли это? 

Многовато. Я конечно не спец, но у меня был lm358. Потом распаял на переходничок 8552. Сопротивления  резюков со звездой пришлось заменить у паяла - в "Начало"  с 2.2к на 1к , и с 1к на 500 Ом - у фена. В "Шкала"  у обоих стало по 100к, как и писал OlegK. При lm358 в Шкала были 51к у паяла и 20к у фена. Мой паяльник тоже на термопаре , как и фен.

Warcan пишет:

..Всё вроде нормально, разница с термопарой конечно есть 10-15 градусов..

Я при настройке шкалы точно выставил температуру с термопарой тестера, разница не более пару градусов. Все стабильно работает, ничего не уплывает. Если нет косяков в разводке платы возможно у вас растяжка шкалы выставлена не точно. Я прогонял 4 раза, в один и тот же день. Может термопара фена шалит. С защитами данное поведение не должно быть связано, это где-то писали. Температура у вас не стабильная. Вы сразу после настройки рястяжки термошкалы включите защиты и проверьте, не на следующий день. :)