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

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

Контраст тут не причем. Верхний ряд в квадратах, означает отсутствие инициализации. Либо нет где то контакта, либо указан неверный адрес i2c.

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

Да человек вообще интересный. У меня не получается, помогите. Что не получается, догадайтесь сами.

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Контрастность крутил не помогло. Прошивал из примеров hello world ,появляется второй ряд квадратиков но буквы не выводятся на дисплей.

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Alex зачем догадываться, я описал проблему.

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

Да, именно так и описал. У меня не работает, помогите. Какую прошивку заливал, х.з. На какие пины экран повесил, х.з. Вам выше описали, что проблема или в контакте, или в неверном адресе i2c. Прочтите первые 2 страницы форума, автор все расписывал. И как адрес i2c определить в том числе.

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Alex,прошивка и плата из вашего архива. Только дисплей 1602. Сканером проверил адрес i2c ,изменил в прошивке. Контакт проверил все норм. На дисплее два ряда квадратиков. Прошивка ваша ss2.2 .

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

Вспомнить бы ещё чего я там менял в прошивке 2.2. Она вроде под экран 20х4.

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Alex я подозреваю дело не в прошивке. А в дешёвом китайском экране. Не хочет он выводить буквы. Заливал примеры,квадратики мигают ,курсор перемещается по квадратикам и по строчкам но буквы выводить не хочет.

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

Экран без латинских букв? Х.з. Может он с кириллицей?

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Сходил купил экран с кириллецей , прошил все заработало. Извиняюсь за доставленные неудобства.

Plpp2014
Offline
Зарегистрирован: 06.06.2021

День добрый. Если не ошибаюсь, где-то здесь был вариант одноплатной паялки в SMD-факторе. Но что-то листаю-листаю, не найду. Буду благодарен, если ткнете носом.

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

To: MaD-TuX

http://www.mad-tux.tk/solder-station

 Здравствуйте а можете скинуть файл вашего проекта спасибо. 

А то ссылка нерабочая. 

ub3b_radio(a)yahoo.com

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

MaD-TuX пишет:

Наконец-то и я закончил свой вариант паяльной станции. Все просто чудесно.

Если читать информацию в ветке не бегло, то все прекрасно начинает работать практически с первого раза.

Да простят меня участники форума :), я собрал по ветке основную часть информации и рекомендаций и оформил как отдельную статью у себя на сайте.

Также там выложены все файлы по моему клону

http://www.mad-tux.tk/solder-station

Здравствуйте а можете скинуть файл вашего проекта?

А то ссылка нерабочая. 

ub3b_radio(a)yahoo.com

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

Чувак давно послал всех. Вы хоть на даты постов смотрите. Что надо конкретно?

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Спасибо за отклик. Думал форум к нему в почту постучится, если он живой)). Хотел его вариант посмотреть с энкодером, по его ссылке что вы дали, ничего. Станцию собираю. Пока на вашем варианте остановился. Есть  новая идея паястанции, если не против, чуть позже сброшу на мыло, как проработаю железо. Нужно будет ваше соавторство )), если будет желание, ибо я "не писатель, а читатель" )) Да, плат готовых не осталось? А то я так красиво не сделаю, а скитая долго.

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

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

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Интересно посмотреть. Поделитесь, плиз, информацией проекта, пока делать не начал. И если то, как купить-получить?

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

Никак. Ни купить ни получить. Если интересна информация, пишите на мыло alexfree78псинаyandex.ru

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Отписался, жду.

FagotBah
Offline
Зарегистрирован: 02.01.2019

Ссылка на станцию от MaD-TuX (полный архив)

https://fex.net/ru/s/lznbytv

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Огроменное спвсибо! Все открывается!

dimon-0671
Offline
Зарегистрирован: 22.03.2019

Alex доброго времени суток. Можно посмотреть ваш новую станцию? dimon-0671@yandex.ru

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

OlegK доброе время суток.Подскажите пожалуйста собрал клон вашей паяльной станции подал 5вольт канал фена при нагревании зажигалкой изменяются показания  а канал паяльника стоит на 23 г и не каким регулировкам не поддаётся в паяльнику стоит 50 ом термосопротивление

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021
это ваша пронивка
/* * * * * * * * * * * * * * * * * * */
/*       Soldering Station v 2.2     */
/*      coded by OlegK /Ruslan S     */
/*      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 "2.2"

#ifdef LCD_1602
LiquidCrystal_I2C lcd(0x3F, 16, 2);

#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 = 9;
uint16_t S_sleeptime = 9;
uint16_t Graph_count = 0;
uint32_t UPbuttonPressTime = 0;
uint32_t DWNbuttonPressTime = 0;
uint32_t SONbuttonPressTime = 0;
uint32_t HAONbuttonPressTime = 0;

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

char bspace[ ] = "    ";

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

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

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

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

/* Hot Air */

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

byte hotair_state = st_stop;

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

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

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

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

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

/* Solder P regulator */
#define sKp 50

uint16_t last_HotAirT, last_SolderT;
byte last_RPM;

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

void setup() {
    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 == 10) {
                        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 == 10) {
                        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, 1380, 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);
    }

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

    if  (SONbuttonState) {
        if ( millis() - SONbuttonPressTime >= 350 ) { //long press //нажатие кнопки
            SONbuttonPressTime = millis();
            if (SolderON) {
                SolderON = false;
                MemSolder();
                Beep(30);
            }
        }
    }

    /* 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 >= 350 ) { //long press
            HAONbuttonPressTime = millis();
            if (hotair_state == st_work || hotair_state == st_pause) {
                hotair_state = st_stop;
                need_Cooling = true;
                MemHotAir();
                Beep(30);
            }
        }
    }

    /* 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;
                }
                resetSolderStablePoint();
                set_s_f();
                resetSolderCountdown();
                break;
            case modeHotAir:
                if (SetHotAirT < max_hotair_temp) {
                    SetHotAirT += 5;
                }
                break;
            case modeFanPWM:
                if (SetHotAirRPM < max_rpm) {
                    SetHotAirRPM += 5;
                }
                break;
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

    //lcd.setCursor(0, 0);
    //lcd.print(F("W"));

#endif
}

/* Update LCD */
void DisplayUpdate() {

#ifdef LCD_1602

    lcd.setCursor(0, 0);
    lcd.print (F("S:"));
    //lcd.setCursor(1, 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 (F("H:"));
    //lcd.setCursor(1, 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_Mode) {
    case modeSolder: {
        lcd.setCursor(2, 0);
        break;
    }

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

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

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

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



#endif

}

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

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

При отключенном из разъема паяльнике, что показывает?

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

подскажите что я сделал неправильно

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

прбелы  тоесть чёрточки

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

И нагреватель с термодатчиком при монтаже не перепутаны?

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

нагреватель 3.8 ом датчик 40.7 ом

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

схема для паяльника собрал по этой схемено не работает

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

Здравствуйте а можете скинуть файл вашего проекта спасибо

а то что делаю не дам ладу

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

Добрый вечер. Вы писали что Можно применить и что-то проще, типа LM358, но в коде придётся сделать небольшое исправление. какое исправление нужно делать ,а то не дам ладу каналу паяльника.

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

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

Поэтому я не намерен снова повторять ту ошибку юного радиолюбителя.

0. Читаем внимательно файл "Настройка усилителей термодатчиков.txt" (прикрепил внизу, на всякий случай) и перезаливаем прошивку с отключенными защитами:

отрывок: 

Не нужно крутить "начало" при нагретом паяльнике. ТОЛЬКО при остывшем до комнатной.
1. Пока канал не настроен, дополнительные защиты нужно отключить.
2. Отключить можно, закомментировав дефайны                                   - (строки 33-34 кода у вас)
/* if you want deactivate additional protection, then COMMENT it */ 
#define HA_ADV_PROT_ON - для канала фена
#define S_ADV_PROT_ON - для канала паяльника
и перезалить прошивку.
 

1. Я уже спрашивал о том, что показывает при отключенном паяльнике, и не перепутаны ли в разъеме контакты нагревателя и терморезистора, не просто так что мне нефиг делать, поумничать. Вы ответили только данными по сопротивлению, и все, из чего я только понял что вы понимаете что у них разное R, но не понял как и где вы замеряли. На разъеме провода отключенного паяльника? Тогда вы не ответили на мой вопрос. Или при подключенном паяльнике измерили на плате, на входе в усилитель? Тогда правильно, но я не экстрасенс, что бы понять это по вашему ответу, и двинуться дальше. А если при отсоединенном паяльнике показывает ту же температуру, то это указывает на другое. Много уходит времени на выяснение вашей же ситуации при неполном, непонятном ответе. (уверен, что вы уже проверили работоспособность термодатчика паяльника, измерив ↑R на разъеме провода паяльника при нагреве керамики?)

2. После этого, если все правильно, давайте проверим работу усилителя с ЛМ358. Отключи паяльник из разъема, и на вход усилителя подключаем переменное сопротивление 100 ом, установленное на 50ом. При ↑ R, должно ↑ V на выходе ОУ по вашей схеме лапа №1. Я не использую ЛМ и не хочу морочиться, но насколько помню, у неё Vвых макс.= 0,5Vпитания, при отпаянном выводе резистора 10кОм от 25 лапы (А6) АрдуНаНо. Если все в порядке, паяем обратно. В принципе при рабочем усилителе на дисплее t° тоже должна ↑. (Если так, ползем от платы наружу, через шлейф, разъем и до нагревателя, в этом случае обычно перепутаны нагреватель и датчик, но ведь мы уже это проверили? ;-)) Проверяем далее, что на 25 лапе (А6) АрдуНаНо. Если все в порядке, V с усилителя есть (или не в порядке, замкнуто на массу), но (и) t° на дисплее не ↑, отключи выход усилителя ФЕНА от АрдуНаНо, лапа №26 (А7), отпаяв вывод резистора 10кОм, и отключи выход усилителя паяльника от АрдуНаНо, лапа №25 (А6), тоже отпаяв вывод резистора 10кОм, подключи его, усилитель паяльника, с резистора 10кОм, вместо усилителя фена  на лапу №26 (А7) АрдуНаНо, т.е. на проверенный в работе канал фена, и посмотри изменение данных t° фена на дисплее при изменении переменного сопротивления 100 ом на входе усилителя, или при нагреве подключенного паяльника. Порт АрдуНаНо 25 лапа (А6) может тоже оказаться сгоревшим, для этого и проверяем.

Делаем пока так, если раньше не было сделано. Исключаем, двигаемся дальше.

Расписал подробно. Знал бы тебя, к примеру что достаточно написать "отключи выход усилителя ФЕНА", вместо подробного изложения, мне было бы конечно проще. 

"Настройка усилителей термодатчиков.txt"

Не нужно крутить "начало" при нагретом паяльнике. ТОЛЬКО при остывшем до комнатной.

1. Пока канал не настроен, дополнительные защиты нужно отключить.

2. Отключить можно, закомментировав дефайны -
/* if you want deactivate additional protection, then COMMENT it */
#define HA_ADV_PROT_ON - для канала фена
#define S_ADV_PROT_ON - для канала паяльника
и перезалить прошивку.
---
Рассмотрим настройку канала паяльника.
3. Привязываем к жалу паяльника термопару мультиметра.
4. Канал не включаем. При остывшем до комнатной температуры паяльнике нужно настроить показания, 
    соответствующие комнатной температуре. Подстроечником "начало". Если не получается уменьшить 
    показания, то резистор, последовательно с этим подстроечником нужно несколько увеличить. 
    И наоборот, если не получается увеличить, то резистор уменьшить.
5. Задаём какой-нибудь небольшой нагрев (100-200 град) и включаем канал. Смотрим температуру по 
    термопаре мультиметра и то, что показывает дисплей. Подкручиваем подстроечник "шкала", что бы 
    показания соответствовали реальным. Торопиться не нужно, процесс инерционный, лучше подождать, 
    пока температура устаканится. Если показания нужно увеличивать, а подстроечника не хватает, то 
    последовательное сопротивление с этим подстроечником нужно увеличить. И наоборот.
6. Выставили 100-200 град. Выключаем канал и курим до полного остывания паяльника до комнатной 
    температуры. Смотрим, куда уползли показания. Если нужно - подстраиваем "началом".
7. Задаём температуру 300-350 град. Включаем канал и подстраиваем, как в п. 5 "шкалой".
8. Выключаем, остужаем до комнатной, если нужно подстраиваем "началом".
9. Можно повторить пункты 7 и 8 до результата, когда остывший паяльник "выдаёт" температуру близкую 
    к комнатной, а нагретый-  близкую к измеренной. Не забываем, что нужно давать температуре устояться.
10. Теперь можно отвязать термопару мультиметра и, по желанию, включить отключённые доп. 
    защиты - раскомментировать вышеуказанные дефайны и перезалить прошивку.
 
Для канала фена всё абсолютно так же. 
Образцовую ТП нужно расположить в фокусе струи воздуха (находится по макс. показаниям образцовой ТП), 
на расстоянии, при котором планируется работать (например, 10-30мм) и не трогать её положения до окончания 
процесса настройки.

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

[quote=aleksandr.butenko]

Добрый вечер. Вы писали что Можно применить и что-то проще, типа LM358, но в коде придётся сделать небольшое исправление. какое исправление нужно делать ,а то не дам ладу каналу паяльника

Все что нужно для 328 у вас в коде отмеченно. А именно строка 27. Выбрана lm328. Т.е. коэф. умножения для нее будет 2, по причине формулы вых. напряжения (0.5 Vcc), вроде.

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

канал паяльника который не работал наладил ночью сделал так нагрел феном термистор до 300 гр. и начал крутить подстрочники  и всё заработало  теперь буду настраивать дальше следуя вашей инструкции

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

спасибо за рекомендации буду вечером  подключать 24в и220 и настраивать дальше

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

поздравляю. Так понял прошивка была залита с включенными защитами до первого включения и настройки? Теперь по рекомендациям авторов настраивайте, по текстовому файлу. (это их рекомендации). Я сам пока не доделал станцию с этой же платой. нет времени. разбираюсь с вариантом на энкодере и с часами. заморочки с библиотеками. не могу пока заставить работать вариант с другими часами. Удачи. отпишитесь по результатам. порадуемся вместе ;-))

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

Вариант с энкодером от MadTux нормально работает. Проверено неоднократно. Часы выброшены нахрен. Ибо нафиг не нужны. Плата, что выше мелькала, моей разводки , проверена также неоднократно. Все проблемы здесь уже обсуждались неоднократно. Если кому-то лень прочитать десяток первых страниц форума, то это его проблемы...

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Привет Алекс. Не хотел беспокоить с вопросами. Плату из ваших старых запасов собрал, с кнопками на макете запускается. Но я хочу с энкодером. Корпус красивый прикупил, но довольно компактный, неудобно будет с кнопками... Часы на другом чипе запустить не удалось, упирается в некорректную работу библиотек, особенно санрайз.... Выкорчевывал часы из кода. Санрайз выдрал, не ругается, меню переделывал, с остальным (часами) не получается, компиляция с ошибками, в программировании на уровне дилетанта, изучаю. В том архиве, что вы мне сбрасывали, не нашел прошивки с энкодером без часов, в архиве от MadTux тоже. Форум изучил, но повторю, с программированием туго. Да и 90% выкладывавшихся материалов по ссылкам, удалены. Если вы поможете с этой прошивкой, сбросите, буду премного благодарен. Спасибо за внимание! ub3b_radio(&)yahoo.com

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

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

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

Выдрать модуль часов и удалить их отображение. Самый простой вариант.

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

Ок, этим и занимаюсь, поборюсь, но победа похоже, будет не за мной... Наверно буду или модуль часов на "правильной" микросхеме заказывать, либо делать сенсорные кнопки за лицевой панелью. А жаль...  MadTux, заразка, видимо с часами разбирался, и приКуевертил к паяльнику и смылся. Ладно часы, так ещё и расчёт рассвета-заката в зависимости от координат, нафиг это всё паяльнику!!! :-)) Интересно, здесь на форуме  ещё кто-нибудь остался, кто может помочь?

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

привет Andy_UB3B вот адрес  на прошывку https://fex.net/ru/s/ym4brpz только у меня вылетает ошибка по библиотеке Sunrise.h

Данный код адаптирован под управление только одним энкодером.                                                  
 * В качестве "плюшки" добавлен модуль часов реального времени.      
 * Адаптировал MaD-TuX.

если получится отпишись

https://fex.net/ru/s/lzzsxrf а это печатка

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

aleksandr.butenko пишет:

... только у меня вылетает ошибка по библиотеке Sunrise.h

Данный код адаптирован под управление только одним энкодером.                                                  
 * В качестве "плюшки" добавлен модуль часов реального времени.      
 * Адаптировал MaD-TuX.

Да есть у меня вся эта ... с "плюшками", нахрен бы они упали!

И будет вылетать ошибка пока не найдешь ту библиотеку, что М. использовал. А если он её ещё под себя изменил, то  Придётся по библиотеке менять команды. Я его выкорчевал, борюсь с часами. И часы DS3231 ибо похоже команды под них, а не для DS1307.  Где-то видимо недогоняю в другом, ладно, х_с ним, разберусь, или на кнопках сделаю без будильника. Повелся на защиты в схеме, понравилось, а то что проект уже подох и хрен кто поможет, не учёл. Алекс1978 остался, и FagotBah  человеки! Хотел же другую делать...

Да и посмотри в коде, ссылку на который ты мне прислал, строки 40 и 122. Не настораживает?

mr.nikon
Offline
Зарегистрирован: 20.05.2016

alex1978 пишет:
Не помогу. Я на этот проект уже давно забил. И все материалы пролюбил. Ну не все, но большую часть. Программист из меня, как пуля из дерьма...
а может чуток вспомнить и сделаем печать на смд максимально компактную?

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

FagotBah пишет:

Ссылка на станцию от MaD-TuX (полный архив)

https://fex.net/ru/s/lznbytv

Здравствуйте. 

Подскажите, у вас его прошивка работала? Есть ли у вас файлы библиотек, работающих на ней?

А без часов с энкодером случаем не завалялось?

Подсобите, плиз, если возможно!

Спасибо за внимание

mr.nikon
Offline
Зарегистрирован: 20.05.2016

alex1978 пишет:
Не помогу. Я на этот проект уже давно забил. И все материалы пролюбил. Ну не все, но большую часть. Программист из меня, как пуля из дерьма...
а может чуток вспомнить и сделаем печать на смд максимально компактную?

 

aleksandr.butenko
Offline
Зарегистрирован: 26.10.2021

я не программист

 

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

mr.nikon  Приветствую! А по прошивкам с энкодером помочь не можете? Без часов желательно, или помочь выкорчевать. (Я не программер, только начинаю, на старости ;-)) Или с работающими здесь библиотеками. А то я не могу заставить работать и энкодер. кнопку запустил, а вращения нет. Ошибку не выдает при компиляции, но не крутит... Перепробовал уже кучу библиотек и энк., энкодеры рабочие...

Спасибо за внимание!

Andy_UB3B
Offline
Зарегистрирован: 10.06.2021

aleksandr.butenko пишет:

я не программист

 

Я тоже, но разные часы, бросается в глаза DS3231 и DS1307. похоже заточено под первые