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

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

Температуру выставил на 300 градусов.

Вот чего написало:

1;28
30.00
30.00
30.00
30.00
30.00
2;27
30.00
30.00
30.00
30.00
30.00
3;28
30.00
30.00
30.00
30.00
30.00
4;32
30.00
30.00
30.00
30.00
30.00
5;38
30.00
30.00
30.00
30.00
30.00
6;46
30.00
30.00
30.00
30.00
30.00
7;57
30.00
30.00
30.00
30.00
30.00
8;69
30.00
30.00
30.00
30.00
30.00
9;83
30.00
30.00
30.00
30.00
30.00
10;97
30.00
30.00
30.00
30.00
30.00
11;111
30.00
30.00
30.00
30.00
30.00
12;125
30.00
30.00
30.00
30.00
30.00
13;139
30.00
30.00
30.00
30.00
30.00
14;152
30.00
30.00
30.00
30.00
30.00
15;165
30.00
30.00
30.00
30.00
30.00
16;178
30.00
30.00
30.00
30.00
30.00
17;190
30.00
30.00
30.00
30.00
30.00
18;202
30.00
30.00
30.00
30.00
30.00
19;213
30.00
30.00
30.00
30.00
30.00
20;224
30.00
30.00
30.00
30.00
30.00
21;234
30.00
30.00
30.00
30.00
30.00
22;244
30.00
30.00
30.00
30.00
30.00
23;254
30.00
30.00
30.00
30.00
30.00
24;262
30.00
30.00
30.00
29.00
29.14
25;271
25.29
24.42
22.53
21.64
21.75
26;279
17.85
16.94
15.02
14.09
14.15
27;287
11.22
10.27
8.31
7.35
7.38
28;294
4.41
3.43
2.44
1.44
1.44
29;300
0.00
0.00
0.00
0.00
0.00
30;305
0.00
0.00
0.00
0.00
0.00
31;310
0.00
0.00
0.00
0.00
0.00
32;315
0.00
0.00
0.00
0.00
0.00
33;318
0.00
0.00
0.00
0.00
0.00
34;322
0.00
0.00
0.00
0.00
0.00
35;325
0.00
0.00
0.00
0.00
0.00
36;327
0.00
0.00
0.00
0.00
0.00
37;330
0.00
0.00
0.00
0.00
0.00
38;332
0.00
0.00
0.00
0.00
0.00
39;334
0.00
0.00
0.00
0.00
0.00
40;336
0.00
0.00
0.00
0.00
0.00
41;337
0.00
0.00
0.00
0.00
0.00
42;339
0.00
0.00
0.00
0.00
0.00
43;341
0.00
0.00
0.00
0.00
44;341
0.00
0.00
0.00
0.00
0.00
45;343
0.00
0.00
0.00
0.00
0.00
46;344
0.00
0.00
0.00
0.00
0.00
47;345
0.00
0.00
0.00
0.00
0.00
48;346
0.00
 
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Т.е. после 346 град. продолжает ползти температура вверх?
Начиная с 300 град, вижу, что мощность равна 0.00, т.е. симистором никто не управляет и он должен быть закрыт.
Так и должно быть. Симистор чудит, что ли, иначе откуда нагреву взяться?
Возможен, конечно, выброс перерегулирования вверх, при достижении заданной температуры, но не столько, и затем температура должна снижаться.

ЗЫ. Такие длинные логи лучше в спойлер пихать - устанешь проматывать ))

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

Про ЛОГ я понял. Про симистор тоже.  Да, температура растет. Завтра буду менять семистор и смотреть обвязку. В скайп не стукните? :)))

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

Umkalab пишет:
В скайп не стукните? :)))

Если только в текстовом режиме - нет камеры и микрофона. Просто пользуюсь обычно телефоном ))

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

Более чем достаточно. 

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

Umkalab пишет:
Завтра буду менять семистор и смотреть обвязку.

Убедиться бы ещё, что при Power = 0 и импульсы управления не идут на оптосимистор.

В скайп стукну, только сперва скачаю его ))

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

OlegK пишет:

Убедиться бы ещё, что при Power = 0 и импульсы управления не идут на оптосимистор.

Сейчас частотомером гляну...

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

Частотомер говорит 100Гц с начала, далее частота падает. Светодиод на ноги D8 и GND говорит то-же самое. Импульсы прекращаются после набора температуры. Скорее всего дохлый симистор. Не закрывается видимо...

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

Umkalab пишет:
Скорее всего дохлый симистор. Не закрывается видимо...

Скорее всего.

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

Решил свою проблему. Ребята, убедительная просьба: Никогда не подключайте 5 ногу MOC302X к 4-й или 6-й, даже если на ней написано NC. Геморой тот ещё...

Где-то в этой теме я читал про то что при большой разнице между текущей и вновь измененной температурой фена, станция впадает в [!].

У меня сейчас такая ситуация: 250 набирает смело, но медленно. До 200 быстро. До 350 делает так:

1) Идет набор до ~240

2) Мееееедленно позет вверх по градусам

3) За 1 минуту работы доползает до 290

4) Доползла до 300 и в защиту

Температура настроена. Что из сопла то и на калибровочном термометре.

Сейчас даже до 300 не дошла. Вырубилась на 270. 

Сейчас провел опыты небольшие с постепенным набором температуры. Отключилась на 315.

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

Добрый вечер, нашел 2 штуки OMI-SS-212DM , с 6 контактами как на изображении, подскажите можно его запихнуть вместо 2х реле которые стоят в схеме, насколько я понял мое 2х канальное  или нужна именно 2 одноканальных, az8-1ch-24dea не могу найти на али ? Спасибо

 

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

Umkalab пишет:
при большой разнице между текущей и вновь измененной температурой фена, станция впадает в [!].

В последней версии это закомментировано и не работает. Только мо макс-мин (обрыв/кз ТП).

Цитата:
Отключилась на 315.

Закомментируйте, для пробы, в процедуре WorkWithHotAir() кусок кода между комментариями
/* Additional protection, if the temperature is not changed within 3 secs */
и
/* Turn ON relay */
Только строку

uint16_t delta = ABS(SetHotAirT, GetHotAirT);

не комментируйте, она нужна ниже.

Скорее всего защита срабатывает из-за медленного набора температуры.

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

integral = 0;

А что бы пошустрее набирало при высоких и не сильно перерегулировало при низких, то замените процедуру HA_PI() на чуть доработанную -

void HA_PI() {
    int err = SetT - GetT;
    float tmp_power = ((Kp * err) + (Ki * integral));
    float max_power = 50;
    if (SetT < 200) max_power = 30;
    if (tmp_power < max_power && tmp_power > 0.0) integral += err;
    HApower = constrain(tmp_power, 0.0, max_power);
    CalctImpulseControl();
}

ЗЫ. В скайп стукнул - тишина.

snake9x пишет:
или нужна именно 2 одноканальных

Нужны два одиночных реле. Я свои выдрал из дохлой автосигнализации, поэтому и использовал 12-вольтовые.
Вроде похожие на эти. Недавно на али брал такие, на 24 вольта, распиновка совпадает, по размеру, вроде чуть меньше, нужно померять.

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

Отдельная тема "про фен" - тут.

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

Пардон. Уже в кровати. Половина первого. Завтра на работе буду, обязательно спишемся.

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

Umkalab пишет:
Завтра на работе буду, обязательно спишемся.

Только если вечером. На моей работе не спишешься ))

usverX
Offline
Зарегистрирован: 24.08.2016

OlegK, можно ли в качестве резисторов на 39 Ом и 240кОм взять вот такие:

https://www.chipdip.ru/product0/9000190239 

Смущает "Макс.рабочее напряжение,В     250"

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

usverX пишет:
Смущает "Макс.рабочее напряжение,В     250"

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

usverX
Offline
Зарегистрирован: 24.08.2016

OlegK пишет:

usverX пишет:
Смущает "Макс.рабочее напряжение,В     250"

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

с 240кОм проблемы нет, 2 по 120 кОм, а вот с 39Ом... 2 по 20Ом? некритично?

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

usverX пишет:
2 по 20Ом? некритично?

Абсолютно некритично.

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

ЗЫ. При использовании СМД при высоких напряжениях учитывайте зазор между точками с разными потенциалами. Что бы не пробило, в общем. Для справки вот.

usverX
Offline
Зарегистрирован: 24.08.2016

OlegK пишет:

ЗЫ. При использовании СМД при высоких напряжениях учитывайте зазор между точками с разными потенциалами. Что бы не пробило, в общем. Для справки вот.

о как, учту, спасибо. И проводники на плате в 3 мм в силовой цепи тоже нужно бы не забыть...

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

Изменил только процедуру. Все стало работать корректно. Но все равно иногда в защиту уходит...

/* HotAir PI regulator */

//void HA_PI() {
//    int err = SetHotAirT - GetHotAirT;
//    float TempPower = ((Kp * err) + (Ki * integral));
//    if (TempPower < 30.0 && TempPower > 0.0) integral += err;
//    HAPower = constrain(TempPower, 0.0, 30.0);
//    Serial.println(HAPower);
//    CalctImpulseControl();
//}

void HA_PI() {
    int err = SetHotAirT - GetHotAirT;
    float MaxPower = 50;
    float TempPower = ((Kp * err) + (Ki * integral));
    if (SetHotAirT < 200) MaxPower = 30;
    if (TempPower < MaxPower && TempPower > 0.0) integral += err;
    HAPower = constrain(TempPower, 0.0, MaxPower);
    CalctImpulseControl();
}

usverX
Offline
Зарегистрирован: 24.08.2016

OlegK пишет:

ЗЫ. При использовании СМД 

посидел порисовал дорожки которые в результате вышли толще конденсаторов (брал 0805) плюнул и заказал в ЧиД (не реклама ибо с ценами там ппц) нормальные выводные резисторы и конденсаторы в управляющие цепи...

рисую под них черновой вариант (надеюсь угадать с размерами деталей) и возникает вопрос:

вот по этой схеме

по красному пути пойдет ток до 5А (если не прав то поправьте, пожалуйста) а какие токи пойдут по синему и зеленому путям?

Да и правильно ли я проложил пути тока на схеме?

P.S. Еще раз прошу простить за достаточно детские вопросы, раньше собирал все модулями. Пока разбираюсь с ПС уже изучил больше теории чем знал раньше... один eagle почти месяц вертел пока более-менее разобрался

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

У меня все силовые дороги шириной 2мм. Но платы я делаю не с маской. Всю силу я по верху проливаю оловом равномерно. Как-то так...

Синюю и красную дорисуй до С8 и С6. Там сила тоже нужна. Да и R7 и С4 тоже закрась.

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

usverX
Offline
Зарегистрирован: 24.08.2016

Umkalab пишет:

платы я делаю не с маской

Синюю и красную дорисуй до С8 и С6. Там сила тоже нужна. Да и R7 и С4 тоже закрась.

до маски мне как до марса, это вообще первое травление будет. интересно с какого раза выйдет?)

а по цветным дорогам: там напряжение роли не играет (в  ширине дорожки) , важна сила тока. по синему пути пойдет ток для вентилятора фена, он там не большой. по зеленому нареватель фена ток больше, но никак не 4А (дорожка в 2мм стандартной толщины), ну не очень уверен, но 4Ах220В=880 ватт многовато для него

красная дорожка тут ток самый большой будет, на старте нагрева около 6А вроде в теме писали.

про дорисовать: исхожу из того что тока через диод и конденсаторы (синяя и красная) в нормальном режиме не будет. А вот R7 и C4 наверное соглашусь с вами.

Возможно, все написаное мною неверно. "я не волшебник, я только учусь")

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

Потестил сегодня свою "пятиэтажку"... Заметил одну интересную особенность. Если задать температуру до 350 градусов, то фен без напрягов набирает и держит ее. Если дать около 370, станция набирает температуру, начинает стабилизироваться на заданом значении и уходит в защиту. Странно как то. 

Закомментируйте, для пробы, в процедуре WorkWithHotAir() кусок кода между комментариями
/* Additional protection, if the temperature is not changed within 3 secs */
и
/* Turn ON relay */
Только строку

1 uint16_t delta = ABS(SetHotAirT, GetHotAirT);

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

 

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

1 integral = 0;

Тут немного не допёр... Извиняйте. С коддингом у меня: -3

 

ЗЫ: В скайпе топикстартера не увидел. Имя пользователя в Skype = имени пользователя на форуме;

 

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

usverX пишет:
по красному пути пойдет ток до 5А (если не прав то поправьте, пожалуйста) а какие токи пойдут по синему и зеленому путям?

Красный путь - нагреватель паяльника, сопротивление холодного нагревателя при комнатной температуре ~2.5-3.5 ом, при нагреве увеличивается. Значит, ток через холодный нагреватель при 24В питании какой будет? Непродолжительное время, конечно, но нужно всегда рассчитывать с запасом, что бы дорожки не превращались в предохранители...

Синий - вентилятор фена. На вентиляторе написано 0,25А.
Зелёный - нагреватель фена. Указана мощность (насколько помню) 700 ватт. Делите на 220. Также, не постоянного потребления, только при разогреве.

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

Umkalab пишет:
Пробовал делать по Вашей подсказке. Повылазила куча ошибок при компиляции и я забросил эту идею.

Попробуйте сперва это залить.

Цитата:
Имя пользователя в Skype = имени пользователя на форуме

Вчера в 19:45. Вбил ник, высветился Михаил Б. Отправил запрос. Тишина.

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

"Это" - обязательно попробую. Только завтра.

Повторите запрос пожалуйста.

usverX
Offline
Зарегистрирован: 24.08.2016

OlegK пишет:

Красный путь - нагреватель паяльника, сопротивление холодного нагревателя при комнатной температуре ~2.5-3.5 ом, при нагреве увеличивается. Значит, ток через холодный нагреватель при 24В питании какой будет? 

9,6А будет. по калькуляторам ширина дорожки должна быть 6,8мм, тут проблема в том что мосфет который я взял имеет растояние между крайними контактами 6 мм. В общм решил не выкаблучиваться и довериться практике (сделать как Umkalab говорил, дорожки по 2мм и залудить их, там где паяльник пожирнее)

kupsw
Offline
Зарегистрирован: 25.03.2016

Вчера наконец то дождался подстроечники и стал настраивать станцию. Прошивку залил вер 1.2. Начал с канала паяльника. Регулируется и настраивается все нормально. Правда при включении паяльника температура на жале по измерительному термометру растет медленнее чем на термопаре паяльника. И настроить это не получается. И еще выставляю например температуру 160 и включаю паяльник. На индикаторе измеренная температура растет и пакозывается 170-172 после может падать до 160, а может появиться [!]. Нажимаю на кнопку выключения паяльника без длительного удержания. [!] исчезает и далее температура держится 160 на ингдикаторе и на измерительном термометре. Что это такое? Может кто подскажет. Или я не правильно отрегулировал канал. Операционник LM358.

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

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

Эта строчка в начале скетча разкомментирована?

У меня кстати тоже наблюдается подобная беда. Паяльник начинал калибровать только когда прогреется, ~ 1 минуту времени после установки температуры. Наплавлял олово на жало и подтыкал термопару прям в олово.

[!] - это защита. Чего-то программе не нравиться в данных поступаемых с операционника.

kupsw
Offline
Зарегистрирован: 25.03.2016

Строка разкоментирована. К стати в старой версии (Вер. 1.1) такого не замечал.

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

kupsw пишет:
Правда при включении паяльника температура на жале по измерительному термометру растет медленнее чем на термопаре паяльника. И настроить это не получается.

Как вы представляете себе настроить инерционность передачи температуры, да ещё и при наличии воздушного зазора между жалом и нагревателем? Даже при устоявшейся температуре жала и совпадении её с температурой термодатчика внутри нагревателя, при касании места пайки, температура жала может очень и очень сильно отличаться. Т.е. температура жала уже упала градусов на 10-30, а внутренний термодатчик этого не видит из-за воздушного зазора жало-нагреватель. В этом плане, картриджи Т12 более совершенны.

Цитата:
И еще выставляю например температуру 160 и включаю паяльник. На индикаторе измеренная температура растет и пакозывается 170-172 после может падать до 160, а может появиться [!].

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

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

Срочное критическое замечание для всех версий.
Закомментируйте в процедурах SolderOff() и HotAirOff() строки с MemSolder() и MemHotAir(), соответственно.
Проглядел я, однако, что постоянно пишется в EEPROM, если канал выключен. "Запоминалки" можно перенести чуть выше, под скобку, что бы при защите запоминалось или вообще убрать, тогда запоминаться будет только при ручном выключении или по таймеру.
Доработка ниже (в шапке и в пред. сообщении доработано) -

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

/* HotAir full off */
void HotAirOff() {
    D8_Low;
    delay_ms(30);
    D7_Low;
    if (HA_PROT) {
        HA_PROT = false;
        Beep(1000);
        MemHotAir();
    }
}

 

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

OlegK пишет:

Срочное критическое замечание для всех версий:

Добавлена поддержка энкодера по схеме из поста #870 и схемой подключения из поста #877

Управление осуществляется так:

Короткое нажатие на энкодер - выбор режима

Длительное нажатие на энкодер - включение/отключение режима

Шаг по часовой - увеличение выбранного значения

Шаг против часовой - уменьшение выбранного режима

Сброс счетчиков "до отключения" осуществляется концевиками фена и паяльника

 

Новости моей мечты... Эх...

Sylon
Offline
Зарегистрирован: 20.09.2016

OlegK пишет:

Срочное критическое замечание для всех версий....

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

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

Качайте это:  https://yadi.sk/d/wiaeqQOsrPv86

Тут всё уже исправленно

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

Sylon пишет:
что ещё менялось? или просто косметика и оптимизация?

Фактически, всё началось с "изобретения" защит. Я их вынес в отдельную функцию, возвращающую код ошибки, т.к. их получилось около 5 штук и что бы не гадать о причине срабатывания. Планировалось выводить код (номер) ошибки вместо [!]. Что-то, вроде получилось, что-то не очень, но в один момент компилятор послал меня в лес, сказав, что память в 168-й Атмеге не резиновая. Вернул всё "взад" и прошерстил, до кучи, код, поудалял лишние переменные и кое-что немного изменил. В процессе и заметил, что при выключенном канале постоянно выполняется запоминание уставок. Этот косяк с самой первой версии, оказывается там был...
В общем, дико ай эм сорри, если чо ))

ЗЫ. Процедура HA_PI() там в двух версиях, одна закомментирована. Последняя, типа, с "адаптивным" ограничителем максимальной мощности при наборе Т. Как бы, низкая заданная Т - небольшая мощность, высокая - соответственно. Преследовалась цель уменьшить выброс при малых Т и ускорить набор на высоких. Графики получились такие (можно сравнить с графиками в шапке), но нужно ещё поэкспериментить, поэтому и закомменчена -

Sylon
Offline
Зарегистрирован: 20.09.2016

Sylon пишет:

OlegK пишет:

Срочное критическое замечание для всех версий....

... или просто косметика и оптимизация?

К примеру... для LCD библиотеки заменено init на begin, и файл сразу выдал ошибку, библиотека не понимает, знач нужна другая, зачем?

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

Подскажите пожалуйста, как связать это: 

/* Encoder button */

    if (Enc_Button.update()) {
        if (Enc_Button.rose()) {
            Beep(20);
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = true;
        } else {
            if (Enc_ButtonState) {
                (selectedMode == mode_temp) ? (selectedMode = mode_rpm) : (selectedMode = mode_temp);
            }
            Enc_ButtonState = false;
        }
    }

    if  (Enc_ButtonState) {
        if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = false;
            if (state > st_stop) {
                state = st_stop;
                needCool = true;
                Beep(200);
            } else {
                state = st_work;
                Graph_count = 0;
                integral = 0;
                needBeep = true;
                HA_PROT = true;
                prevHAcontrol = millis();
                Beep(20);
            }
        }
    }
}



/* Encoder interrrupt */

ISR(PCINT1_vect) {
    if (!(PINC & (1 << PC2))) {
        if (!D15_Read) {
            switch (selectedMode) {
            case mode_temp:
                (SetT < max_hotair_temp) ? (SetT += 5) : (SetT = max_hotair_temp);
                break;
            case mode_rpm:
                (SetRPM < max_rpm) ? (SetRPM += 5) : (SetRPM = max_rpm);
                break;
            }
        } else {
            switch (selectedMode) {
            case mode_temp:
                (SetT > min_hotair_temp) ? (SetT -= 5) : (SetT = min_hotair_temp);
                break;
            case mode_rpm:
                (SetRPM > min_rpm) ? (SetRPM -= 5) : (SetRPM = min_rpm);
                break;
            }
        }
        needBeep = true;
        integral = 0;
        prevHAcontrol = millis();
    }
}

С этим:

/* Scan buttons */

void ScanButtons() {
    /* Solder "on-off" button */
    if (SolderOnButton.update()) {
        if (SolderOnButton.read()) {
            SONbuttonState = false;
        } else {
            if (!SolderON) {
                SolderON = true;
                SolderProtect = false;
                prevSmillis = millis();
                ActivateScountdown();
                Graph_count = 0;
                selectedMode = modeSolder;
                SneedBeep = true;
            } else {
                ResetScountdown();
            }
            SONbuttonState = true;
            SONbuttonPressTime = millis();
            Beep(20);
        }
    }

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

    /* HotAir "on-off" button */

    if (HotAirOnButton.update()) {
        if (HotAirOnButton.read()) {
            HAONbuttonState = false;
        } else {
            if (!HotAirON) {
                HotAirON = true;
                HotAirProtect = false;
                prevHAmillis = millis();
                ActivateHAcountdown();
                Graph_count = 0;
                integral = 0;
                selectedMode = modeHotAir;
                HAneedBeep = true;
                needCool = true;
            } else {
                ResetHAcountdown();
            }
            HAONbuttonState = true;
            HAONbuttonPressTime = millis();
            Beep(20);
        }
    }

    if  (HAONbuttonState) {
        if ( millis() - HAONbuttonPressTime >= 1000 ) {
            HAONbuttonPressTime = millis();
            if (HotAirON) {
                HotAirON = false;
                MemHotAir();
                Beep(200);
            }
        }
    }

    /* Select button */

    SelButton.update();
    if (SelButton.fell()) {
        Beep(20);
        (selectedMode < modeFanPWM) ? (selectedMode++) : (selectedMode = modeSolder);
    }

    if (UpButton.update()) {
        if (UpButton.read()) {
            UPbuttonState = false;
        } else {
            switch (selectedMode) {
            case modeSolder:
                if (SetSolderT < max_solder_temp) {
                    SetSolderT += 5;
                }
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                if (SetHotAirT < max_hotair_temp) {
                    SetHotAirT += 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                if (SetHotAirRPM < max_rpm) {
                    SetHotAirRPM += 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }

            UPbuttonState = true;
            UPbuttonPressTime = millis();
            Beep(20);
        }
    }

    /* UP button */

    if  (UPbuttonState) {
        if ( millis() - UPbuttonPressTime >= 300 ) {
            UPbuttonPressTime = millis();
            switch (selectedMode) {
            case modeSolder:
                SetSolderT += 10;
                if (SetSolderT > max_solder_temp) SetSolderT = max_solder_temp;
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                SetHotAirT += 10;
                if (SetHotAirT > max_hotair_temp) SetHotAirT = max_hotair_temp;
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                SetHotAirRPM += 10;
                if (SetHotAirRPM > max_rpm) SetHotAirRPM = max_rpm;
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }
        }
    }

    /* Down button */

    if (DwnButton.update()) {
        if (DwnButton.read()) {
            DWNbuttonState = false;
        } else {
            switch (selectedMode) {
            case modeSolder:
                if (SetSolderT > min_solder_temp) {
                    SetSolderT -= 5;
                }
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                if (SetHotAirT > min_hotair_temp) {
                    SetHotAirT -= 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                if (SetHotAirRPM > min_rpm) {
                    SetHotAirRPM -= 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }
            DWNbuttonState = true;
            DWNbuttonPressTime = millis();
            Beep(20);
        }
    }

    if  (DWNbuttonState) {
        if ( millis() - DWNbuttonPressTime >= 300 ) {
            DWNbuttonPressTime = millis();
            switch (selectedMode) {
            case modeSolder:
                SetSolderT -= 10;
                if (SetSolderT < min_solder_temp) SetSolderT = min_solder_temp;
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                SetHotAirT -= 10;
                if (SetHotAirT < min_hotair_temp) SetHotAirT = min_hotair_temp;
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                SetHotAirRPM -= 10;
                if (SetHotAirRPM < min_rpm) SetHotAirRPM = min_rpm;
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }
        }
    }
}

Чтобы было хорошо... 

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

Sylon пишет:
К примеру... для LCD библиотеки заменено init на begin, и файл сразу выдал ошибку, библиотека не понимает, знач нужна другая, зачем?

Потому, что дисплей в проекте "просто фен" со старой библой не работал. Скачал с ГитХаба новую - тоже выдало ошибку, как оказалось, разница в инициализации дисплея. Новая библа работает в обоих проектах. В принципе, всё. Вот, что забыл, сейчас обновлю в архиве библиотеку для дисплея.

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

Потихонечку доезжаю:



/* Encoder interrrupt */

ISR(PCINT1_vect) {
    if (!(PINC & (1 << PC2))) {
        if (!D15_Read) {
            switch (selectedMode) {

            case modeSolder:
                if (SetSolderT < max_solder_temp) {
                    SetSolderT += 5;
                }
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                if (SetHotAirT < max_hotair_temp) {
                    SetHotAirT += 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                if (SetHotAirRPM < max_rpm) {
                    SetHotAirRPM += 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }
        }   
     else {
           switch (selectedMode) {

           case modeSolder:
                if (SetSolderT > min_solder_temp) {
                    SetSolderT -= 5;
                }
                SneedBeep = true;
                ResetScountdown();
                break;

            case modeHotAir:
                if (SetHotAirT > min_hotair_temp) {
                    SetHotAirT -= 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;

            case modeFanPWM:
                if (SetHotAirRPM > min_rpm) {
                    SetHotAirRPM -= 5;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }             
          }
        }
        needBeep = true;
        integral = 0;
        prevHAcontrol = millis();
    }
OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Библиотеку в архиве обновил. Старая LiquidCrystal_I2C1602V1 удалена. Заодно LCD.init на LCD.begin исправил.

Miamin
Offline
Зарегистрирован: 29.02.2016

В какой версии Arduino собираете? А та были проблемы отображения по i2c из за версии arduino.

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

1.6.5

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

К Атмел Студии подключена 1.6.5 и с дисплеем ПС работала нормально. В ней же компилю с этой же библой для дисплея 1602 проекта для фена - фигвам, не все символы отображаются. С новой библой, в той же 1.6.5, всё нормально с обоими дисплеями.
Есть ещё 1.6.7 версия. Более новыми не пользуюсь.

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

OlegK, свяжите пожалуйста вот это:


    if  (Enc_ButtonState) {
        if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = false;

            if (state > st_stop) {
                state = st_stop;
                needCool = true;
                Beep(200);
            } else {
                state = st_work;
                Graph_count = 0;
                integral = 0;
                needBeep = true;
                HA_PROT = true;
                prevHAcontrol = millis();
                Beep(20);
            }
        }
    }

Вот с этим:

/* Solder "on-off" button */

    if (SolderOnButton.update()) {
        if (SolderOnButton.read()) {

            SONbuttonState = false;
        } else {
            if (!SolderON) {
                SolderON = true;
                SolderProtect = false;
                prevSmillis = millis();
                ActivateScountdown();
                Graph_count = 0;
                selectedMode = modeSolder;
                SneedBeep = true;
            } else {
                ResetScountdown();
            }
            SONbuttonState = true;
            SONbuttonPressTime = millis();
            Beep(20);
        }
    }

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



/* HotAir "on-off" button */

    if (HotAirOnButton.update()) {
        if (HotAirOnButton.read()) {
            HAONbuttonState = false;
        } else {
            if (!HotAirON) {
                HotAirON = true;
                HotAirProtect = false;
                prevHAmillis = millis();
                ActivateHAcountdown();
                Graph_count = 0;
                integral = 0;
                selectedMode = modeHotAir;
                HAneedBeep = true;
                needCool = true;
            } else {
                ResetHAcountdown();
            }
            HAONbuttonState = true;
            HAONbuttonPressTime = millis();
            Beep(20);
        }
    }

    if  (HAONbuttonState) {
        if ( millis() - HAONbuttonPressTime >= 1000 ) {
            HAONbuttonPressTime = millis();
            if (HotAirON) {
                HotAirON = false;
                MemHotAir();
                Beep(200);
            }
        }
    }

Я вижу что мне осталось немного... Прошу Вас помочь мне в осуществлении моей задачи. 

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

Вот чесслово, некогда - на работу сегодня в ночь идти. Накидал навскидку, не проверял. Как-то так -
 


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

А вот так не пойдет? 

/* 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;
      } else {
            if (!SolderON) {
                SolderON = true;
                SolderProtect = false;
                prevSmillis = millis();
                ActivateScountdown();
                Graph_count = 0;
                selectedMode = modeSolder;
                SneedBeep = true;
      } else {
                ResetScountdown();
             }
            Enc_ButtonState = true;
            Enc_ButtonPressTime = millis();
            Beep(20);
        }
    }

    if  (Enc_ButtonState) {
        if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            if (SolderON) {
                SolderON = false;
                MemSolder();
                Beep(200);

             }
           }
         }

if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            Enc_ButtonState = false;
      } else {
            if (!HotAirON) {
                HotAirON = true;
                HotAirProtect = false;
                prevHAmillis = millis();
                ActivateHAcountdown();
                Graph_count = 0;
                integral = 0;
                selectedMode = modeHotAir;
                HAneedBeep = true;
                needCool = true;
            } else {
                ResetHAcountdown();
            }
            Enc_ButtonState = true;
            Enc_ButtonPressTime = millis();
            Beep(20);
        }
    
    if  (Enc_ButtonState) {
        if ( millis() - Enc_ButtonPressTime >= 1000 ) {
            Enc_ButtonPressTime = millis();
            if (HotAirON) {
                HotAirON = false;
                MemHotAir();
                Beep(200);

             }
           }
         }
}