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

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

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

 

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

Нашел проблему!) По своей не внимательности в скетче прерывание 1 включил на пин 3, на плате развел для 0. А на этом пине управляется мотор фена. И получалось что прерывание срабатывала из зи шим ! Когда выкручивались обороты на полную спады напряжений прикращялись и прерывания не срабатывали, поэтому сбрасывались температура. ) И в условии прерывания изменил срабатывания с высокого на низкий.

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

Miamin пишет:
Нашел проблему!

Ну и гуд.

Geo_l
Offline
Зарегистрирован: 23.03.2016

OlegK, здравствуйте.

 

Не нашел в вашем архиве схемы подключения ардуины к датчикам и схеме POWER.

Если можно, ткните пальцем, где искать, или хотя бы табличку пинов.

И какая марка дисплея?

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

Geo_l посмотрите в sprint -layout там все показано.

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

Да, в спринте я практически всё подписал -
разъём "Ус термодатчиков" - сюда цепляется плата усилителей на ОУ.
разъём "концевики" - сюда подключается геркон фена и "хвост" подставки паяльника. Ранее сюда подключалась микросхема
преобразователя сигнала термопары, но я от неё отказался в пользу более скоростного решения.

Дисплей WH2004, 20 символов х 4 строки,
я брал именно такой, тут 

Очень яркий и хорошо читаемый под углами дисплей.
К нему ещё потребуется плата, для подключения через I2C-шину.
Плата такая
 

Geo_l
Offline
Зарегистрирован: 23.03.2016

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

А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе, инвертировав соответствующий сигнал. И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?

И еще. 4-е выводы оптопар лучше подключить к плюсовому выводу конденсатора С1 и резисторы R4 и R8 увеличить до 10к. Это позволит снизить падение напряжения на открытых транзисторах ШИМ.

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

>>А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе
Защита больше предназначена от пробоя управляющего элемента, когда его отключение ничего не даст. В канале паяльника, наверное, можно убрать реле (не попадалось слуучаев самовозгорания паяльников, если управляется полевиком, но для фена я бы на защите не экономил.
Что бы не случилось вот так -

или вот так, как на видео.
Вот ещё...
Хотя, многие эксплуатируют вообще безо всяких защит...

>>И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?
Нет, тогда фазоимпульсное управление не будет работать. Нужно будет переделывать регулирование.

 

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK добрый день

Понравилась ваша разработка, планирую повторить, у меня в хозяйстве много дисплеев 1602 сразу с шиной i2c (под адрес 0x27), можете под мой дисплей переделать скетч вывод информации!? (привожу пример как это может выглядеть)

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

Sergant пишет:
под мой дисплей переделать скетч вывод информации!?

Не вижу особых трудностей, кроме, как то, что в строке меньше символов - 16, вместо 20, а значит, чем-то придётся пожертвовать, что бы влезло. К примеру, сочетанием "градусы цельсия" - два символа.
Ну и, читабельность дисплея, думается, упадёт без оформительских "плюшек".
Для начала, рисуете на листке строку на 16 знакомест и заполняете её.
Для паяльника это может выглядеть так -
S:ZZ_XXX_YYY
(использовано 12 символов, где ZZ - значение таймера паяльника или фена, XXX - заданная температура, YYY - текущая температура, "_" - условно показаны пробелы).

Для фена тоже самое, плюс значение скорости вентилятора MM -
H:ZZ_XXX_YYY__MM

Как вариант, убрать, нафиг, и буквы в начале, тогда будет как-то так -
ZZ_XXX'_YYY'
ZZ_XXX'_YYY'_MM%
Что кажется мне более подходящим результатом.

Учитывая, что статичных (которые не должны меняться) надписей тут практически не будет, то можно совместить в одной две процедуры initDisplay() и DisplayUpdate() и выводить, с учётом координат вашего дисплея и того, что первая строка и первый символ в строке имеют индекс 0.

Ну и заполняете дисплей, с учётом ваших значений позиций. Можете отдельный временный проект наскоро сделать, чисто для отладки вывода.

Можно ещё применить два индикатора, повесив их под разными адресами (задаётся на плате-переходнике I2C) и выводить раздельно, для паяльника и фена, но это так себе вариант - не компактный нифига, да и ширину строки до 20 символов это не увеличит ))

 

 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

Спасибо, за пояснения, думаю справлюсь, хотя с ардуино начал мастерить 2 месяца назад загорелся интеллектуальной зарядкой (https://www.drive2.ru/b/2652964/) сделал понравилось и затянуло.

Поэтому в идеале если подскажите в каких строчка кода играться, то буду благодарен (сам язык ардуино не знаю, но местами править могу :)

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

Я ж выше подсказал - откройте мой исходник, и найдите там две процедуры - initDisplay() и DisplayUpdate()

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

Т.е. сперва "чистите" весь экран

lcd.clear();

затем выводите что-нибудь, к примеру, начиная с 4 символа первой строки -

lcd.setCursor(3, 0); //не забываем, что отсчёт начинается с 0 индекса
lcd.print("666");

Ну и процедуру Splash() удаляете или редактируйте под свой экран - она выводит "приветствие" при старте станции.

Для простоты, сделайте отдельный проект, где потренируйтесь выводить какие-нибудь числа в нужные вам позиции. Когда придёт понимание того, что делаете, можно будет исправить и код станции.

Sergant
Offline
Зарегистрирован: 24.03.2016

Спасибо поэксперементирую, позже отпишусь. Вместо транформатора заказал импульсник 24V, 4-6A, теперь хочу понять как в этом случае упрощается схема Power? что убрать? 9 вольт видимо сделаю через понижающий модуль DC- DC запитаю от импульсника

Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос? (помогите) выпаивать реле не хочется :)

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

Sergant пишет:
что убрать?

Диодные мосты.

Цитата:

Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос?

Релейный модуль уже имеет на борту оптопары, поэтому можно его подключить напрямую к "дуине", не запаивая на силовую плату те компоненты, которые относятся к реле - оптроны, транзисторы, диоды. Контакты реле, соответственно тоже нужно не забыть подключить в цепи нагревателей.

Работать будет, но получится не компактно и проводов лишних добавится.

Схему модуля (один канал) можно глянуть тут.

Sergant
Offline
Зарегистрирован: 24.03.2016

Подправил код под свой дисплей, конечно не товарный вид, но мне не на продажу, а для себя :) приветсвие сократил чтобы влазило. Fan вместо 100% сделал 99%  S:=Soldier, A:=HotAir

1) У вас переход знака установки ">" идет циклично снизу-вверх, будет ли он корректно переходить на установку скорости вентилятора ?

2) Ранее вы писали про занчение ZZ -  таймера паяльника или фена, видимо я про них забыл? или не увидел где выводится.

Ниже выкладываю код:

/* Update LCD */
void DisplayUpdate() {
    lcd.setCursor(2, 0);
    lcd.print(bspace);
    lcd.setCursor(3, 0); //было 7.1
    if (SolderProtect) {
        lcd.print("[!]");
    } else if (SolderON) {
        lcd.print(Scountdown);
    }

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

    lcd.setCursor(7, 0);
    lcd.print(bspace);
    lcd.setCursor(8, 0);
    if (GetSolderT > 505 && !SolderON) {
        lcd.print("---");
    } else {
        lcd.print(GetSolderT);
    }

    lcd.write((byte)0);

    lcd.setCursor(2, 1);
    lcd.print(bspace);
    lcd.setCursor(3, 1);
    if (HotAirProtect) {
        lcd.print("[!]");
    } else if (HotAirON) {
        lcd.print(HAcountdown);
    }

    lcd.setCursor(2, 1);
    lcd.print(bspace);
    lcd.setCursor(3, 1);
    lcd.print(SetHotAirT);
    lcd.write((byte)0);

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

    if (GetHotAirT > 505 && !HotAirON) {
        lcd.print("---");
    } else {
        lcd.print(GetHotAirT);
    }
    lcd.write((byte)0);

    lcd.setCursor(13, 1);
    lcd.print(bspace);
    lcd.setCursor(13, 1);
    if (needCool && !HotAirON) {
        lcd.print("99%");
    } else {
        lcd.print(SetHotAirRPM);
        lcd.print("%");
    }

    for (byte z = 1; z < 4; z++) {
        lcd.setCursor(2, z);
        lcd.print(" ");
    }

    lcd.setCursor(2, selectedMode);
    lcd.print(">");
}

 

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

Ну, вполне нормально получилось.
1. Да, индекс параметра для регулировки переключается по кольцу, а  так как символ выбранного значения ">" находится всегда в одной позиции по горизонтали, то я меняю только вертикальную координату.
 

//В цикле "подчищаем" область вывода
for (byte z = 1; z < 4; z++) {
        lcd.setCursor(10, z);
        lcd.print(" ");
    }
//Выводим символ, взависимости от значения selectedMode 
    lcd.setCursor(10, selectedMode);
    lcd.print(">");

Т.к. в вашем случае, позиция вывода меняется и по вертикали и по горизонтали, то придётся сделать так:
1. "Чистить" без цикла, последовательно - выводить пробелы в те места, куда выводится ">"
2. Затем выводить, взависимости от значения SelectedMode
 

switch (selectedMode) {
            case modeSolder:
                //тут выводим, куда надо
                break;
            case modeHotAir:
                //тут выводим, куда надо                
                break;
            case modeFanPWM:
                //тут выводим, куда надо               
                break;
            }

Таймер выводится так (в данном случае 10 минут). Это поле имеет такие значения - если выключено, то не выводим ничего, если включено, то выводится значение таймера, если сработала защита, то выводится символ "!"



 

 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

Спасибо как все детали придут соберу отпишусь (также заказал на всякий случа дисплей 2004), заметил что в описании версии скетча написано версия 1.0 неужели за время пользования не было апдейов?

И еще вопрос реле с реелейного модуля который ранее описывал подойдут (если выпаять)?

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

Sergant пишет:
неужели за время пользования не было апдейов?

Нет, как ни странно, но это единственная версия, писалась практически за один раз, если не считать промежуточного скетча, где обкатывалось ФИ-регулирование, без автоматики.
А если работает и косяков не выявилось, то и обновлять, вроде, нечего ))

А, забыл - увеличил верхний предел температуры паяльника до 400 град, мало ли, какой бессвинцовый припой попадётся. Это корректируется константой max_solder_temp
 

Цитата:
И еще вопрос реле с реелейного модуля который ранее описывал подойдут (если выпаять)?

Реле подойдут любые, способные коммутировать ток нагрузки.
От их напряжения срабатывания будет зависеть, как их запитать.
У меня не нашлось реле на 24В, только на 12, поэтому запитаны от обмотки на 24В через стаб 7812.
В вашем релейном модуле пятивольтовые реле, вроде?
Можно запитать тоже через стаб (7805), но его вход перекинуть на выпрямитель 9-вольтовой обмотки.
Ну и рисунок платы сравнить с распиновкой реле - совпадает ли...

 

ЗЫ. По защитным реле. Учитывая, что они защитные, под нагрузкой ими ничего не коммутируется (если не пробит регулирующий элемент "РЭ") - при включении, сперва включается реле, затем открывается РЭ, при выключении - сначала выключаем РЭ, затем, с небольшой выдержкой, выключаем реле. Это сделано для того, что бы исключить  подгорание контактов.

 

Sergant
Offline
Зарегистрирован: 24.03.2016

Олег доброго дня, есть несколько вопросов, если не сложно прокомментируйте

1. По реле вопрос: Я правилно понимаю что если я буду использовать реле на 24 вольта, то могу отказаться от стабилизаторов 7812 и соотвественно радиаторов и обвязки в виде 4-х конденсаторов для них? (напомню у меня будет испульсник на 24 вольта + от него модуль DC-DC с понижением до 9 вольт)? .... и соотвественно убираю диодные мосты, предохранитель на 10A?

2. Плата усиления сигнала, ранее вы писали что ставили AD8552 на самой плате подпись LM358, вы переделали код под 358? (и еще я данную плату показывал спецу и ему показалось что LM установлена наоборот, у нее класический вариант установки или с обратной стороны?)

3. На плате MCU под ардуиной справа есть разъем двойной (рядом с конденсатором на 100), к сожалению он не подписан, что это?

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

1. Да.
2. У меня сейчас стоит AD-ха. LM-ка устанавливалась классически, со стороны деталей, в панельку. Туда же установлена AD-ха, но через переходник, т.к. она в SOIC-е (на картинке, в первом сообщении видно). В рисунке платы ничего менять не нужно. Код - под AD-ху. Для LM потребуется незначительное изменение.
3. Этот разъём незадействован, выведен на всякий случай, вдруг чего на него навесить приспичит. Можно его не устанавливать.

AleksBAM
Offline
Зарегистрирован: 13.09.2014

Добрый вечер. 

А можно по подробнее, какие изменения необходимы под LM358. Начинаю паять платы. И начинаю собирать станцию.  

Спасибо.

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

Изменений всего ничего -

GetHotAirT = getOversampled(A7_Read) >> 1;

заменить на

GetHotAirT = getOversampled(A7_Read);

И аналогично в канале паяльника.

Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK пишет:

Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.

Олег доброго дня, а в чем эта на практике заметна разница между микросхемами (я не спец ...) одна 15 р. стоит другая 150 р.

И еще вопрос: около биппера вывод не подписан, он за что отвечает? (вопрос уже раньше был, но ответа я не расшифровал)

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

Sergant пишет:
разница между микросхемами

Особо никакой, если не заморачиваться ))
Скажем так -
1. У ЛМ-ки, после включения, какое-то время "плывут" показания, у АД-хи такого эффекта нет.
2. Если нужно более точное регулирование (0.5 град. вместо 1, как сейчас), то с АД-хой это можно сделать при текущем питании (5 вольт). Но и текущей точности - за глаза.

Ставьте LM-ку, если в дальнейшем что-то не понравится, то заменить на AD-ху очень просто, если стоит панелька. Панельку, если будете ставить, ставьте цанговую - надёжнее.

Цитата:
И еще вопрос: около биппера вывод не подписан, он за что отвечает?

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

 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

Олег доброго дня, начал собирать Power плату и случайно посмотрел на вашу сборку, и возникло предположение что ваша плата в Layout уже отзеркалена!? Если смотрел на ваш Layout схему то получается смотришь на перевернутую плату а не на дорожки снижзу, это так?

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

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

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK пишет:

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

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

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

>>Попался я!!!
Сочувствую...

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

Sergant
Offline
Зарегистрирован: 24.03.2016

Я без притензий это опыт :) ... Я понял по микросхеме MOC что-то не так, первая нога не совпадала, подумал что один из вариантов корпуса (бывает такое ...)

Пару вопросов:

1.Для чего стабилитрон на радиаторе под управлением MOC (не могу разобраться)?

2.Какое напряжение выставить на DC-DC 5 или 9 вольт?

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

Sergant пишет:
1.Для чего стабилитрон на радиаторе под управлением MOC (не могу разобраться)?

Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.

Цитата:
2.Какое напряжение выставить на DC-DC 5 или 9 вольт?

Если преобразователь стабилизированный и питать контроллер напрямую с него, то 5 вольт, если не стабилизированный, то выставить 8-10 вольт и подать на вход стаба 7805.

Цитата:
это опыт

Я тоже, по первости, так влетал. Теперь всегда смотрю по распиновке элементов, прежде, чем печатать чьи-то платы.

 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK пишет:

Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.

Ошибся, я про симистер :) у него какая маркировка? Также у вас в архиве файлс расширением ms13? это видимо схема, чем ее открывать подскажите?

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

Симистор - BT138

ms13 - это файл симулятора узла контроля 0 сети. Открывается в Мультисим не ниже 13-й версии.
Это я из нескольких схем выбирал и эта понравилась больше других.

Выглядит так -

Русл@н
Offline
Зарегистрирован: 14.04.2016

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

У меня есть несколько вопросов, можно их задавать по ходу сборки станции?

Я слегка переделал разводку плат под другие кнопки и основной вопрос по плате Power, я ее переделал под блок питания на 24в, можете посмотреть правильность монтажа?

https://yadi.sk/d/rjPxEZwaqzdPe файл лежит здесь. И если нужно я могу выложить фотки собранных плат, конечно с Вашего одобрения. Спасибо

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

Русл@н пишет:
Добрый вечер, решил повторить вашу станцию, вы сделали титанический труд и позвольте Вам сказать за это спасибо.

Спасибо на добром слове ))

Цитата:
У меня есть несколько вопросов, можно их задавать по ходу сборки станции?

Запросто - для того и тема.

Цитата:
можете посмотреть правильность монтажа?

На свой глаз подрихтовал, в основном чуть гармонии навёл по дорожкам - https://yadi.sk/d/2jBgYQAGqzgWn

Цитата:
И если нужно я могу выложить фотки собранных плат, конечно с Вашего одобрения.

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

 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

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

Свой экземпляр почти повторил жду фена, паяльника и ардуино, платы готовы, также доработал схемы в основном для уменьшения размера, применил реле на 24 вольта, и модуль понижайки до 5 вольт (мне так удобней).

Увидел, что в последнем варианте от Руслана установлен предохранитель на 10А насколько это оправдано учитывая что видимо запитка будет от БП постоянным напряжением 24 вольта!?

Выкладываю свой вариант менял в основном Power и MTU - здесь

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

Sergant пишет:
...применил реле на 24 вольта, и модуль понижайки до 5 вольт (мне так удобней).

Нормально. Я лепил из того, что было в наличии - надо ж куда-то хлам расходовать ))

Цитата:
предохранитель на 10А насколько это оправдано

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

Цитата:
Выкладываю свой вариант менял в основном Power и MTU

Ага, MCU покомпактнее будет. Я его делал в размер платы индикации, что бы скрутить бутербродом, поэтому там и пустого пространства хватает. Можно в пустом месте разместить пятачков с шагом 2.54 мм и использовать, если приспичит что-либо доработать.

 

 

Русл@н
Offline
Зарегистрирован: 14.04.2016

Здравствуйте, платы спаял, корпус подготовил, платы спалил, починил))

Добавлю фото того что сделал. (архив буду обновлять по готовности проекта).

https://yadi.sk/d/fIG39OFlrDK9H

Платы делал первый раз за почти 10 лет))) Зато какое удовольствие делать проект своими руками.. не зря я учился на РЭТ, эх ностальгия по юнности))  Прошу сильно не пинайте.

Плату питания почти всю переработал, запустил в тесте вроде как все исправно. Блок питания на 24в, реле на 24в. Убрал почти все перемычки. Номиналы некоторых конденсаторов и резисторов заменил. Питание 5в взял с зарядки от телефона ксаоми, там как ни странно оказался суперкачественный БП с шимкой, сделал отдельным модулем.

Здоровая критика приветствуется.

Теперь пара вопросов к автору проекта.

По ардуинке, я заливал тестовый пример Blink, залил тест для дисплея 1602, попытался даже дисплей от нокии 1202 прикрутить)) работает но с кракозябрами. Далее моих познаний новичка не хватило. Подскажите пожалуйста как, куда и что залить, или ткните носом в инструкцию, я честно говоря запутался...  Использую экранчик 1602 и LM358.

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

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

Русл@н пишет:
Здоровая критика приветствуется.

И на чертеже и на фото силовой платы косяк - пятак перемычки, что идёт к пину "ZC" разъёма соединён с дорожкой, соед. пин этого же разъёма "HA" и светодиод оптопары. Т.е. канал фена не заработает совсем.

Цитата:
работает но с кракозябрами.

Выводите на кириллице? Дисплей инициализирован правильно (строки, кол-во символов)?

Цитата:
как сделать отверстие в корпусе компьютерного блока питания под авиационный разьем

1. Обсверлить периметр отверстия тонким сверлом + круглый напильник.
2. Ступенчатое сверло.

Цитата:
из чего сделать ножки к станции.

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

 
 
 

 

 

Русл@н
Offline
Зарегистрирован: 14.04.2016

Извиняюсь, старое фото платы залил ( На плате уже перерезал дорожку перед установкой в корпус), на схеме сейчас перенесу перемычку и обновлю архив.

1602 работает как надо)

Нокиа 1202 как в этой теме f-ку выводит а дальше что делать не пойму..

Спасибо

https://yadi.sk/d/kMU_jTD1rDS6n

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

Русл@н пишет:
а дальше что делать не пойму..

Использовать 1602 - в сообщении 65 Sergant уже привёл код для него...
 

 

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK пишет:

Русл@н пишет:
а дальше что делать не пойму..

Использовать 1602 - в сообщении 65 Sergant уже привёл код для него...

Примечание: Я не настроил вывод ТАЙМЕРОВ, поэтому правка для 1602 не законченная (таймеры не будут отображаться), жду прихода деталей и плотно займусь ...

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

Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить  немного места.

Sergant
Offline
Зарегистрирован: 24.03.2016

OlegK пишет:

Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить  немного места.

Хорошая идея, я также подумывал убрать буквы слева (хочу напечатать на принтере названия строк и столбцов все равно они статичны) и таймеры сделать в конце

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

Sergant пишет:
напечатать на принтере названия строк и столбцов

Тоже выход ))

 

Русл@н
Offline
Зарегистрирован: 14.04.2016

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

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

В Libraries есть три папки -Bounce2 -CyberLib -LiquidCrystal_I2C1602V1

В SS_3 лежит скетч(я правильно надеюсь понимаю)

Что сделал я, подключил библиотеку Bounce1, открыл файл SS_3, внес изменения под дисплей 1602 (скопировал код у Сержанта), внес изменения для LM-ки и при заливке получаю ошибку "Ошибка компиляции для платы Arduino Nano". что я делаю не так? и как надо?

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

Bounce2, CyberLib, LiquidCrystal_I2C - эти библиотеки должны находиться в папке Libraries директории Arduino IDE
 

>>подключил библиотеку Bounce1
А зачем?  В скетче же уже подключена более новая версия этой библы.
 

Кроме ошибки компиляции, что ещё выдаёт? По идее, должно указываться, что компилятору не понравилось конкретно...

 

 

Русл@н
Offline
Зарегистрирован: 14.04.2016

[spoiler]In file included from C:\Users\r\Desktop\Фото станции\SS_3\SS_3\SS_3.ino:3:0:

Вот ошибки


C:\Users\r\Documents\Arduino\libraries\Bounce1/Bounce.h:33:7: error: redefinition of 'class Bounce'

 class Bounce

       ^

In file included from C:\Users\r\Desktop\Фото станции\SS_3\SS_3\SS_3.ino:1:0:

C:\Program Files (x86)\Arduino\libraries\Bounce2/Bounce2.h:42:7: error: previous definition of 'class Bounce'

 class Bounce

       ^

C:\Users\r\Desktop\Фото станции\SS_3\SS_3\SS_3.ino: In function 'void ScanButtons()':

SS_3:558: error: 'DwnButton' was not declared in this scope

C:\Users\r\Desktop\Фото станции\SS_3\SS_3\SS_3.ino: In function 'void ButtonsSetup()':

SS_3:672: error: 'DwnButton' was not declared in this scope

Несколько библиотек найдено для "LiquidCrystal_I2C.h"
 Используется: C:\Users\r\Documents\Arduino\libraries\LiquidCrystal_I2C1602V1
Не используется: C:\Users\r\Documents\Arduino\libraries\NewliquidCrystal
Не используется: C:\Program Files (x86)\Arduino\libraries\LiquidCrystal_I2C1602V1
exit status 1
'DwnButton' was not declared in this scope
[/spoiler]

Вот то что пробую залить

#include <Bounce2.h>

#include <Bounce.h>

#include <LiquidCrystal_I2C.h>

#include <Bounce.h>

#include <EEPROM.h>
#include <CyberLib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Bounce2.h>

/* LCD */
LiquidCrystal_I2C lcd(0x27, 20, 4);

//Degree symbol
uint8_t degree[8]  = {140, 146, 146, 140, 128, 128, 128, 128};

/* Variables & definitions */
uint16_t HA_sleeptime = 10;
uint16_t S_sleeptime = 10;
boolean need_HA_countdown = false;
boolean need_S_countdown = false;
byte selectedMode = 1; //solder selected
uint16_t  HAcountdown = 1;
uint16_t Scountdown = 1;
uint32_t prevDisplayMillis = 0;
uint32_t prevWorkMillis = 0;
uint32_t UPbuttonPressTime = 0;
uint32_t DWNbuttonPressTime = 0;
uint32_t prevHAmillis = 0;
uint32_t prevSmillis = 0;
uint16_t Graph_count = 0;

//if you need to create themperature diagramm then set true
boolean need_log = false;

boolean UPbuttonState, DWNbuttonState;
#define pinBuzzer 12
char bspace[ ] = "    ";
#define min_solder_temp 100
#define max_solder_temp 350
#define min_hotair_temp 50
#define max_hotair_temp 450
#define min_rpm 20
#define max_rpm 100
#define default_temp 250
#define default_rpm 50

/* Definitions for mode selector */
#define  modeSolder 1
#define  modeHotAir 2
#define  modeFanPWM 3

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


/* Hot Air definitions*/
volatile uint16_t ots = 9990;
volatile boolean HotAirON = false;
volatile boolean HotAirProtect = false;
uint16_t GetHotAirT = 0;
uint16_t SetHotAirT = 100;
byte SetHotAirRPM = 100;
byte HAgood = 0;
boolean HAneedBeep = true;
boolean needCool = true;
boolean HA_gerkon = false;
#define pinFanPwm 6
#define Kp 1.0
#define Ki 0.005 //0.008 //0.0035
int integral = 0;
float HAPower = 0.0;
boolean HA_PROT = false;

/* Solder definitions */
uint16_t GetSolderT = 0;
uint16_t SetSolderT = 100;
byte Sgood = 0;
boolean SneedBeep = true;
boolean SolderON = false;
boolean SolderProtect = false;
boolean S_PROT = false;
#define pinSolderPwm 5
#define sKp 50



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


    if (need_log) {
        Serial.begin(115200);
    }

    lcd.init();
    lcd.backlight();
    lcd.createChar(0, degree);
    Splash();
    MemRead();
    delay_ms(2000);
    initDisplay();
    attachInterrupt(1, ZC, FALLING);
}


void loop() {

    ScanButtons();

    /* Off-timer for HotAir, countdown with 1 min */
    if (need_HA_countdown) {
        unsigned long currHAmillis = millis();
        if (currHAmillis - prevHAmillis > 60000) {
            if (HAcountdown > 1) {
                HAcountdown--;
                if (HAcountdown == 1) {
                    Beep(20);    //Beep, if 1 minute left
                }
            } else {
                HAcountdown = 1;
                prevHAmillis = 0;
                MemHotAir();
                need_HA_countdown = false;
                HotAirON = false;
                Beep(100);
            }
            prevHAmillis = currHAmillis;
        }
    }

    /* Off-timer for Solder, countdown with 1 min */
    if (need_S_countdown) {
        unsigned long currSmillis = millis();
        if (currSmillis - prevSmillis > 60000) {
            if (Scountdown > 1) {
                Scountdown--;
                if (Scountdown == 1) {
                    Beep(20);    //Beep, if 1 minute left
                }
            } else {
                Scountdown = 1;
                prevSmillis = 0;
                MemSolder();
                need_S_countdown = false;
                SolderON = false;
                Beep(100);
            }
            prevSmillis = currSmillis;
        }
    }


    /* Update LCD with 500ms interval */
    uint32_t currDisplayMillis = millis();
    if (currDisplayMillis - prevDisplayMillis > 500) {
        prevDisplayMillis = currDisplayMillis;
        DisplayUpdate();
        //if you need to create themperature diagramm
        /* Send data to Serial port */
        if (need_log) {
            if (SolderON || HotAirON) {
                Graph_count++;
                Serial.print(Graph_count);
                Serial.print(";");
            } else {
                Graph_count = 0;
            }

            if (SolderON && !HotAirON) {
                Serial.println(GetSolderT);
            } else if (!SolderON && HotAirON) {
                Serial.println(GetHotAirT);
            }
        }
    }

    /* Main work with 50ms interval */
    uint32_t currWorkMillis = millis();
    if (currWorkMillis - prevWorkMillis > 50) {
        prevWorkMillis = currWorkMillis;
        WorkWithHotAir();
        WorkWithSolder();
    }

}

/* HotAir working procedure */
void WorkWithHotAir() {
  

    /* Read the thermocouple value */
    //GetHotAirT = A7_Read >> 1;
    GetHotAirT = getOversampled(A7_Read);

    if (HotAirON) {

        /* Set the cooler rpm (convert from 30-100% to 80-255 PWM) */
        analogWrite(pinFanPwm, map(SetHotAirRPM, 30, 100, 80, 255));

        /* Overheat protection, or if thermocouple value is not valid */
        if (GetHotAirT > SetHotAirT + 50 || GetHotAirT < 10) {
            goto HotAirProtectOut;
        }

        /* Turn ON relay */
        D7_High;

        /* themperature PI regulator */
        HA_PI();

        /* If themperature was stable for 20 times (+/- 2 degrees) then signalize it*/
        if (HAneedBeep) {
            int delta = GetHotAirT - SetHotAirT;
            if (delta > -3 && delta < 3) {
                HAgood++;
                if (HAgood == 20) {
                    Beep(20);
                    delay_ms(200);
                    Beep(20);
                    HAgood = 0;
                    HAneedBeep = false;
                }
            } else {
                HAgood = 0;
                HAneedBeep = true;
            }
        }
    } else { /* if HotAir Off */
        HotAirOff();
        /* Cooling the heater until the temperature is below 50 degrees */
        if (GetHotAirT >= 50 && needCool) {
            analogWrite(pinFanPwm, 255);
        } else {
            analogWrite(pinFanPwm, 0);
            needCool = false;
        }
        need_HA_countdown = false;
        HAcountdown = 1;
    }
    return;

    /* Protection out */
HotAirProtectOut:
    analogWrite(pinFanPwm, 255);
    HotAirProtect = true;
    HA_PROT = true;
    HotAirON = false;
    HotAirOff();
}

/* Solder working procedure */
void WorkWithSolder() {

    /* Read the thermoresistor value */
    //GetSolderT = A6_Read >> 1;
    GetSolderT = getOversampled(A6_Read);

    if ( SolderON ) {

        /* Overheat protection, or if thermoresistor value is not valid */
        if (GetSolderT > SetSolderT + 50 || GetSolderT < 10) {
            goto SolderProtectOut;
        }

        /* Turn ON relay */
        D4_High;

        /* themperature P regulator */
        S_P();

        /* If themperature was stable for 20 times loop (+/- 2 degrees) then signalize about it*/
        if (SneedBeep) {
            int delta = SetSolderT - GetSolderT;
            if (delta > -3 && delta < 3) {
                Sgood++;
                if (Sgood == 20) {
                    Beep(20);
                    delay_ms(200);
                    Beep(20);
                    Sgood = 0;
                    SneedBeep = false;
                }
            } else {
                Sgood = 0;
                SneedBeep = true;
            }
        }
    } else {
        SolderOff();
        need_S_countdown = false;
        Scountdown = 1;
    }
    return;

    /* Protection out */
SolderProtectOut:
    SolderProtect = true;
    S_PROT = true;
    SolderON = false;
    SolderOff();
}



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

/* Reset HotAir countdown */
void ResetHAcountdown() {
    if (HAcountdown != 1) {
        HAcountdown = HA_sleeptime;
    }
}

/* Reset Solder countdown */
void ResetScountdown() {
    if (Scountdown != 1) {
        Scountdown = S_sleeptime;
    }
}

/* Activate HotAir countdown */
void ActivateHAcountdown() {
    need_HA_countdown = true;
    HAcountdown = HA_sleeptime;
}

/* Activate Solder countdown */
void ActivateScountdown() {
    need_S_countdown = true;
    Scountdown = S_sleeptime;
}

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

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

/* Zero cross INT1 */
void ZC() {
    StartTimer1(HeaterOn, ots);
    RestartTimer1();
}

/* Triac open impulse */
void HeaterOn() {
    if (HotAirON && !HotAirProtect) {
        if (HAPower > 0.0) {
            D8_High;
            delay_us(100);
            D8_Low;
        } else {
            D8_Low;
        }
    }
    StopTimer1();
}

/* Scan buttons */
void ScanButtons() {
    boolean changed = false;
    byte value = 0;

    changed = swHotAir.update();
    if (changed && HotAirON) {
        ResetHAcountdown();
        Beep(50);
    }

    changed = swSolder.update();
    if (changed && SolderON) {
        ResetScountdown();
        Beep(50);
    }

    SolderOnButton.update();
    if ( SolderOnButton.fell() ) {
        Beep(20);
        SneedBeep = true;
        if (!SolderON) {
            SolderON = true;
            SolderProtect = false;
            prevSmillis = millis();
            ActivateScountdown();
            Graph_count = 0;
        } else {
            SolderON = false;
            MemSolder();
        }
    }

    HotAirOnButton.update();
    if ( HotAirOnButton.fell() ) {
        Beep(20);
        HAneedBeep = true;
        needCool = true;
        if (!HotAirON) {
            HotAirON = true;
            HotAirProtect = false;
            prevHAmillis = millis();
            ActivateHAcountdown();
            Graph_count = 0;
            integral = 0;
        } else {
            HotAirON = false;
            MemHotAir();
        }
    }

    SelButton.update();
    if ( SelButton.fell() ) {
        Beep(20);
        (selectedMode < 3) ? (selectedMode++) : (selectedMode = 1);
        ResetScountdown();
        ResetHAcountdown();
    }

    changed = UpButton.update();
    if ( changed ) {
        value = UpButton.read();
        if (value) {
            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);
        }
    }

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

    changed = DwnButton.update();
    if ( changed ) {
        value = DwnButton.read();
        if (value) {
            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 >= 500 ) {
            DWNbuttonPressTime = millis();
            switch (selectedMode) {
            case modeSolder:
                if (SetSolderT > min_solder_temp) {
                    SetSolderT -= 10;
                }
                if (SetSolderT < min_solder_temp) {
                    SetSolderT = min_solder_temp;
                }
                SneedBeep = true;
                ResetScountdown();
                break;
            case modeHotAir:
                if (SetHotAirT > min_hotair_temp) {
                    SetHotAirT -= 10;
                }
                if (SetHotAirT < min_hotair_temp) {
                    SetHotAirT = min_hotair_temp;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            case modeFanPWM:
                if (SetHotAirRPM > min_rpm) {
                    SetHotAirRPM -= 10;
                }
                if (SetHotAirRPM < min_rpm) {
                    SetHotAirRPM = min_rpm;
                }
                HAneedBeep = true;
                ResetHAcountdown();
                break;
            }
        }
    }
}

/* "Hello" screen */
void Splash() {
    lcd.clear();
    lcd.setCursor(2, 1);
    lcd.print("Soldering Station");
    lcd.setCursor(7, 2);
    lcd.print("v 1.0");
    //if you need to create themperature diagramm
    if (need_log) {
        lcd.setCursor(1, 4);
        lcd.print("log is enabled");
    }
}

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

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

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

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

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

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

    lcd.setCursor(11, 0);
    lcd.print("Set");

    lcd.setCursor(16, 0);
    lcd.print("Act");

    lcd.setCursor(0, 1);
    lcd.print("Solder");

    lcd.setCursor(0, 2);
    lcd.print("HotAir");

    lcd.setCursor(0, 3);
    lcd.print("FanRPM");
}

/* Update LCD */
void DisplayUpdate() {
   /* Update LCD */
   lcd.setCursor(2, 0);
   lcd.print(bspace);      
   lcd.setCursor(3, 0); //было 7.1
   if (SolderProtect) {

          lcd.print("[!]");
     } else if (SolderON) {

          lcd.print(Scountdown);

      }

   
      
      lcd.setCursor(2, 0);

      lcd.print(bspace);

      lcd.setCursor(3, 0);

      lcd.print(SetSolderT);

      lcd.write((byte)0);

   

      lcd.setCursor(7, 0);

      lcd.print(bspace);

      lcd.setCursor(8, 0);

      if (GetSolderT > 505 && !SolderON) {

          lcd.print("---");

      } else {

          lcd.print(GetSolderT);

      }

   

      lcd.write((byte)0);

   

      lcd.setCursor(2, 1);

      lcd.print(bspace);

      lcd.setCursor(3, 1);

      if (HotAirProtect) {

          lcd.print("[!]");

      } else if (HotAirON) {

          lcd.print(HAcountdown);

      }

   

      lcd.setCursor(2, 1);

      lcd.print(bspace);

      lcd.setCursor(3, 1);

      lcd.print(SetHotAirT);

      lcd.write((byte)0);

   

      lcd.setCursor(8, 1);

      lcd.print(bspace);

      lcd.setCursor(8, 1);

   

      if (GetHotAirT > 505 && !HotAirON) {

          lcd.print("---");

      } else {

          lcd.print(GetHotAirT);

      }

      lcd.write((byte)0);

   

      lcd.setCursor(13, 1);

      lcd.print(bspace);

      lcd.setCursor(13, 1);

      if (needCool && !HotAirON) {

          lcd.print("99%");

      } else {

          lcd.print(SetHotAirRPM);

          lcd.print("%");

      }
   

      for (byte z = 1; z < 4; z++) {

          lcd.setCursor(2, z);

         lcd.print(" ");

      }

   

      lcd.setCursor(2, selectedMode);

      lcd.print(">");

  }
/* Read last parameters from memory */
void MemRead() {
    SetSolderT = EEPROM_int_read(0);
    if (SetSolderT < min_solder_temp || SetSolderT > max_solder_temp)  {
        SetSolderT = default_temp;
    }
    SetHotAirT = EEPROM_int_read(4);
    if (SetHotAirT < min_hotair_temp || SetHotAirT > max_hotair_temp) {
        SetHotAirT = default_temp;
    }
    SetHotAirRPM = EEPROM_int_read(8);
    if (SetHotAirRPM < min_rpm || SetHotAirRPM > max_rpm) {
        SetHotAirRPM = default_rpm;
    }
}

/* Write last used solder themperature to memory */
void MemSolder() {
    EEPROM_int_write(0, SetSolderT);
}

/* Write last used HotAir themperature and Fan r.p.m. to memory */
void MemHotAir() {
    EEPROM_int_write(4, SetHotAirT);
    EEPROM_int_write(8, SetHotAirRPM);
}

/* HotAir PI regulator */
void HA_PI() {
    int err = SetHotAirT - GetHotAirT;
    float TempPower = ((Kp * err) + (Ki * integral));
	if (TempPower < 100.0 && TempPower > 0.0) integral += err;
    HAPower = constrain(TempPower, 0.0, 100.0);
    CalctImpulseControl();
}

/* Calculate delay for triac */
void CalctImpulseControl() {
    ots = (uint16_t)(acos(HAPower / 50.0 - 1.0 ) * 9900.0 / pi);
}

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


void Beep(uint16_t duration) {
    D12_High;
    delay_ms(duration);
    D12_Low;
}

uint16_t getOversampled(uint16_t ADC_value) {
    unsigned long int result = 0;
    for (byte z = 0; z < 64; z++) {
        result +=  ADC_value;
    }
    return result >> 6;
}

 

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

1. Для начала, уберите из инклюдов ВСЕ лишние объявления "боунсов", кроме Bounce2 -  нафига их там столько?
2. >>SS_3:558: error: 'DwnButton' was not declared in this scope
Верните объявление для DwnButton на место (секция Bounce Killers)

Bounce DwnButton = Bounce();

3. Аналогично п.1 и для библиотеки LiquidCrystal_I2C, т.е. прочитайте первую строку сообщения 96, где они должны быть.
 

Русл@н
Offline
Зарегистрирован: 14.04.2016

Спасибо, все поправил, дисплей висел по другому адресу шины IC2.

Запустил сканер адресов и все стало на свои места.

Теперь вопрос по поводу датчика в подставке паяльника, если его не подсоединять что-то нужно менять в скетче?

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

Русл@н пишет:
Теперь вопрос по поводу датчика в подставке паяльника, если его не подсоединять что-то нужно менять в скетче?

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