Думаю, с этой переменной будет всё нормально, тогда нужно будет так же посмотреть и те, что участвуют в управлении - ots и HAPower, какое значение принимаю при резком изменении заданной температуры. Первая - это время задержки для таймера, вторая - мощность, на основании которой рассчитывается время задержки открытия симистора.
Нашел проблему!) По своей не внимательности в скетче прерывание 1 включил на пин 3, на плате развел для 0. А на этом пине управляется мотор фена. И получалось что прерывание срабатывала из зи шим ! Когда выкручивались обороты на полную спады напряжений прикращялись и прерывания не срабатывали, поэтому сбрасывались температура. ) И в условии прерывания изменил срабатывания с высокого на низкий.
Да, в спринте я практически всё подписал -
разъём "Ус термодатчиков" - сюда цепляется плата усилителей на ОУ.
разъём "концевики" - сюда подключается геркон фена и "хвост" подставки паяльника. Ранее сюда подключалась микросхема
преобразователя сигнала термопары, но я от неё отказался в пользу более скоростного решения.
Дисплей WH2004, 20 символов х 4 строки,
я брал именно такой, тут
Очень яркий и хорошо читаемый под углами дисплей.
К нему ещё потребуется плата, для подключения через I2C-шину.
Плата такая
Спасибо, с этим разобрался. Индикатор у меня есть графический с библиотекой. Попробую его приспособить.
А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе, инвертировав соответствующий сигнал. И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?
И еще. 4-е выводы оптопар лучше подключить к плюсовому выводу конденсатора С1 и резисторы R4 и R8 увеличить до 10к. Это позволит снизить падение напряжения на открытых транзисторах ШИМ.
>>А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе
Защита больше предназначена от пробоя управляющего элемента, когда его отключение ничего не даст. В канале паяльника, наверное, можно убрать реле (не попадалось слуучаев самовозгорания паяльников, если управляется полевиком, но для фена я бы на защите не экономил.
Что бы не случилось вот так -
или вот так, как на видео.
Вот ещё...
Хотя, многие эксплуатируют вообще безо всяких защит...
>>И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?
Нет, тогда фазоимпульсное управление не будет работать. Нужно будет переделывать регулирование.
Понравилась ваша разработка, планирую повторить, у меня в хозяйстве много дисплеев 1602 сразу с шиной i2c (под адрес 0x27), можете под мой дисплей переделать скетч вывод информации!? (привожу пример как это может выглядеть)
под мой дисплей переделать скетч вывод информации!?
Не вижу особых трудностей, кроме, как то, что в строке меньше символов - 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 символов это не увеличит ))
Спасибо, за пояснения, думаю справлюсь, хотя с ардуино начал мастерить 2 месяца назад загорелся интеллектуальной зарядкой (https://www.drive2.ru/b/2652964/) сделал понравилось и затянуло.
Поэтому в идеале если подскажите в каких строчка кода играться, то буду благодарен (сам язык ардуино не знаю, но местами править могу :)
Я ж выше подсказал - откройте мой исходник, и найдите там две процедуры - initDisplay() и DisplayUpdate()
В первой, я вывожу на дисплей те надписи, которые не нужно менять в процессе работы - в самом первом ряду и самой первой колонке. Это выполняется в коде только один раз.
Во второй процедуре выводится те значения, которые обновляются. Можно было запихать всё в один кусок кода, но мне захотелось убрать моргания дисплея.
Так как у вас не будет лишних надписей, то удаляете совсем initDisplay(), а в процедуре DisplayUpdate() пишете вывод данных, с учётом вашего дисплея.
Т.е. сперва "чистите" весь экран
lcd.clear();
затем выводите что-нибудь, к примеру, начиная с 4 символа первой строки -
lcd.setCursor(3, 0); //не забываем, что отсчёт начинается с 0 индекса
lcd.print("666");
Ну и процедуру Splash() удаляете или редактируйте под свой экран - она выводит "приветствие" при старте станции.
Для простоты, сделайте отдельный проект, где потренируйтесь выводить какие-нибудь числа в нужные вам позиции. Когда придёт понимание того, что делаете, можно будет исправить и код станции.
Спасибо поэксперементирую, позже отпишусь. Вместо транформатора заказал импульсник 24V, 4-6A, теперь хочу понять как в этом случае упрощается схема Power? что убрать? 9 вольт видимо сделаю через понижающий модуль DC- DC запитаю от импульсника
Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос? (помогите) выпаивать реле не хочется :)
Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос?
Релейный модуль уже имеет на борту оптопары, поэтому можно его подключить напрямую к "дуине", не запаивая на силовую плату те компоненты, которые относятся к реле - оптроны, транзисторы, диоды. Контакты реле, соответственно тоже нужно не забыть подключить в цепи нагревателей.
Работать будет, но получится не компактно и проводов лишних добавится.
Подправил код под свой дисплей, конечно не товарный вид, но мне не на продажу, а для себя :) приветсвие сократил чтобы влазило. Fan вместо 100% сделал 99% S:=Soldier, A:=HotAir
1) У вас переход знака установки ">" идет циклично снизу-вверх, будет ли он корректно переходить на установку скорости вентилятора ?
2) Ранее вы писали про занчение ZZ - таймера паяльника или фена, видимо я про них забыл? или не увидел где выводится.
Ну, вполне нормально получилось.
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 минут). Это поле имеет такие значения - если выключено, то не выводим ничего, если включено, то выводится значение таймера, если сработала защита, то выводится символ "!"
Спасибо как все детали придут соберу отпишусь (также заказал на всякий случа дисплей 2004), заметил что в описании версии скетча написано версия 1.0 неужели за время пользования не было апдейов?
И еще вопрос реле с реелейного модуля который ранее описывал подойдут (если выпаять)?
Нет, как ни странно, но это единственная версия, писалась практически за один раз, если не считать промежуточного скетча, где обкатывалось ФИ-регулирование, без автоматики.
А если работает и косяков не выявилось, то и обновлять, вроде, нечего ))
А, забыл - увеличил верхний предел температуры паяльника до 400 град, мало ли, какой бессвинцовый припой попадётся. Это корректируется константой max_solder_temp
Цитата:
И еще вопрос реле с реелейного модуля который ранее описывал подойдут (если выпаять)?
Реле подойдут любые, способные коммутировать ток нагрузки.
От их напряжения срабатывания будет зависеть, как их запитать.
У меня не нашлось реле на 24В, только на 12, поэтому запитаны от обмотки на 24В через стаб 7812.
В вашем релейном модуле пятивольтовые реле, вроде?
Можно запитать тоже через стаб (7805), но его вход перекинуть на выпрямитель 9-вольтовой обмотки.
Ну и рисунок платы сравнить с распиновкой реле - совпадает ли...
ЗЫ. По защитным реле. Учитывая, что они защитные, под нагрузкой ими ничего не коммутируется (если не пробит регулирующий элемент "РЭ") - при включении, сперва включается реле, затем открывается РЭ, при выключении - сначала выключаем РЭ, затем, с небольшой выдержкой, выключаем реле. Это сделано для того, что бы исключить подгорание контактов.
Олег доброго дня, есть несколько вопросов, если не сложно прокомментируйте
1. По реле вопрос: Я правилно понимаю что если я буду использовать реле на 24 вольта, то могу отказаться от стабилизаторов 7812 и соотвественно радиаторов и обвязки в виде 4-х конденсаторов для них? (напомню у меня будет испульсник на 24 вольта + от него модуль DC-DC с понижением до 9 вольт)? .... и соотвественно убираю диодные мосты, предохранитель на 10A?
2. Плата усиления сигнала, ранее вы писали что ставили AD8552 на самой плате подпись LM358, вы переделали код под 358? (и еще я данную плату показывал спецу и ему показалось что LM установлена наоборот, у нее класический вариант установки или с обратной стороны?)
3. На плате MCU под ардуиной справа есть разъем двойной (рядом с конденсатором на 100), к сожалению он не подписан, что это?
1. Да.
2. У меня сейчас стоит AD-ха. LM-ка устанавливалась классически, со стороны деталей, в панельку. Туда же установлена AD-ха, но через переходник, т.к. она в SOIC-е (на картинке, в первом сообщении видно). В рисунке платы ничего менять не нужно. Код - под AD-ху. Для LM потребуется незначительное изменение.
3. Этот разъём незадействован, выведен на всякий случай, вдруг чего на него навесить приспичит. Можно его не устанавливать.
Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.
Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.
Олег доброго дня, а в чем эта на практике заметна разница между микросхемами (я не спец ...) одна 15 р. стоит другая 150 р.
И еще вопрос: около биппера вывод не подписан, он за что отвечает? (вопрос уже раньше был, но ответа я не расшифровал)
Особо никакой, если не заморачиваться ))
Скажем так -
1. У ЛМ-ки, после включения, какое-то время "плывут" показания, у АД-хи такого эффекта нет.
2. Если нужно более точное регулирование (0.5 град. вместо 1, как сейчас), то с АД-хой это можно сделать при текущем питании (5 вольт). Но и текущей точности - за глаза.
Ставьте LM-ку, если в дальнейшем что-то не понравится, то заменить на AD-ху очень просто, если стоит панелька. Панельку, если будете ставить, ставьте цанговую - надёжнее.
Цитата:
И еще вопрос: около биппера вывод не подписан, он за что отвечает?
Два контакта, чуть выше бипера? У меня там джампер копмповый - отключал им звук во время настройки.
Сейчас он у меня установлен, но бипер заклеен кусочком скотча, что бы не так громко орал.
Ещё тумблер можно воткнуть, если нужно отключать звук (ночью, к примеру).
Олег доброго дня, начал собирать Power плату и случайно посмотрел на вашу сборку, и возникло предположение что ваша плата в Layout уже отзеркалена!? Если смотрел на ваш Layout схему то получается смотришь на перевернутую плату а не на дорожки снижзу, это так?
Нет, я всегда рисую дорожки со стороны печати, т.е., как выглядело бы, если реальную плату перевернуть. Следовательно, перед печатью, нужно поставить "зеркальную" галку.
Нет, я всегда рисую дорожки со стороны печати, т.е., как выглядело бы, если реальную плату перевернуть. Следовательно, перед печатью, нужно поставить "зеркальную" галку.
Попался я!!! (надо переделывать), обычно все делают наоборот рисуют по схеме (делают трасировку) с пониманием что это вид дорожек под текстолитом. Тогда в вашем случае не однозначно воспринимаются маркировка деталей при пайке надо думать как-бы наоборот (смотреть на дорожки и вставлять деталь с обратной стороны, если ты конечно не разработчик платы и все знаешь...)
Я без притензий это опыт :) ... Я понял по микросхеме MOC что-то не так, первая нога не совпадала, подумал что один из вариантов корпуса (бывает такое ...)
Пару вопросов:
1.Для чего стабилитрон на радиаторе под управлением MOC (не могу разобраться)?
2.Какое напряжение выставить на DC-DC 5 или 9 вольт?
1.Для чего стабилитрон на радиаторе под управлением MOC (не могу разобраться)?
Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.
Цитата:
2.Какое напряжение выставить на DC-DC 5 или 9 вольт?
Если преобразователь стабилизированный и питать контроллер напрямую с него, то 5 вольт, если не стабилизированный, то выставить 8-10 вольт и подать на вход стаба 7805.
Цитата:
это опыт
Я тоже, по первости, так влетал. Теперь всегда смотрю по распиновке элементов, прежде, чем печатать чьи-то платы.
Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.
Ошибся, я про симистер :) у него какая маркировка? Также у вас в архиве файлс расширением ms13? это видимо схема, чем ее открывать подскажите?
ms13 - это файл симулятора узла контроля 0 сети. Открывается в Мультисим не ниже 13-й версии.
Это я из нескольких схем выбирал и эта понравилась больше других.
Добрый вечер, решил повторить вашу станцию, вы сделали титанический труд и позвольте Вам сказать за это спасибо.
У меня есть несколько вопросов, можно их задавать по ходу сборки станции?
Я слегка переделал разводку плат под другие кнопки и основной вопрос по плате Power, я ее переделал под блок питания на 24в, можете посмотреть правильность монтажа?
https://yadi.sk/d/rjPxEZwaqzdPe файл лежит здесь. И если нужно я могу выложить фотки собранных плат, конечно с Вашего одобрения. Спасибо
Также присоединяюсь к благодарности за работу автора и особо выделяю отзывчивость в части рекомендаций и советов (это ценно) спасибо. Особо привлекло в разработке отношение к безопастности системы (мне есть с чем и с кем сравнивать).
Свой экземпляр почти повторил жду фена, паяльника и ардуино, платы готовы, также доработал схемы в основном для уменьшения размера, применил реле на 24 вольта, и модуль понижайки до 5 вольт (мне так удобней).
Увидел, что в последнем варианте от Руслана установлен предохранитель на 10А насколько это оправдано учитывая что видимо запитка будет от БП постоянным напряжением 24 вольта!?
Выкладываю свой вариант менял в основном Power и MTU - здесь
...применил реле на 24 вольта, и модуль понижайки до 5 вольт (мне так удобней).
Нормально. Я лепил из того, что было в наличии - надо ж куда-то хлам расходовать ))
Цитата:
предохранитель на 10А насколько это оправдано
Этот предохранитель есть в моём варианте.
10 ампер, конечно, многовато в нормальном режиме, только в начале разогрева холодного нагревателя ток достаточно большой - можно поставить и поменьше, ампер на 5, если при старте не будет перегорать.
В принципе, ставить предохранитель или нет - дело добровольное, но мне он показался не лишним - паяльник имеет шнур, который постоянно туда-сюда дёргается. Учитывая, что и паяльник и шнур китайские, может вдруг и "кэзнуть" внутри шнура или паяльника (теоретически). Понятно, что от вылета регулирующего транзистора предохранитель не поможет, но, по крайней мере, спасёт выпрямитель и транс (в моём случае). Ну, или провода не поплавятся ))
Цитата:
Выкладываю свой вариант менял в основном Power и MTU
Ага, MCU покомпактнее будет. Я его делал в размер платы индикации, что бы скрутить бутербродом, поэтому там и пустого пространства хватает. Можно в пустом месте разместить пятачков с шагом 2.54 мм и использовать, если приспичит что-либо доработать.
Платы делал первый раз за почти 10 лет))) Зато какое удовольствие делать проект своими руками.. не зря я учился на РЭТ, эх ностальгия по юнности)) Прошу сильно не пинайте.
Плату питания почти всю переработал, запустил в тесте вроде как все исправно. Блок питания на 24в, реле на 24в. Убрал почти все перемычки. Номиналы некоторых конденсаторов и резисторов заменил. Питание 5в взял с зарядки от телефона ксаоми, там как ни странно оказался суперкачественный БП с шимкой, сделал отдельным модулем.
Здоровая критика приветствуется.
Теперь пара вопросов к автору проекта.
По ардуинке, я заливал тестовый пример Blink, залил тест для дисплея 1602, попытался даже дисплей от нокии 1202 прикрутить)) работает но с кракозябрами. Далее моих познаний новичка не хватило. Подскажите пожалуйста как, куда и что залить, или ткните носом в инструкцию, я честно говоря запутался... Использую экранчик 1602 и LM358.
PS так и не понял как сделать отверстие в корпусе компьютерного блока питания под авиационный разьем, пришлось кромсать и ломать... может кто подскажет? Еще не придумал из чего сделать ножки к станции.
И на чертеже и на фото силовой платы косяк - пятак перемычки, что идёт к пину "ZC" разъёма соединён с дорожкой, соед. пин этого же разъёма "HA" и светодиод оптопары. Т.е. канал фена не заработает совсем.
Цитата:
работает но с кракозябрами.
Выводите на кириллице? Дисплей инициализирован правильно (строки, кол-во символов)?
Цитата:
как сделать отверстие в корпусе компьютерного блока питания под авиационный разьем
Самое простое - применить прямоугольнички из достаточно толстой резины или поискать резиновые крышки от пузырьков, которые прокалываются шприцем (в таких ещё раньше зелёнка была).
Использовать 1602 - в сообщении 65 Sergant уже привёл код для него...
Примечание: Я не настроил вывод ТАЙМЕРОВ, поэтому правка для 1602 не законченная (таймеры не будут отображаться), жду прихода деталей и плотно займусь ...
Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить немного места.
Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить немного места.
Хорошая идея, я также подумывал убрать буквы слева (хочу напечатать на принтере названия строк и столбцов все равно они статичны) и таймеры сделать в конце
Добрый день, вчера наконец получил на почте паяльник и фен, и закончил сборку станции.
Вы будете смеяться, я застрял на моменте заливки прошивки в nano... подскажите или ткните в мануал, что сделать по пунктам чтоб установить прошивку.
В Libraries есть три папки -Bounce2 -CyberLib -LiquidCrystal_I2C1602V1
В SS_3 лежит скетч(я правильно надеюсь понимаю)
Что сделал я, подключил библиотеку Bounce1, открыл файл SS_3, внес изменения под дисплей 1602 (скопировал код у Сержанта), внес изменения для LM-ки и при заливке получаю ошибку "Ошибка компиляции для платы Arduino Nano". что я делаю не так? и как надо?
[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;
}
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, где они должны быть.
Думаю, с этой переменной будет всё нормально, тогда нужно будет так же посмотреть и те, что участвуют в управлении - ots и HAPower, какое значение принимаю при резком изменении заданной температуры. Первая - это время задержки для таймера, вторая - мощность, на основании которой рассчитывается время задержки открытия симистора.
Нашел проблему!) По своей не внимательности в скетче прерывание 1 включил на пин 3, на плате развел для 0. А на этом пине управляется мотор фена. И получалось что прерывание срабатывала из зи шим ! Когда выкручивались обороты на полную спады напряжений прикращялись и прерывания не срабатывали, поэтому сбрасывались температура. ) И в условии прерывания изменил срабатывания с высокого на низкий.
Ну и гуд.
OlegK, здравствуйте.
Не нашел в вашем архиве схемы подключения ардуины к датчикам и схеме POWER.
Если можно, ткните пальцем, где искать, или хотя бы табличку пинов.
И какая марка дисплея?
Geo_l посмотрите в sprint -layout там все показано.
Да, в спринте я практически всё подписал -
разъём "Ус термодатчиков" - сюда цепляется плата усилителей на ОУ.
разъём "концевики" - сюда подключается геркон фена и "хвост" подставки паяльника. Ранее сюда подключалась микросхема
преобразователя сигнала термопары, но я от неё отказался в пользу более скоростного решения.
Дисплей WH2004, 20 символов х 4 строки,
я брал именно такой, тут
Очень яркий и хорошо читаемый под углами дисплей.
К нему ещё потребуется плата, для подключения через I2C-шину.
Плата такая
Спасибо, с этим разобрался. Индикатор у меня есть графический с библиотекой. Попробую его приспособить.
А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе, инвертировав соответствующий сигнал. И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?
И еще. 4-е выводы оптопар лучше подключить к плюсовому выводу конденсатора С1 и резисторы R4 и R8 увеличить до 10к. Это позволит снизить падение напряжения на открытых транзисторах ШИМ.
>>А нельзя ли отказаться от реле, выполнив защиту непосредственно на управляющем элементе
Защита больше предназначена от пробоя управляющего элемента, когда его отключение ничего не даст. В канале паяльника, наверное, можно убрать реле (не попадалось слуучаев самовозгорания паяльников, если управляется полевиком, но для фена я бы на защите не экономил.
Что бы не случилось вот так -
или вот так, как на видео.
Вот ещё...
Хотя, многие эксплуатируют вообще безо всяких защит...
>>И для управления нагревателем применить оптрон со встроенным детектором нуля, например MOC3063?
Нет, тогда фазоимпульсное управление не будет работать. Нужно будет переделывать регулирование.
OlegK добрый день
Понравилась ваша разработка, планирую повторить, у меня в хозяйстве много дисплеев 1602 сразу с шиной i2c (под адрес 0x27), можете под мой дисплей переделать скетч вывод информации!? (привожу пример как это может выглядеть)
Не вижу особых трудностей, кроме, как то, что в строке меньше символов - 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 символов это не увеличит ))
Спасибо, за пояснения, думаю справлюсь, хотя с ардуино начал мастерить 2 месяца назад загорелся интеллектуальной зарядкой (https://www.drive2.ru/b/2652964/) сделал понравилось и затянуло.
Поэтому в идеале если подскажите в каких строчка кода играться, то буду благодарен (сам язык ардуино не знаю, но местами править могу :)
Я ж выше подсказал - откройте мой исходник, и найдите там две процедуры - initDisplay() и DisplayUpdate()
В первой, я вывожу на дисплей те надписи, которые не нужно менять в процессе работы - в самом первом ряду и самой первой колонке. Это выполняется в коде только один раз.
Во второй процедуре выводится те значения, которые обновляются. Можно было запихать всё в один кусок кода, но мне захотелось убрать моргания дисплея.
Так как у вас не будет лишних надписей, то удаляете совсем initDisplay(), а в процедуре DisplayUpdate() пишете вывод данных, с учётом вашего дисплея.
Т.е. сперва "чистите" весь экран
затем выводите что-нибудь, к примеру, начиная с 4 символа первой строки -
Ну и процедуру Splash() удаляете или редактируйте под свой экран - она выводит "приветствие" при старте станции.
Для простоты, сделайте отдельный проект, где потренируйтесь выводить какие-нибудь числа в нужные вам позиции. Когда придёт понимание того, что делаете, можно будет исправить и код станции.
Спасибо поэксперементирую, позже отпишусь. Вместо транформатора заказал импульсник 24V, 4-6A, теперь хочу понять как в этом случае упрощается схема Power? что убрать? 9 вольт видимо сделаю через понижающий модуль DC- DC запитаю от импульсника
Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос? (помогите) выпаивать реле не хочется :)
Диодные мосты.
Еще у меня есть такой релейный модуль, полагаю его тоже можно использовать, но как, это вопрос?
Релейный модуль уже имеет на борту оптопары, поэтому можно его подключить напрямую к "дуине", не запаивая на силовую плату те компоненты, которые относятся к реле - оптроны, транзисторы, диоды. Контакты реле, соответственно тоже нужно не забыть подключить в цепи нагревателей.
Работать будет, но получится не компактно и проводов лишних добавится.
Схему модуля (один канал) можно глянуть тут.
Подправил код под свой дисплей, конечно не товарный вид, но мне не на продажу, а для себя :) приветсвие сократил чтобы влазило. Fan вместо 100% сделал 99% S:=Soldier, A:=HotAir
1) У вас переход знака установки ">" идет циклично снизу-вверх, будет ли он корректно переходить на установку скорости вентилятора ?
2) Ранее вы писали про занчение ZZ - таймера паяльника или фена, видимо я про них забыл? или не увидел где выводится.
Ниже выкладываю код:
Ну, вполне нормально получилось.
1. Да, индекс параметра для регулировки переключается по кольцу, а так как символ выбранного значения ">" находится всегда в одной позиции по горизонтали, то я меняю только вертикальную координату.
Т.к. в вашем случае, позиция вывода меняется и по вертикали и по горизонтали, то придётся сделать так:
1. "Чистить" без цикла, последовательно - выводить пробелы в те места, куда выводится ">"
2. Затем выводить, взависимости от значения SelectedMode
Таймер выводится так (в данном случае 10 минут). Это поле имеет такие значения - если выключено, то не выводим ничего, если включено, то выводится значение таймера, если сработала защита, то выводится символ "!"
Спасибо как все детали придут соберу отпишусь (также заказал на всякий случа дисплей 2004), заметил что в описании версии скетча написано версия 1.0 неужели за время пользования не было апдейов?
И еще вопрос реле с реелейного модуля который ранее описывал подойдут (если выпаять)?
Нет, как ни странно, но это единственная версия, писалась практически за один раз, если не считать промежуточного скетча, где обкатывалось ФИ-регулирование, без автоматики.
А если работает и косяков не выявилось, то и обновлять, вроде, нечего ))
А, забыл - увеличил верхний предел температуры паяльника до 400 град, мало ли, какой бессвинцовый припой попадётся. Это корректируется константой max_solder_temp
Реле подойдут любые, способные коммутировать ток нагрузки.
От их напряжения срабатывания будет зависеть, как их запитать.
У меня не нашлось реле на 24В, только на 12, поэтому запитаны от обмотки на 24В через стаб 7812.
В вашем релейном модуле пятивольтовые реле, вроде?
Можно запитать тоже через стаб (7805), но его вход перекинуть на выпрямитель 9-вольтовой обмотки.
Ну и рисунок платы сравнить с распиновкой реле - совпадает ли...
ЗЫ. По защитным реле. Учитывая, что они защитные, под нагрузкой ими ничего не коммутируется (если не пробит регулирующий элемент "РЭ") - при включении, сперва включается реле, затем открывается РЭ, при выключении - сначала выключаем РЭ, затем, с небольшой выдержкой, выключаем реле. Это сделано для того, что бы исключить подгорание контактов.
Олег доброго дня, есть несколько вопросов, если не сложно прокомментируйте
1. По реле вопрос: Я правилно понимаю что если я буду использовать реле на 24 вольта, то могу отказаться от стабилизаторов 7812 и соотвественно радиаторов и обвязки в виде 4-х конденсаторов для них? (напомню у меня будет испульсник на 24 вольта + от него модуль DC-DC с понижением до 9 вольт)? .... и соотвественно убираю диодные мосты, предохранитель на 10A?
2. Плата усиления сигнала, ранее вы писали что ставили AD8552 на самой плате подпись LM358, вы переделали код под 358? (и еще я данную плату показывал спецу и ему показалось что LM установлена наоборот, у нее класический вариант установки или с обратной стороны?)
3. На плате MCU под ардуиной справа есть разъем двойной (рядом с конденсатором на 100), к сожалению он не подписан, что это?
1. Да.
2. У меня сейчас стоит AD-ха. LM-ка устанавливалась классически, со стороны деталей, в панельку. Туда же установлена AD-ха, но через переходник, т.к. она в SOIC-е (на картинке, в первом сообщении видно). В рисунке платы ничего менять не нужно. Код - под AD-ху. Для LM потребуется незначительное изменение.
3. Этот разъём незадействован, выведен на всякий случай, вдруг чего на него навесить приспичит. Можно его не устанавливать.
Добрый вечер.
А можно по подробнее, какие изменения необходимы под LM358. Начинаю паять платы. И начинаю собирать станцию.
Спасибо.
Изменений всего ничего -
заменить на
И аналогично в канале паяльника.
Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.
Просто AD8552 - rail-to-rail ОУ, поэтому макс. выходное напряжение у него практически равно питающему. Поэтому и делим на 2. Ну и дрейф нуля очень малый, не уплывают параметры - потому и заменил на него.
Олег доброго дня, а в чем эта на практике заметна разница между микросхемами (я не спец ...) одна 15 р. стоит другая 150 р.
И еще вопрос: около биппера вывод не подписан, он за что отвечает? (вопрос уже раньше был, но ответа я не расшифровал)
Особо никакой, если не заморачиваться ))
Скажем так -
1. У ЛМ-ки, после включения, какое-то время "плывут" показания, у АД-хи такого эффекта нет.
2. Если нужно более точное регулирование (0.5 град. вместо 1, как сейчас), то с АД-хой это можно сделать при текущем питании (5 вольт). Но и текущей точности - за глаза.
Ставьте LM-ку, если в дальнейшем что-то не понравится, то заменить на AD-ху очень просто, если стоит панелька. Панельку, если будете ставить, ставьте цанговую - надёжнее.
Два контакта, чуть выше бипера? У меня там джампер копмповый - отключал им звук во время настройки.
Сейчас он у меня установлен, но бипер заклеен кусочком скотча, что бы не так громко орал.
Ещё тумблер можно воткнуть, если нужно отключать звук (ночью, к примеру).
Олег доброго дня, начал собирать Power плату и случайно посмотрел на вашу сборку, и возникло предположение что ваша плата в Layout уже отзеркалена!? Если смотрел на ваш Layout схему то получается смотришь на перевернутую плату а не на дорожки снижзу, это так?
Нет, я всегда рисую дорожки со стороны печати, т.е., как выглядело бы, если реальную плату перевернуть. Следовательно, перед печатью, нужно поставить "зеркальную" галку.
Нет, я всегда рисую дорожки со стороны печати, т.е., как выглядело бы, если реальную плату перевернуть. Следовательно, перед печатью, нужно поставить "зеркальную" галку.
Попался я!!! (надо переделывать), обычно все делают наоборот рисуют по схеме (делают трасировку) с пониманием что это вид дорожек под текстолитом. Тогда в вашем случае не однозначно воспринимаются маркировка деталей при пайке надо думать как-бы наоборот (смотреть на дорожки и вставлять деталь с обратной стороны, если ты конечно не разработчик платы и все знаешь...)
>>Попался я!!!
Сочувствую...
Всегда можно проверить, перед печатью, хотя бы по распиновке стабилизатора, где вход - это первая нога.
Я без притензий это опыт :) ... Я понял по микросхеме MOC что-то не так, первая нога не совпадала, подумал что один из вариантов корпуса (бывает такое ...)
Пару вопросов:
1.Для чего стабилитрон на радиаторе под управлением MOC (не могу разобраться)?
2.Какое напряжение выставить на DC-DC 5 или 9 вольт?
Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.
Если преобразователь стабилизированный и питать контроллер напрямую с него, то 5 вольт, если не стабилизированный, то выставить 8-10 вольт и подать на вход стаба 7805.
Я тоже, по первости, так влетал. Теперь всегда смотрю по распиновке элементов, прежде, чем печатать чьи-то платы.
Не понял, о чём речь, стабилитронов в схеме вообще нет. MOC управляет симистором, радиатор под него установлен самый маленький, он, в общем-то, больше для механической прочности, чем для охлаждения.
Ошибся, я про симистер :) у него какая маркировка? Также у вас в архиве файлс расширением ms13? это видимо схема, чем ее открывать подскажите?
Симистор - BT138
ms13 - это файл симулятора узла контроля 0 сети. Открывается в Мультисим не ниже 13-й версии.
Это я из нескольких схем выбирал и эта понравилась больше других.
Выглядит так -
Добрый вечер, решил повторить вашу станцию, вы сделали титанический труд и позвольте Вам сказать за это спасибо.
У меня есть несколько вопросов, можно их задавать по ходу сборки станции?
Я слегка переделал разводку плат под другие кнопки и основной вопрос по плате Power, я ее переделал под блок питания на 24в, можете посмотреть правильность монтажа?
https://yadi.sk/d/rjPxEZwaqzdPe файл лежит здесь. И если нужно я могу выложить фотки собранных плат, конечно с Вашего одобрения. Спасибо
Спасибо на добром слове ))
Запросто - для того и тема.
На свой глаз подрихтовал, в основном чуть гармонии навёл по дорожкам - https://yadi.sk/d/2jBgYQAGqzgWn
Думаю, не только мне будет интересно, конечно выкладывайте - любой опыт полезен будет...
Также присоединяюсь к благодарности за работу автора и особо выделяю отзывчивость в части рекомендаций и советов (это ценно) спасибо. Особо привлекло в разработке отношение к безопастности системы (мне есть с чем и с кем сравнивать).
Свой экземпляр почти повторил жду фена, паяльника и ардуино, платы готовы, также доработал схемы в основном для уменьшения размера, применил реле на 24 вольта, и модуль понижайки до 5 вольт (мне так удобней).
Увидел, что в последнем варианте от Руслана установлен предохранитель на 10А насколько это оправдано учитывая что видимо запитка будет от БП постоянным напряжением 24 вольта!?
Выкладываю свой вариант менял в основном Power и MTU - здесь
Нормально. Я лепил из того, что было в наличии - надо ж куда-то хлам расходовать ))
Этот предохранитель есть в моём варианте.
10 ампер, конечно, многовато в нормальном режиме, только в начале разогрева холодного нагревателя ток достаточно большой - можно поставить и поменьше, ампер на 5, если при старте не будет перегорать.
В принципе, ставить предохранитель или нет - дело добровольное, но мне он показался не лишним - паяльник имеет шнур, который постоянно туда-сюда дёргается. Учитывая, что и паяльник и шнур китайские, может вдруг и "кэзнуть" внутри шнура или паяльника (теоретически). Понятно, что от вылета регулирующего транзистора предохранитель не поможет, но, по крайней мере, спасёт выпрямитель и транс (в моём случае). Ну, или провода не поплавятся ))
Ага, MCU покомпактнее будет. Я его делал в размер платы индикации, что бы скрутить бутербродом, поэтому там и пустого пространства хватает. Можно в пустом месте разместить пятачков с шагом 2.54 мм и использовать, если приспичит что-либо доработать.
Здравствуйте, платы спаял, корпус подготовил, платы спалил, починил))
Добавлю фото того что сделал. (архив буду обновлять по готовности проекта).
https://yadi.sk/d/fIG39OFlrDK9H
Платы делал первый раз за почти 10 лет))) Зато какое удовольствие делать проект своими руками.. не зря я учился на РЭТ, эх ностальгия по юнности)) Прошу сильно не пинайте.
Плату питания почти всю переработал, запустил в тесте вроде как все исправно. Блок питания на 24в, реле на 24в. Убрал почти все перемычки. Номиналы некоторых конденсаторов и резисторов заменил. Питание 5в взял с зарядки от телефона ксаоми, там как ни странно оказался суперкачественный БП с шимкой, сделал отдельным модулем.
Здоровая критика приветствуется.
Теперь пара вопросов к автору проекта.
По ардуинке, я заливал тестовый пример Blink, залил тест для дисплея 1602, попытался даже дисплей от нокии 1202 прикрутить)) работает но с кракозябрами. Далее моих познаний новичка не хватило. Подскажите пожалуйста как, куда и что залить, или ткните носом в инструкцию, я честно говоря запутался... Использую экранчик 1602 и LM358.
PS так и не понял как сделать отверстие в корпусе компьютерного блока питания под авиационный разьем, пришлось кромсать и ломать... может кто подскажет? Еще не придумал из чего сделать ножки к станции.
И на чертеже и на фото силовой платы косяк - пятак перемычки, что идёт к пину "ZC" разъёма соединён с дорожкой, соед. пин этого же разъёма "HA" и светодиод оптопары. Т.е. канал фена не заработает совсем.
Выводите на кириллице? Дисплей инициализирован правильно (строки, кол-во символов)?
1. Обсверлить периметр отверстия тонким сверлом + круглый напильник.
2. Ступенчатое сверло.
Самое простое - применить прямоугольнички из достаточно толстой резины или поискать резиновые крышки от пузырьков, которые прокалываются шприцем (в таких ещё раньше зелёнка была).
Извиняюсь, старое фото платы залил ( На плате уже перерезал дорожку перед установкой в корпус), на схеме сейчас перенесу перемычку и обновлю архив.
1602 работает как надо)
Нокиа 1202 как в этой теме f-ку выводит а дальше что делать не пойму..
Спасибо
https://yadi.sk/d/kMU_jTD1rDS6n
Использовать 1602 - в сообщении 65 Sergant уже привёл код для него...
Использовать 1602 - в сообщении 65 Sergant уже привёл код для него...
Примечание: Я не настроил вывод ТАЙМЕРОВ, поэтому правка для 1602 не законченная (таймеры не будут отображаться), жду прихода деталей и плотно займусь ...
Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить немного места.
Как вариант, вместо 99% выводить от 1 до 9 - девять скоростей, в принципе, должно хватить.
Тогда всё можно отдвинуть правее и освободить немного места.
Хорошая идея, я также подумывал убрать буквы слева (хочу напечатать на принтере названия строк и столбцов все равно они статичны) и таймеры сделать в конце
Тоже выход ))
Добрый день, вчера наконец получил на почте паяльник и фен, и закончил сборку станции.
Вы будете смеяться, я застрял на моменте заливки прошивки в nano... подскажите или ткните в мануал, что сделать по пунктам чтоб установить прошивку.
В Libraries есть три папки -Bounce2 -CyberLib -LiquidCrystal_I2C1602V1
В SS_3 лежит скетч(я правильно надеюсь понимаю)
Что сделал я, подключил библиотеку Bounce1, открыл файл SS_3, внес изменения под дисплей 1602 (скопировал код у Сержанта), внес изменения для LM-ки и при заливке получаю ошибку "Ошибка компиляции для платы Arduino Nano". что я делаю не так? и как надо?
Bounce2, CyberLib, LiquidCrystal_I2C - эти библиотеки должны находиться в папке Libraries директории Arduino IDE
>>подключил библиотеку Bounce1
А зачем? В скетче же уже подключена более новая версия этой библы.
Кроме ошибки компиляции, что ещё выдаёт? По идее, должно указываться, что компилятору не понравилось конкретно...
[spoiler]
In file included from C:\Users\r\Desktop\Фото станции\SS_3\SS_3\SS_3.ino:3:0:
Вот ошибки
Вот то что пробую залить
1. Для начала, уберите из инклюдов ВСЕ лишние объявления "боунсов", кроме Bounce2 - нафига их там столько?
объявление для DwnButton
на место (секция Bounce Killers)
2. >>SS_3:558: error: 'DwnButton' was not declared in this scope
Верните
3. Аналогично п.1 и для библиотеки LiquidCrystal_I2C, т.е. прочитайте первую строку сообщения 96, где они должны быть.
Спасибо, все поправил, дисплей висел по другому адресу шины IC2.
Запустил сканер адресов и все стало на свои места.
Теперь вопрос по поводу датчика в подставке паяльника, если его не подсоединять что-то нужно менять в скетче?
Не нужно, просто таймер не будет сбрасываться, если подставка не подключена.