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

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

Umkalab пишет:
А вот так не пойдет?

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

Полный код примерно такой будет -
 

/* Scan buttons */
void ScanButtons() {

    /* HotAir stand switch */
    if (swHotAir.update() && HotAirON) {
        ResetHAcountdown();
        Beep(50);
    }
    /* Solder stand switch */
    if (swSolder.update() && SolderON) {
        ResetScountdown();
        Beep(50);
    }

/* Encoder button */
    if (Enc_Button.update()) {
        if (Enc_Button.rose()) { // короткое нажатие кнопки
            Beep(20);
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = true;
        } else {
            if (Enc_ButtonState) { //перебираем параметр регулирования
            (selectedMode < modeFanPWM) ? (selectedMode++) : (selectedMode = modeSolder);
            }
            Enc_ButtonState = false;
        }
    }
 
   if  (Enc_ButtonState) {
    if ( millis() - Enc_ButtonPressTime >= 1000 ) { //Длинное нажатие кнопки энкодера
        Enc_ButtonPressTime = millis();
        Enc_ButtonState = false;
        if (selectedMode == modeSolder) { // если выбор - "паяльник"
            if (!SolderON) { // если выключено - включаем
                SolderON = true;
                SolderProtect = false;
                prevSmillis = millis();
                ActivateScountdown();
                Graph_count = 0;
                selectedMode = modeSolder;
                SneedBeep = true;
            } else { // или выключаем
                SolderON = false;
                MemSolder();
                Beep(200);
            }
        }  else { // если выбор - "нагреватель или вентилятор фена"
            if (!HotAirON) { // если выключено - включаем
                HotAirON = true;
                HotAirProtect = false;
                prevHAmillis = millis();
                ActivateHAcountdown();
                Graph_count = 0;
                integral = 0;
                selectedMode = modeHotAir;
                HAneedBeep = true;
                needCool = true;
            } else { // или выключаем
                HotAirON = false;
                MemHotAir();
                Beep(200);
            }
        }
    }
}

 

Umkalab
Offline
Зарегистрирован: 09.01.2017

Бьюсь с энкодером уже вторые сутки... Схема под 74HC74, не под CD4013. По распиновке они не идентичны. Заметил такой прикол:

Если не трогать ногу DIR, то при кручении колеса в любую сторону значения уменьшаются. 

Если трогать ногу DIR, повесить между этой ногой и землей светодиод, то при кручении колеса в любую сторону значения увеличиваются. 

На этой ноге, DIR которая, вообще что должно быть? Импульс какой или ещё чего? Она у меня просто в ЛОГ 1 висит и всё.

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

Umkalab пишет:
На этой ноге, DIR которая, вообще что должно быть? Импульс какой или ещё чего? Она у меня просто в ЛОГ 1 висит и всё.

На STEP будут импульсы только во время вращения энкодера, а нога DIR меняет состояние, взависимости от того, куда крутим. Оно статическое, меняется при смене направления. Поэтому STEP отлавливаются прерыванием, в нём же смотрим, в каком состоянии DIR.

Umkalab
Offline
Зарегистрирован: 09.01.2017

На STEP импульсы наблюдаю. Всё в порядке. DIR же молчит как партизан. Хоть влево, хоть вправо, хоть вдоль, хоть поперек... 

Такое ощущение как будто микросхему прошибло. Завтра заменю на ещё одну. Благо я их взял тройку.

https://drive.google.com/open?id=0B6X7gW5V3042M05UZ3BSeGdSd2s 

Это мой текущий скетч. Олег, гляньте бегло пожалуйста, может пропустил чего... 

Umkalab
Offline
Зарегистрирован: 09.01.2017

Перекинул ноги на "противоположный" флип-флоп в своей 74 микросхеме. Результат тот же... 

Umkalab
Offline
Зарегистрирован: 09.01.2017

Разобрался...

Если собирать плату энкодера на CD4013 то:

Нога 1CD/2CD Pin4/Pin10 = GND

Нога 1SD/2SD Pin6/Pin8 = GND

//*************************************

Если собирать плату энкодера на 74HC74 то:

Нога 1RD/2RD Pin1/Pin13 = VCC

Нога 1SD/2SD Pin4/Pin10 = VCC

//*************************************

 

Vln
Offline
Зарегистрирован: 17.12.2015

Как вариант работы с энкодером без использования прерывания:

- код энкодера на паскале, ссылка http://esp8266.livejournal.com/922.html

- немного "тупит" с включенным zerocross, но терпимо, delay уменьшал с 50 до 21мс

Umkalab
Offline
Зарегистрирован: 09.01.2017

Так есть же уже решение для энкодера без переноса Zero Cross пина. Вчера кстати допилил макет. Сегодня тесты будут. По моим первым впечатлениям, конструкция очень даже годная.

boba.s
Offline
Зарегистрирован: 05.02.2017

Интересно..подпишусь.

boba.s
Offline
Зарегистрирован: 05.02.2017

буду собирать. автору спасибо за труды.

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

Сообщение #2

boba.s
Offline
Зарегистрирован: 05.02.2017

почитал . вопрос  схему и печатку ибп от Umkalab можно посмотреть.не нашел.автор выкладывал?

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

Нет, насколько я помню, только портреты ))

boba.s
Offline
Зарегистрирован: 05.02.2017

Тогда просьба к автору ИБП.если есть возможность поделиться.

Umkalab
Offline
Зарегистрирован: 09.01.2017

Возможность то есть. А Вы трансформатор найдете такой? Всмысле адаптер убитый на 90 ватт от ноутбука фирмы HP.

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

Предлагаю скинуться. Кто за, отписываемся тут. Автор, оставь реквизиты или номер карты/кошелька для перевода "спасибо".

boba.s
Offline
Зарегистрирован: 05.02.2017

Кнопку на сайте надо сделать.типа : отблагодарить автора.

boba.s
Offline
Зарегистрирован: 05.02.2017

Транс. Я думаю найду.

Umkalab
Offline
Зарегистрирован: 09.01.2017

В скайп стукните.

atweaker
Offline
Зарегистрирован: 09.12.2016

Umkalab пишет:
[...] Предлагаю скинуться. Кто за, отписываемся тут. Автор, оставь реквизиты или номер карты/кошелька для перевода "спасибо".
Я - "за"

@Umkalab: а решение про энкодер это сообщения #837 и #951 + #956??

Umkalab
Offline
Зарегистрирован: 09.01.2017

Там не все так просто...

Да, оно. Стучите в Skype. Буду делиться...

Umkalab
Offline
Зарегистрирован: 09.01.2017

Значит так. 

Вот фото печатной платы из редактора:

https://cloud.mail.ru/public/9215/u2Zjx1NLp

Вот схема платы с энкодером:

https://cloud.mail.ru/public/Mtsq/XWpY9C1mr

Вот печатная плата. Нужно зеркалить!!!

https://cloud.mail.ru/public/DbP2/BY4av4kt3

Вся толпа в архиве:

https://cloud.mail.ru/public/FqzS/AcKr3hqMu

Внешний вид платы энкодера:

https://cloud.mail.ru/public/4RPr/FFLAfCoH5

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

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

Umkalab
Offline
Зарегистрирован: 09.01.2017

Могу. только завтра. Пока без основных печаток. Идет доработка...

Из готовых пока только блок питания и плата энкодера. 

boba.s
Offline
Зарегистрирован: 05.02.2017

премного благодарен!

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

Umkalab пишет:
Предлагаю скинуться.

Спасибо, конечно, но не стОит )) Всё в рамках хобби, без какого-либо шкурного интереса.
В качестве благодарности буду рад увидеть фото готового аппарата, да и другим, думаю, будет интересно.
Ну и информацию о багах, если таковые всплывут.

pter пишет:
OlegK вы в последнем скетче убрали защиту,когда температура не растет станция отключалась

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

trimmer1979
Offline
Зарегистрирован: 11.02.2017

Здравствуйте OlegK, смотрел несколько проектов паяльных станций на Ардуино, но Ваш понравился больше всех. Есть огромное желание повторить, заказаны на Али фен, паяльник, дисплей и ИБП. В ожидании разбираюсь в теме кто что изменял относительно Вашего проекта. За основу беру одноплатный вариант от Русл@на , но под свою рассыпуху, если Вам нетрудно проверить мои изменения в плате.   https://yadi.sk/d/wGmWlTDm3DpvjT

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

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

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

pter пишет:
тестовый скетч

Здесь.

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

Здравствуйте,OlegK у меня возникла проблема если я использую скетч с поста#764(использую LM358)провожу калибровку станции и к примеру комнатная температура у меня получилась 18 градусов,то призаливке тестового сетча и преведущего скетча,где отключена защита комнатная температура сразу становится 9 градусов,как я понимаю скетч недолжен влиять на калибровку станции(строка  /* if used not rail-to-rail OPA, then uncomment it */ разкоментирована),заранее благодарю за ответ.

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

pter пишет:
у меня получилась 18 градусов,то призаливке тестового сетча и преведущего скетча,где отключена защита комнатная температура сразу становится 9 градусов

Опечатался я там.
Исправьте в WorkWithHotAir() и WorkWithSolder()  #ifdef LM385 на #ifdef LM358

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

OlegK спасибо за помощь,теперь еще один вопрос(тестовый скетч) как я понял защита изначально включена,потому что обрыв термопары это ошибка 1,но защита в канале паяльника( /* Advanced protection: the themperature is not changed within 10 secs */)неработает,заранее благодарю за ответ.

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

pter пишет:
неработает

Странно, проверил, вроде работает всё. Можете проверить - остывшую до комнатной темп. станцию нужно включить, но что бы нагреватель не грел (аппаратно - отключить провод на нагреватель или выдернуть предохранитель в его цепи, программно - в процедуре регулирования принудительно обнулить значение мощности). И включить канал. Температура не будет изменяться (нагрева же нет) и, примерно через 10 сек должна сработать защита.

Принцип работы: запоминаем текущую температуру, ждём секунду и сравниваем текущую с предыдущей. Если они одинаковы (0 или +1 град.), то наращиваем счётчик, если не одинаковы, то сбрасываем счётчик. Если счётчик насчитал 10 одинаковых температур за 10 сек, то срабатывает защита.
Защита автоматически выводится из работы при стабилизации температуры.

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

trimmer1979 пишет:
если Вам нетрудно проверить мои изменения в плате.

Навскидку -
1. 5В для питания дуины нужно подавать не на вход стабилизатора (Vin) а на 5 вольт.
2. Полярность электролита в правом нижнем углу перепутана.

trimmer1979
Offline
Зарегистрирован: 11.02.2017

Спасибо. Если в остальном все хрошо, то это исправлю.

remell
Offline
Зарегистрирован: 12.02.2017

Ребята, а вот в ардуинку нано пытаюсь залить скетч, и выгибает ошибку. ЭКРАН ПО i2C. Помогите плиз.

boba.s
Offline
Зарегистрирован: 05.02.2017

Может библиотеки надо  добавить

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

Здраствуйте,OlegK проверил зашиту( /* Advanced protection: the themperature is not changed within 10 secs */) да при комнатной температуре она срабатывает(ошибка I7),но я нагрел паяльник до 100 градусов,отключаю паяльник достаю предохранитель и включаю паяльник защита  срабатывает,но на это уходит когда минута когда две,но если температура ближе к комнатной защита срабатывает быстрее,попробовал нагреть до 400 градусов защита сработала через 5 минут когда температура на дисплее упала до 75 градусов,заранее благодарю за ответ.

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

pter пишет:
но я нагрел паяльник до 100 градусов,отключаю паяльник

Так в этом случае температура не зависла, а падает. И падает тем медленнее, чем ближе к темп. окружающей среды, поэтому в конце остывания и срабатывает.

В вашем же случае должна отрабатывать предыдущая секция по падению температуры -

if (SPower > 0) {
                /* themperature falls */
                if (prev_t > GetSolderT && GetSolderT < SetSolderT) {
                    t_cnt++;
                    if (t_cnt == 10) {
                        SProtectionOut();
                        return 6;
                    }
                } else t_cnt = 0;
}

Смотрим условия - если текущая мощность больше 0 и предыдущая Т больше текущей Т и при этом Т менее заданной, то наращиваем счётчик. Сделайте после строки t_cnt++; вывод в сериал порт переменных prev_t, t_cnt и GetSolderT и наблюдайте, что там происходит приостывании.
Возможно, из-за того, что паяльник слишком медленно остывает, нужно поэкспериментить со временем (не 10 сек, а 3-5) или чуть поменять условие на "больше-равно"

 if (prev_t >= GetSolderT && GetSolderT < SetSolderT)
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

remell пишет:
Ребята, а вот в ардуинку нано пытаюсь залить скетч, и выгибает ошибку. ЭКРАН ПО i2C. Помогите плиз.

Копируйте сюда текст ошибки, иначе будете разбираться сами.

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

OlegK правильно я указываю вывод в порт

 Serial.print(prev_t);

Serial.print(t_cnt);

Serial.print(GetSolderT);

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

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

pter, попробуйте так (заменяйте целиком функцию защиты). Чуть подкорректировал и уменьшил время до 5 сек, у меня всё работает. Если нужно посмотреть в порт, то раскомментируйте вывод переменных.
 

/* Solder protection function */
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++;
					//Serial.print("Set: ");
					//Serial.println(SetSolderT);
					//Serial.print("Get: ");
					//Serial.println(GetSolderT);
					//Serial.print("Prev: ");
					//Serial.println(prev_t);
					//Serial.print("Count: ");
					//Serial.println(t_cnt);
					//Serial.println("---------");
                    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;
}

 

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

Здравствуйте,OlegK теперь защита не работает даже при комнатной температуре и чтобы выводились данные нужно раскоментировать сроку /* if you need to create themperature diagramm then uncomment it */,я это сделал,но данные выводятся только по нагреву и остыванию и можете выложить свой правленный скетч,заранее благодарю за ответ.

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

pter пишет:
защита не работает даже при комнатной температуре

Чудеса...
Вот целиком скетч. Защита срабатывает, если включить с отключённым нагревателем из холодного состояния или из нагретого, если тоже отключить нагрев. Проверил, во всех случаях срабатывает уверенно.
Ещё раз объясняю. Раскомментируйте дефайн NEED_GRAPH, плюс ещё раскомментируйте вывод в коде защиты.
Выводиться информация будет при выполнении условий 1-4:

1. Режим стабилизации не наступил или вышли из него.
2. Текущая температура менее заданной.
3. Мощность подаваемая на паяльник больше 0.
4. Каждая предыдущая (секунду назад) измеренная темп. ниже или равна текущей.
5. Пунктов 4 должно "насобираться" в счётчик 5 штук подряд, что бы сработала защита. Это нужно, что бы не срабатывало ложно и чётко определялось, что "мы греем-греем, а оно стоит или падает".
Будет выводиться в порт, в таком виде -
1;20
2;20
3;20
Set: 200
Get: 20
Prev: 20
Count: 1
---------
4;20
5;20
Set: 200
Get: 20
Prev: 20
Count: 2
---------
6;20
7;20
Set: 200
Get: 20
Prev: 20
Count: 3
---------
8;20
9;20
Set: 200
Get: 20
Prev: 20
Count: 4
---------
10;20
11;20
Set: 200
Get: 20
Prev: 20
Count: 5
---------

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

OlegK мне кажется защита у меня неработает так как я изменил вот эту строку

/* Solder P regulator */
void S_P() {
    int err = SetSolderT - GetSolderT;
    int TempPower = sKp * err;
    byte maxPower = 255;
    if (GetSolderT < 50) {
        maxPower = 100;    
    }  
    uint16_t SPower = constrain(TempPower, 0, maxPower);
    analogWrite(pinSolderPwm, SPower);
}

больше изменеий у меня нет и раскоментирована строка /* if used not rail-to-rail OPA, then uncomment it */.

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

pter пишет:
OlegK мне кажется защита у меня неработает так как я изменил вот эту строку

Мне вот интересно, нафига я скидывал скетч целиком? Вы видите разницу, между тем, как объявлена SPower в последнем скетче? Она должна быть глобальной.
А тут -

uint16_t SPower = constrain(TempPower, 0, maxPower);

Грузите скетч полностью, без изменений, а то так никогда не разобраться.

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

Если я не вношу это изменение у меня блок питания уходит в защиту,потомучто когда паяльник холодный при нагреве потребляет ток 6а.

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

Вот так тогда будет с "мягким" стартом.
 

void S_P() {
    int err = SetSolderT - GetSolderT;
    int TempPower = sKp * err;
    byte maxPower = 255;
    if (GetSolderT < 50) {
        maxPower = 100;    
    }  
    SPower = constrain(TempPower, 0, maxPower); //SPower - глобальная!
    analogWrite(pinSolderPwm, SPower);
}
pter
Offline
Зарегистрирован: 15.02.2016

Большое спасибо за помощь защита работает ошибка(I6),пошел дальше тестировать и еще один вопрос в этот проект вы будете добавлять калибровку как в проекте контроллер паяльного фена,заранее благодарю за ответ.

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

pter пишет:
калибровку как в проекте контроллер паяльного фена

Ещё не знаю, может позже, т.к. все эти фены подзадолбали уже, неинтересно и охота чем-то иным позаниматься.