Ссылки нужно копировать,вставлять в поисковую строку и тогда работает.На этом форуме ссылки ничего не показывают.Видимо что то делаю не так,не разобрался как вставлять ссылки.
Всем привет, при разогреве паяльника пропала индикация ":" и "*", сразу после щелчка реле при включении канала, начинает расти температура жала и сразу светит мигающий "10" , хотя бип на стабилизации присутствует. Что может быть ?
Это нормальное поведение.
Если паяльник запущен на подставке, то индикации ":" и "*" не будет, а высветится время таймера до выключения (т.н. "мигающий 10"). Звуковая индикация будет.
При снятии с подставки таймер отключится и заработает индикация ":" и "*", равно как и при запуске вне подставки.
Да, поменяйте на другой свободный.
Вообще, по уму, конечно, лучше отвязать "концевики" и фена и паяльника оптопарами, что бы исключить
любые внешние воздействия на эти пины.
Верхняя строка индикатора фактически пустая пусть будет Prehitor xxx. Т.е. выводить температуру от еще одной LM. У контроллера пустые ноги еще есть. Подогрев штука инерционная поэтому температуру можно регулировать тупо диммером что-бы не заморачиваться.
Если есть время и интерес помогите пожалуйста со скетчем.
Если есть время и интерес помогите пожалуйста со скетчем.
Приветствую. К сожалению, и с тем и с другим напряг жёсткий ))
Попробуйте самостоятельно или может кто ещё присоединится.
Я бы посоветовал начать плясать пошагово вот от чего -
0. Пролистать имеющийся скетч и уяснить, что где происходит и как оно между собой взаимодействует - будет намного проще вкорячивать туда что-то дополнительное или выкидывать ненужное.
1. Управление-измерение. Понадобится один аналоговый вход под усилитель термодатчика, один пин под кнопку включения стола подогрева и один под оптопару с симистором для релейного регулирования ("вкл-выкл"). Т.к. в оригинальной схеме все аналоговые входы заняты, то придётся освободить от какой либо кнопки и переподключить её на другой пин. Тут можно, например, выкинуть выход на буззер. По выход на оптопару использовать пин 2 (на оригинальной схеме он зарезервирован). Под кнопку вкл. стола - пин 11
2. Индикация. Можно, да, использовать верхнюю строку дисплея, тут смысл в том, что надписи, которые не меняются, выводятся один раз, в процедуре initDisplay, а всё остальное в DisplayUpdate, по аналогии с остальным.
3. Регулирование. По причине инерционности, можно попробовать порегулировать релейно, путём вкл-выкл нагревателя (если температура ниже заданной, то включаем, выше - выключаем). Тут лучше поставить оптосимистор со встроенным зеро-кросс + симистор.
4. Защита. Релейное отключение добавить не плохо бы также, но пины уже закончились (если не считать 0 и 1).
Итого - может проще сделать стол на отдельном контроллере? ))
Основная схема без изменений (под несколько плат- Олега). только с кнопок 2 провода подключены вместо А0 и А1 к резервным D2 и D11. Остальные кнопки остались на своих местах. А на А0 иА1 подкличены выходы со второго ОУ.
Вообще у меня 1й канал второй AD8552 занят термопарой вмонтированной в корпус ПС(для большого паяльника, оловоотсоса и т.д.), а второй канал хотел пустить на защиту фена от неисправного вентилятора. на вход подал сигнал от датчика Холла, которое с фиритовым кольцом измеряет ток потребления вентилятора. И если ток равен нулю(обрыв, либо может полевик полетел) или больше заданного, например заклинило моторчик(как у меня однажды было) то должна сработать защита(пока в прошивке её нет, просто вывел на экран значения).. Никак не могу подобрать номиналы обвязки усилителя..
Всем привет, повторил станцию, все было хорошо, до вчерашнего дня, начал уходить блок в защиту как при кз и греется транзисторы, в итоге оба сгорели, заменил и если подать 24 в буквально за пару секунд нагреваются, если вытянуть ЛМ и включить паяльник пару секунд он греется,, а дальше автоматика отрубает его, с другой ЛМ тоже не работает, визуально все нормально
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Тут логично заподозрить китайский блок, ведь с ноутбучным работало нормально.
Нагреватели с терморезистором (керамические), при холодном старте потребляют большой ток (порядка 8А), кратковременно, правда, но этого может хватать для срабатывания защиты питальника. Для этого в скетче есть вариант работы с "мягким стартом" в начале нагрева (просто скважность уменьшена до определённой температуры) вроде помогает.
Если не включать канал паяльника а просто подать питание нагреватель не греется? КОнтакты защитного реле само-собой замкнуть надо.
Если да, то помимо транзистора неплохо было бы проверить и оптопару им управляющую - возможно она неисправна, мосфет сразу распахивается и нагреватель большим током "садит" БП.
К стати, если станцию выключить и подать 24 вольта те транзисторы за пару секунд разогреваются так, что пальцем дольше 2х секунд не удержишь и на блоке от ноутбука сейчас тоже не работает
Извините, что вмешиваюсь, но по моему если включить логику получается мосфет греется от чрезмерной нагрузки соответственно снимаем нагрузку ищем коротыш . мосфет без нагрузки по определению не должен нагреваться так как путь тока а мосфете от стока к истоку и по идее в этом месте нагрев . либо если оптопара пробита и пропускает ток на ворота мосфета тогда он постоянно открыт в любом случае вам искать или в обвязка мосфета или в его нагрузке ещё примите к сведению, что максимальное напряжение для вывода gate вашего мофета скорее всего до 20 вольт .Отсюда возникает вопрос сколько импульсный китайчонок не самого высокого качества может выдать вольт в пике и сколько являются летальными для мосфетов... Ведь от бп от нубука всё работало.
Согласен с Секешфехервар, вполне возможно превышение допустимого на затворе.
Если в этом проблема, то лучше увеличить резистор от эмиттера оптопары на затвор мосфета до 3кОм - напряжение на затворе понизится с 24 до 18В. Также, к этому, можно с затвора на землю поставить стабилитрон на 15-18 вольт.
Добрый день , подскажите куда копать, пересобрал данную станцию но уже под терморезистор в паяльнике (3.8 0м) в итоге фен работает нормально , паяльник греется но на дисплее температура не меняется , номиналы обвязки лмки проверил , перепрошил Ардуино , пробовал настраивать канал паяльника многоооборотными резисторами результат 0 . https://youtu.be/JvbrfGgl1_E
Может виной нагреватель , я его покупал отдельно с Али а нужно было купить паяльник в сборе ?
До этого мучался месяца 3 с паяльником на ТП так и не смог настроить , забил с заделал новую плату.
При нагреве паяльника Ваш измерительный элемент должен реагировать на изменения проверяйте возле лм'ки, в паяльнике. В моём случае кабель паяльника сломался через примерно 3 месяца неактивного использования.
Симптомы нагрев в определённом положении паяльника
Лечение 4 жильный кабель 0.5 кв мм, не советую использовать длинный кабель с ним больше мороки чем удобства.
По фену сейчас тож проблема : неконтролируемый нагрев до срабатывания защиты если фен лежит на столе то всё норм подозреваю, что виноват кабель, но разбираться нет времени.
Около 3-х ом - это сопротивление нагревателя, у терморезистора - в районе 50 Ом. Похоже, что перепутаны нагреватель с термодатчиком. Тут уже было такое.
Во втором посте темы я выкладывал -
По нагревателям. Сопротивление керамического нагревателя при комнатной температуре составляет около 2,5–3,5 Ом. Термодатчик - терморезистор. Его сопротивление — примерно 43–58 Ом. У нихромовых нагревателей при комнатной температуре нагреватель имеет сопротивление около 10–17 Ом, а термодатчик - термопара, сопротивление, приблизительно 2–3 Ом.
Цитата:
паяльник греется но на дисплее температура не меняется
Под терморезистор схема усилителя несколько отличается от того, что для термопары.
Да, вы правы, спасибо, я лоханулся, причем читал на форуме этот случай ,и пересматривал много раз сопротивление и почему то тупил, поменял местами провода датчика и нагревателя, как надо и теперь другая проблема похоже на кз и станция перезагружается в понедельник думаю всё ещё раз перепроверить https://youtu.be/fv92ii-mSNU
Что не делал, не хочет работать,
поменял транзисторы bc337, irfz44n, отпаял оптроны и все равно кз, заметил то, что если подать 24 в, то норм, если потом включаю питание станции, то блок в защиту уходит
Заработала, все дело в китайских бракованный деталях, заменил диоды (был один сгоревшей) и как на зло один новый оказался бракованным и с bc 337 тоже самое, и все, заработало, заменил на китайском импульснике конденсаторы, на получше и поемче, все равно в защиту уходит, до замены до 100 градусов уходил, после до 80, мягкий старт включён
Так то то там вариантов много прежде чем ноги менять глянуть в даташит... У меня с путаными ногами симистор не закрывался. Пробуйте подать питание на моську если симистор открывается закрывается то силовая цепь в норме.
Да, вы правы, спасибо, я лоханулся, причем читал на форуме этот случай ,и пересматривал много раз сопротивление и почему то тупил, поменял местами провода датчика и нагревателя, как надо и теперь другая проблема похоже на кз и станция перезагружается в понедельник думаю всё ещё раз перепроверить https://youtu.be/fv92ii-mSNU
В общем перепроверил правильность подключения все ок, выходит что при включении канала паяльника китайский блок уходит в защиту, без подключения нагревателя все щелкает и работает . На Ютубе советовали уменьшить мощность паяльника , подскажите как это можно сделать?
Вот еще информация кассающая адресов дисплея этих платокhttp://arduino.ru/sites/default/files/u7266/i2c_module_150.jpg https://www.robotics.org.za/image/data/Display/I2C_display/LCD2004_02_address.jpg
Ссылки нужно копировать,вставлять в поисковую строку и тогда работает.На этом форуме ссылки ничего не показывают.Видимо что то делаю не так,не разобрался как вставлять ссылки.
Лучше сразу картинкой

Всем привет, при разогреве паяльника пропала индикация ":" и "*", сразу после щелчка реле при включении канала, начинает расти температура жала и сразу светит мигающий "10" , хотя бип на стабилизации присутствует. Что может быть ?
Это нормальное поведение.
Если паяльник запущен на подставке, то индикации ":" и "*" не будет, а высветится время таймера до выключения (т.н. "мигающий 10"). Звуковая индикация будет.
При снятии с подставки таймер отключится и заработает индикация ":" и "*", равно как и при запуске вне подставки.
При снятии с подставки таймер отключится и заработает индикация ":" и "*", равно как и при запуске вне подставки.
Давненько Вас не видно было. :)
Ага, на место преступления потянуло ))
А мы рады Вас видеть. Надеюсь, в добром здравии. :)
Спасибо, взаимно :)
Катаклизмы преходящи, а желание что-нибудь куда-нибудь припаять или потыкать в кнопки неистребимо.
А если нет геркона и на пине D9 0Вольт при вкл. или выкл. канале паяльника ?
Блин, похоже пин отгорел, при подтяжке резистора на 10кОм с D9 на +5Вольт, на D9 0.1Вольта. Между пином и массой 180 Ом !
достаточно ли поменять пин в разделе /* Buttons */, чтобы геркон на D11 повесить ?
с
на
Да, поменяйте на другой свободный.
Вообще, по уму, конечно, лучше отвязать "концевики" и фена и паяльника оптопарами, что бы исключить
любые внешние воздействия на эти пины.
Все заработало, заодно геркон засунул в паялку. И как я мучался раньше постоянно тыкая кнопку, когда минута оставалась. Спасибо за помощь.
.
Вопрос к OlegK хочу прикошачить к Вашей станции нижний подогрев примерно такой https://ru.aliexpress.com/item/1-150-60x70/33001958290.html?spm=a2g0o.cart.0.0.27213c00x13Df1
Верхняя строка индикатора фактически пустая пусть будет Prehitor xxx. Т.е. выводить температуру от еще одной LM. У контроллера пустые ноги еще есть. Подогрев штука инерционная поэтому температуру можно регулировать тупо диммером что-бы не заморачиваться.
Если есть время и интерес помогите пожалуйста со скетчем.
Ха, у меня как раз в планах на базе данной станции термостол сделать. Но, пока только в планах :))))
Приветствую. К сожалению, и с тем и с другим напряг жёсткий ))
Попробуйте самостоятельно или может кто ещё присоединится.
Я бы посоветовал начать плясать пошагово вот от чего -
0. Пролистать имеющийся скетч и уяснить, что где происходит и как оно между собой взаимодействует - будет намного проще вкорячивать туда что-то дополнительное или выкидывать ненужное.
1. Управление-измерение. Понадобится один аналоговый вход под усилитель термодатчика, один пин под кнопку включения стола подогрева и один под оптопару с симистором для релейного регулирования ("вкл-выкл"). Т.к. в оригинальной схеме все аналоговые входы заняты, то придётся освободить от какой либо кнопки и переподключить её на другой пин. Тут можно, например, выкинуть выход на буззер. По выход на оптопару использовать пин 2 (на оригинальной схеме он зарезервирован). Под кнопку вкл. стола - пин 11
2. Индикация. Можно, да, использовать верхнюю строку дисплея, тут смысл в том, что надписи, которые не меняются, выводятся один раз, в процедуре initDisplay, а всё остальное в DisplayUpdate, по аналогии с остальным.
3. Регулирование. По причине инерционности, можно попробовать порегулировать релейно, путём вкл-выкл нагревателя (если температура ниже заданной, то включаем, выше - выключаем). Тут лучше поставить оптосимистор со встроенным зеро-кросс + симистор.
4. Защита. Релейное отключение добавить не плохо бы также, но пины уже закончились (если не считать 0 и 1).
Итого - может проще сделать стол на отдельном контроллере? ))
Ага, я как раз так и собираюсь делать. Сначала стол, а потом, если понадобится и верх инфракрасный.
Добрый вечер!! Как раз дополнил скетч еще на два доп. входа.. Только нужны аналоговые входы. Пришлось перепаять провода от кнопок..
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Soldering Station v 1.6.1 */ /* coded by OlegK */ /* arduino.ru/forumy/proekty/ocherednaya-payalnaya-stantsiya */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include <EEPROM.h> #include <CyberLib.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Bounce2.h> #include <avr/io.h> #include <avr/interrupt.h> /* it's fuckin' magic! */ #if 1 __asm volatile ("nop"); #endif /* Options */ /* if you need to create themperature diagramm then uncomment it */ //#define NEED_GRAPH /* if used not rail-to-rail OPA, then uncomment it */ //#define LM358 /* if used passive busser, then uncomment it */ #define PASSIVE_BUZZER /* if you want deactivate additional protection, then COMMENT it */ #define HA_ADV_PROT_ON #define S_ADV_PROT_ON /* if used LCD 1602, then uncomment it */ //#define LCD_1602 /* Soldering iron - if you want to remove the digit jumps, then uncomment it */ //#define SOLDER_DIGIT_JUMPS_REMOVE /* Hot Air - if you want to remove the digit jumps, then uncomment it */ //#define HOTAIR_DIGIT_JUMPS_REMOVE /* if you want soldering iron soft start, then uncomment it */ #define SOLDER_SOFT_START /* if you want to activate soldering iron off-timer only on stand, then uncomment it */ #define SOLDER_TIMER_ON_STAND /* End options */ #define FIRMWARE_VERSION "1.6.1" #ifdef LCD_1602 LiquidCrystal_I2C lcd(0x3F, 16, 2); #else LiquidCrystal_I2C lcd(0x3F, 20, 4); #endif /* Degree symbol */ uint8_t degree[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; /* Arrow symbol */ uint8_t arrow[8] = { B00000, B00100, B00010, B11111, B00010, B00100, B00000, B00000 }; /* mode selector */ #define modeSolder 1 #define modeHotAir 2 #define modeFanPWM 3 boolean need_S_countdown = false; byte selected_Mode = modeSolder; byte HA_countdown = 1; byte S_countdown = 1; uint16_t HA_sleeptime = 10; uint16_t S_sleeptime = 10; uint16_t Graph_count = 0; uint32_t UPbuttonPressTime = 0; uint32_t DWNbuttonPressTime = 0; uint32_t SONbuttonPressTime = 0; uint32_t HAONbuttonPressTime = 0; boolean UPbuttonState, DWNbuttonState, SONbuttonState, HAONbuttonState; byte Count; uint16_t Duration, Interval; char bspace[ ] = " "; #define pinBuzzer 12 #define pinFanPwm 6 #define pinSolderPwm 5 #define min_solder_temp 70 #define max_solder_temp 400 #define min_hotair_temp 20.0 #define max_hotair_temp 450.0 #define min_rpm 30 #define max_rpm 100 #define default_temp 280 #define default_rpm 50 /* Buttons */ #define sw_HA 10 #define sw_S 9 #define bt_SON 13 #define bt_HAON 11 #define bt_Sel 17 #define bt_Up 2 #define bt_Dwn 16 /* Bounce killers */ Bounce swHotAir = Bounce(); Bounce swSolder = Bounce(); Bounce SolderOnButton = Bounce(); Bounce HotAirOnButton = Bounce(); Bounce SelButton = Bounce(); Bounce UpButton = Bounce(); Bounce DwnButton = Bounce(); /* Hot Air */ /* states */ #define st_stop 0 #define st_work 1 #define st_pause 2 #define st_protection 3 //#define st_lowpower 4 byte hotair_state = st_stop; volatile uint16_t ots = 9990; volatile float HAPower = 0.0; uint16_t GetDT = 0; uint16_t GetRT = 0; uint16_t GetHotAirT = 0; uint16_t SetHotAirT = 100; byte SetHotAirRPM = 100; boolean HA_temp_stable = false; boolean need_Cooling = true; boolean scr_blink = false; byte ha_error = 0; boolean HA_prot_beep = false; boolean ha_f1 = false; boolean ha_f2 = false; uint32_t prevHAcontrol; /* HA PI regulator */ #define Kp 1.0 #define Ki 0.007 int integral = 0; /* Soldering iron */ uint16_t GetSolderT = 0; uint16_t SetSolderT = 100; boolean S_temp_stable = false; boolean SolderON = false; boolean SolderProtect = false; int SPower = 0; //byte solder_state = st_stop; byte s_error = 0; uint32_t prevScontrol; boolean S_prot_beep = false; boolean s_f1 = false; boolean s_f2 = false; /* Solder P regulator */ #define sKp 30 uint16_t last_HotAirT, last_SolderT; byte last_RPM; /********************************************* MAIN PROCEDURES *********************************************/ void setup() { //ADC change speedup //ADCSRA &= ~(1 <<ADPS2) | (1 <<ADPS1) | (1 <<ADPS0); // reset default divider 128 //ADCSRA |= 1 <<ADPS2; // set div to 16 (1MHz) //ADCSRA |= 1 <<ADPS1; // set div to 64 (250kHz) pinMode(3, INPUT_PULLUP); //Zero cross pin D5_Out; //pinSolder D5_Low; D4_Out; //pinSolderProt D4_Low; D7_Out; //pinHotAirProt D7_Low; D8_Out; //pinHotAir D8_Low; D12_Out; //pinBuzzer D12_Low; ButtonsSetup(); #ifdef NEED_GRAPH Serial.begin(9600); #endif lcd.init(); lcd.backlight(); lcd.createChar(0, degree); lcd.createChar(1, arrow); Splash(); MemRead(); delay_ms(2000); initDisplay(); attachInterrupt(1, ZC, FALLING); } void loop() { ScanButtons(); /* Off-timer for HotAir, countdown with 1 min */ static uint32_t prevHAmillis = millis(); if (hotair_state == st_pause) { if (millis() - prevHAmillis > 60000) { prevHAmillis = millis(); if (HA_countdown > 1) { HA_countdown--; if (HA_countdown == 1) { Beep(100); //Beep, if 1 minute left } } else { hotair_state = st_stop; Beep(200); } } } else { prevHAmillis = millis(); } /* Off-timer for Solder, countdown with 1 min */ static uint32_t prevSmillis = millis(); if (need_S_countdown) { if (millis() - prevSmillis > 60000) { if (S_countdown > 1) { S_countdown--; if (S_countdown == 1) { Beep(100); //Beep, if 1 minute left } } else { MemSolder(); need_S_countdown = false; SolderON = false; Beep(200); } prevSmillis = millis(); } } else { prevSmillis = millis(); } /* Update LCD with 500ms interval */ static uint32_t prevDisplayMillis = millis(); static boolean blink_state = true; if (millis() - prevDisplayMillis > 500) { scr_blink = ! scr_blink; prevDisplayMillis = millis(); DisplayUpdate(blink_state); blink_state = !blink_state; /* Send data to Serial port */ #ifdef NEED_GRAPH if (SolderON || hotair_state == st_work) { Graph_count++; //Serial.print(Graph_count); //Serial.print(";"); } else { Graph_count = 0; } if (SolderON && hotair_state != st_work) { Serial.println(GetSolderT); } else if (!SolderON && hotair_state == st_work) { Serial.println(GetHotAirT); } #endif } WorkWithHotAir(); WorkWithSolder(); Work(); } void Work() { #ifdef LM358 GetDT = getOversampled_D(); GetRT = getOversampled_R(); #else GetDT = getOversampled_D() >> 1; GetRT = getOversampled_R() >> 1; #endif } /* HotAir working procedure */ void WorkWithHotAir() { /* Read the thermocouple value */ #ifdef LM358 GetHotAirT = getOversampled_HA(); #else GetHotAirT = getOversampled_HA() >> 1; #endif switch (hotair_state) { case st_stop: { HotAirOff(); Cooling(); break; } case st_work: { /* Set the cooler rpm (convert from 30-100% to 80-255 PWM) */ analogWrite(pinFanPwm, map(SetHotAirRPM, min_rpm, max_rpm, 80, 255)); ha_error = HADoProtect(); /* Turn ON protection relay */ if (ha_error == 0) D7_High; /* Themperature PI regulator */ HA_PI(); /* If themperature was stable for 100 times (+/-2 degrees), then signalize about it */ int delta = ABS(SetHotAirT, GetHotAirT); static byte HAgood; if (!HA_temp_stable) { if (delta < 3) { HAgood++; if (HAgood == 100) { Beep(50); delay_ms(200); Beep(50); HAgood = 0; HA_temp_stable = true; } } else { HAgood = 0; } } else { if (delta > 5) { HA_temp_stable = false; } } break; } case st_pause: { HAPower = 0.0; HA_temp_stable = false; CalctImpulseControl(); Cooling(); ha_error = HADoProtect(); break; } case st_protection: { need_Cooling = true; break; } } //switch (state) } /* Solder working procedure */ void WorkWithSolder() { /* Read the thermoresistor value */ //GetSolderT = A6_Read >> 1; #ifdef LM358 GetSolderT = getOversampled_S(); #else GetSolderT = getOversampled_S() >> 1; #endif if ( SolderON ) { s_error = SDoProtect(); /* Turn ON relay */ if (s_error == 0) D4_High; /* themperature P regulator */ S_P(); /* If themperature was stable for 200 times loop (+/- 2 degrees) then signalize about it */ uint16_t delta = ABS(SetSolderT, GetSolderT); static byte Sgood; if (!S_temp_stable) { if (delta < 5) { Sgood++; if (Sgood == 100) { Beep(50); delay_ms(200); Beep(50); //Sgood = 0; S_temp_stable = true; } } else { Sgood = 0; } } else { if (delta > 7) { S_temp_stable = false; } } } else { SolderOff(); need_S_countdown = false; S_countdown = 1; } } /***************************************** END OF MAIN PROCEDURES ******************************************/ /****************************************** PROTECTION & ON-OFF ********************************************/ /* HotAir protection */ byte HADoProtect() { /* ------------------------------------------------------------------------------------------------------- */ /* Crytical protection: high overheat or thermocouple value is not valid or wire break */ if (GetHotAirT > max_hotair_temp + 20) { HAProtectionOut(); return 1; } /* ------------------------------------------------------------------------------------------------------- */ /* Crytical protection: thermocouple value is not valid or wires short circuit */ if (GetHotAirT < 10) { HAProtectionOut(); return 2; } /* ------------------------------------------------------------------------------------------------------- */ #ifdef HA_ADV_PROT_ON /* Overheat protection */ if (ha_f1 && GetHotAirT > SetHotAirT + 20) { ha_f1 = false; HAProtectionOut(); return 3; } if (ha_f2 && GetHotAirT < SetHotAirT + 15) { ha_f1 = true; ha_f2 = false; } /* ------------------------------------------------------------------------------------------------------- */ /* Deviation themperature protection +/- 10 degrees */ //if (HA_temp_stable) { //ha_f3 = true; //} // //if (ha_f3) { //if (GetHotAirT > SetHotAirT + 10) { //HAProtectionOut(); //return 4; //} // //if (GetHotAirT < SetHotAirT - 10) { //HAProtectionOut(); //return 5; //} //} /* ------------------------------------------------------------------------------------------------------- */ /* Advanced protection: the themperature falls down/not changed & power > 0 */ /* & */ /* Advanced protection: the themperature rise up & power < 0 */ static byte t_cnt = 0; static byte t_cnt2 = 0; static boolean ha_ctrl = true; if (!HA_temp_stable) { static uint16_t prev_t; if (ha_ctrl) { prev_t = GetHotAirT; ha_ctrl = false; prevHAcontrol = millis(); } if (!ha_ctrl && millis() - prevHAcontrol > 1000) { ha_ctrl = true; if (HAPower > 0.0) { /* themperature falls or not changed */ if (prev_t >= GetHotAirT && GetHotAirT < SetHotAirT) { t_cnt++; if (t_cnt == 7) { HAProtectionOut(); t_cnt = 0; return 6; } } else t_cnt = 0; } else { //HAPower == 0.0 /* themperature rise */ if (prev_t < GetHotAirT && GetHotAirT > SetHotAirT) { t_cnt2++; if (t_cnt2 == 7) { HAProtectionOut(); t_cnt2 = 0; return 7; } } else t_cnt2 = 0; } } } else { prevHAcontrol = millis(); t_cnt = 0; t_cnt2 = 0; ha_ctrl = true; } #endif /* ------------------------------------------------------------------------------------------------------- */ /* if everything is OK */ return 0; } /* Solder protection */ byte SDoProtect() { /* ------------------------------------------------------------------------------------------------------- */ /* Crytical protection: high overheat or thermoresistor value is not valid or wire break */ if (GetSolderT > max_solder_temp + 20) { SProtectionOut(); return 1; } /* ------------------------------------------------------------------------------------------------------- */ /* Crytical protection: thermoresistor value is not valid or wires short circuit */ if (GetSolderT < 10) { SProtectionOut(); return 2; } /* ------------------------------------------------------------------------------------------------------- */ #ifdef S_ADV_PROT_ON /* Overheat protection */ if (s_f1 && GetSolderT > SetSolderT + 20) { s_f1 = false; SProtectionOut(); return 3; } if (s_f2 && GetSolderT < SetSolderT + 15) { s_f1 = true; s_f2 = false; } /* ------------------------------------------------------------------------------------------------------- */ /* Deviation themperature protection +/- 10 degrees */ //if (S_temp_stable) { //s_f3 = true; //} // //if (s_f3) { //if (GetSolderT > SetSolderT + 10) { //SProtectionOut(); //return 4; //} //Not required for soldering iron //if (GetSolderT < SetSolderT - 10) { //SProtectionOut(); //return 5; //} // } /* ------------------------------------------------------------------------------------------------------- */ /* Advanced protection: the themperature falls down/not changed & power > 0 */ /* & */ /* Advanced protection: the themperature rise up & power < 0 */ static byte t_cnt = 0; static byte t_cnt2 = 0; static boolean s_ctrl = true; if (!S_temp_stable) { static uint16_t prev_t = 0; if (s_ctrl) { prev_t = GetSolderT; s_ctrl = false; prevScontrol = millis(); } if (!s_ctrl && millis() - prevScontrol > 1000) { s_ctrl = true; if (SPower > 0) { /* themperature falls or not changed */ if (prev_t >= GetSolderT && GetSolderT < SetSolderT) { t_cnt++; if (t_cnt == 10) { SProtectionOut(); t_cnt = 0; return 6; } } else t_cnt = 0; } else { //SPower == 0 /* themperature rise */ if (prev_t < GetSolderT && GetSolderT > SetSolderT) { t_cnt2++; if (t_cnt2 == 10) { SProtectionOut(); t_cnt2 = 0; return 7; } } else t_cnt2 = 0; } } } else { prevScontrol = millis(); t_cnt = 0; t_cnt2 = 0; s_ctrl = true; } #endif /* ------------------------------------------------------------------------------------------------------- */ /* everything is OK */ return 0; } /* Solder full off */ void SolderOff() { analogWrite(pinSolderPwm, 0); D5_Low; D4_Low; resetSolderStablePoint(); if (S_prot_beep) { S_prot_beep = false; Beep(1000); MemSolder(); } } /* HotAir full off */ void HotAirOff() { HAPower = 0.0; D8_Low; delay_ms(10); D7_Low; hotair_state = st_stop; resetHotAirStablePoint(); if (HA_prot_beep) { HA_prot_beep = false; Beep(1000); MemHotAir(); } } /* Cooling the heater until the temperature is below 50 degrees */ void Cooling() { if (GetHotAirT >= 60) need_Cooling = true; if (GetHotAirT >= 50 && need_Cooling) { analogWrite(pinFanPwm, 255); } else { analogWrite(pinFanPwm, 0); need_Cooling = false; } } /* internal procedure */ void set_ha_f() { boolean a = SetHotAirT >= GetHotAirT; ha_f1 = a; ha_f2 = !a; } /* internal procedure */ void set_s_f() { boolean a = SetSolderT >= GetSolderT; s_f1 = a; s_f2 = !a; } /* Solder protection */ void SProtectionOut() { SolderProtect = true; S_prot_beep = true; SolderON = false; SolderOff(); } /* HotAir protection out */ void HAProtectionOut() { analogWrite(pinFanPwm, 255); HA_prot_beep = true; HotAirOff(); hotair_state = st_protection; } /****************************************** END OF PROTECTION & ON-OFF *************************************/ /************************************************ OTHER ROUTINES *******************************************/ /* Read integer value */ int EEPROM_int_read(int addr) { byte raw[2]; for (byte i = 0; i < 2; i++) { raw[i] = EEPROM.read(addr + i); } int &num = (int&)raw; return num; } /* Write integer value */ void EEPROM_int_write(int addr, int num) { byte raw[2]; (int&)raw = num; for (byte i = 0; i < 2; i++) { EEPROM.write(addr + i, raw[i]); } } /* Read last parameters from memory */ void MemRead() { SetSolderT = EEPROM_int_read(0); if (SetSolderT < min_solder_temp || SetSolderT > max_solder_temp) { SetSolderT = default_temp; last_SolderT = SetSolderT; } SetHotAirT = EEPROM_int_read(4); if (SetHotAirT < min_hotair_temp || SetHotAirT > max_hotair_temp) { SetHotAirT = default_temp; last_HotAirT = SetHotAirT; } SetHotAirRPM = EEPROM_int_read(8); if (SetHotAirRPM < min_rpm || SetHotAirRPM > max_rpm) { SetHotAirRPM = default_rpm; last_RPM = SetHotAirRPM; } } /* Write last used solder themperature to memory */ void MemSolder() { if (last_SolderT != SetSolderT) { EEPROM_int_write(0, SetSolderT); last_SolderT = SetSolderT; } } /* Write last used HotAir themperature and fan r.p.m. to memory */ void MemHotAir() { if (last_HotAirT != SetHotAirT) { EEPROM_int_write(4, SetHotAirT); last_HotAirT = SetHotAirT; } if (last_RPM != SetHotAirRPM) { EEPROM_int_write(8, SetHotAirRPM); last_RPM = SetHotAirRPM; } } /* Sound procedure */ void Beep(uint16_t duration) { #ifdef PASSIVE_BUZZER tone(pinBuzzer, 1000, duration); #else D12_High; delay_ms(duration); D12_Low; #endif } /* HotAir oversampling function */ //uint16_t getOversampled_HA() { //uint32_t tmp = 0; //for (byte z = 0; z < 64; z++) { //tmp += A7_Read; //} //return tmp >> 6; //} uint16_t getOversampled_HA() { uint32_t tmp = 0; for (byte z = 0; z < 128; z++) { tmp += A7_Read; } return tmp >> 7; } /* Solder oversampling function */ uint16_t getOversampled_S() { uint32_t tmp = 0; for (byte z = 0; z < 128; z++) { tmp += A6_Read; } return tmp >> 7; } uint16_t getOversampled_D() { uint32_t tmp = 0; for (byte z = 0; z < 64; z++) { tmp += A0_Read; } return tmp >> 6; } uint16_t getOversampled_R() { uint32_t tmp = 0; for (byte z = 0; z < 64; z++) { tmp += A1_Read; } return tmp >> 6; } /* Get absolute difference function */ uint16_t ABS(uint16_t a, uint16_t b) { if (a > b) { return (a - b); } return (b - a); } /****************************************** END OF OTHER ROUTINES ******************************************/ /*************************************** TRIAC CONTROL & AUTOMATHIC ****************************************/ /* Zero cross INT1 */ void ZC() { StartTimer1(HeaterOn, ots); RestartTimer1(); } /* Triac open impulse */ void HeaterOn() { StopTimer1(); if (HAPower > 0.0) { D8_High; delay_us(30); } D8_Low; } /* Calculate triac open delay */ void CalctImpulseControl() { ots = (uint16_t)(acos(HAPower / 50.0 - 1.0 ) * 9900.0 / pi); } /* HotAir PI regulator */ void HA_PI() { int err = SetHotAirT - GetHotAirT; float tmp_power = ((Kp * (float)err) + (Ki * (float)integral)); float max_power = map((float)SetHotAirT, min_hotair_temp, max_hotair_temp, 10.0, 60.0); if (tmp_power < max_power && tmp_power > 0.0) { integral += err; } HAPower = constrain(tmp_power, 0.0, max_power); CalctImpulseControl(); } #ifdef SOLDER_SOFT_START /* Solder P regulator with soft start */ void S_P() { int TempPower = sKp * (SetSolderT - GetSolderT + 1); byte maxPower = 255; if (GetSolderT < 100) { maxPower = 100; } SPower = constrain(TempPower, 0, maxPower); analogWrite(pinSolderPwm, SPower); } #else /* Solder P regulator */ void S_P() { int TempPower = sKp * (SetSolderT - GetSolderT + 1); SPower = constrain(TempPower, 0, 255); analogWrite(pinSolderPwm, SPower); } #endif /************************************* END OF TRIAC CONTROL & AUTOMATHIC ***********************************/ /**************************************** INTERFACE CONTROLS & TIMERS **************************************/ /* Scan buttons */ void ScanButtons() { /* HotAir stand switch */ if (swHotAir.update() && hotair_state != st_stop) { if (swHotAir.fell()) { hotair_state = st_pause; need_Cooling = true; resetHotAirCountown(); } else { if (hotair_state == st_pause) { hotair_state = st_work; integral = 0; set_ha_f() ; } } Beep(50); } else if (hotair_state == st_work && D10_Read == LOW) { D7_High; hotair_state = st_pause; need_Cooling = true; resetHotAirCountown(); } #ifdef SOLDER_TIMER_ON_STAND /* Solder stand switch - only on stand */ if (swSolder.update()) { if (swSolder.fell() && SolderON) { if (!need_S_countdown) { Activate_S_countdown(); Beep(50); } } if (swSolder.rose()) { if (need_S_countdown) { need_S_countdown = false; Beep(50); } } } #else /* Solder stand switch simple check user activity */ if (swSolder.update() && SolderON) { resetSolderCountdown(); Beep(50); } #endif // SOLDER_TIMER_ON_STAND /* Solder "on-off" button */ if (SolderOnButton.update()) { if (SolderOnButton.read()) { SONbuttonState = false; } else { if (!SolderON) { SolderON = true; SolderProtect = false; #ifdef SOLDER_TIMER_ON_STAND if (!D9_Read) Activate_S_countdown(); #else Activate_S_countdown(); #endif Graph_count = 0; selected_Mode = modeSolder; resetSolderStablePoint(); set_s_f(); } else { resetSolderCountdown(); } SONbuttonState = true; SONbuttonPressTime = millis(); Beep(50); } } if (SONbuttonState) { if ( millis() - SONbuttonPressTime >= 1000 ) { //long press SONbuttonPressTime = millis(); if (SolderON) { SolderON = false; resetSolderStablePoint(); MemSolder(); Beep(200); } } } /* HotAir "on-off" button */ if (HotAirOnButton.update()) { if (HotAirOnButton.read()) { HAONbuttonState = false; } else { if (hotair_state != st_work) { hotair_state = st_work; Graph_count = 0; selected_Mode = modeHotAir; need_Cooling = true; resetHotAirStablePoint(); set_ha_f(); integral = 0; } else { resetHotAirCountown(); } HAONbuttonState = true; HAONbuttonPressTime = millis(); Beep(50); } } if (HAONbuttonState) { if ( millis() - HAONbuttonPressTime >= 1000 ) { //long press HAONbuttonPressTime = millis(); resetHotAirStablePoint(); if (hotair_state == st_work || hotair_state == st_pause) { hotair_state = st_stop; need_Cooling = true; MemHotAir(); Beep(200); } } } /* Select button */ if (SelButton.update()) { if (SelButton.fell()) { Beep(50); (selected_Mode < modeFanPWM) ? (selected_Mode++) : (selected_Mode = modeSolder); } } /* UP button */ static boolean short_press_flag = false; if (UpButton.update()) { if (UpButton.rose()) { UPbuttonState = false; short_press_flag = false; } else { switch (selected_Mode) { case modeSolder: if (SetSolderT < max_solder_temp) { SetSolderT += 5; } set_s_f(); resetSolderStablePoint(); resetSolderCountdown(); break; case modeHotAir: if (SetHotAirT < max_hotair_temp) { SetHotAirT += 5; } break; case modeFanPWM: if (SetHotAirRPM < max_rpm) { SetHotAirRPM += 5; } break; } if (selected_Mode > 1) { set_ha_f(); resetHotAirStablePoint(); resetHotAirCountown(); integral = 0; } UPbuttonState = true; short_press_flag = true; UPbuttonPressTime = millis(); Beep(50); } } /* UP button (long press) */ if (UPbuttonState) { if ( millis() - UPbuttonPressTime >= 500 ) { UPbuttonPressTime = millis(); byte step = 10; if (short_press_flag) { step = 5; short_press_flag = false; } switch (selected_Mode) { case modeSolder: SetSolderT += step; if (SetSolderT > max_solder_temp) SetSolderT = max_solder_temp; set_s_f(); resetSolderStablePoint(); resetSolderCountdown(); break; case modeHotAir: SetHotAirT += step; if (SetHotAirT > max_hotair_temp) SetHotAirT = max_hotair_temp; break; case modeFanPWM: SetHotAirRPM += step; if (SetHotAirRPM > max_rpm) SetHotAirRPM = max_rpm; break; } if (selected_Mode > 1) { set_ha_f(); resetHotAirStablePoint(); resetHotAirCountown(); integral = 0; } } } /* Down button */ if (DwnButton.update()) { if (DwnButton.read()) { DWNbuttonState = false; short_press_flag = false; } else { switch (selected_Mode) { case modeSolder: if (SetSolderT > min_solder_temp) { SetSolderT -= 5; } set_s_f(); resetSolderStablePoint(); resetSolderCountdown(); break; case modeHotAir: if (SetHotAirT > min_hotair_temp) { SetHotAirT -= 5; } break; case modeFanPWM: if (SetHotAirRPM > min_rpm) { SetHotAirRPM -= 5; } break; } if (selected_Mode > 1) { set_ha_f(); resetHotAirStablePoint(); resetHotAirCountown(); //integral = 0; } DWNbuttonState = true; short_press_flag = true; DWNbuttonPressTime = millis(); Beep(50); } } /* Down button (long press) */ if (DWNbuttonState) { if ( millis() - DWNbuttonPressTime >= 500 ) { DWNbuttonPressTime = millis(); byte step = 10; if (short_press_flag) { step = 5; short_press_flag = false; } switch (selected_Mode) { case modeSolder: SetSolderT -= step; if (SetSolderT < min_solder_temp) SetSolderT = min_solder_temp; set_s_f(); resetSolderStablePoint(); resetSolderCountdown(); break; case modeHotAir: SetHotAirT -= step; if (SetHotAirT < min_hotair_temp) SetHotAirT = min_hotair_temp; break; case modeFanPWM: SetHotAirRPM -= step; if (SetHotAirRPM < min_rpm) SetHotAirRPM = min_rpm; break; } if (selected_Mode > 1) { set_ha_f(); resetHotAirStablePoint(); resetHotAirCountown(); //integral = 0; } } } } /* Buttons initialise */ void ButtonsSetup() { pinMode(sw_HA, INPUT_PULLUP); swHotAir.attach(sw_HA); swHotAir.interval(50); pinMode(sw_S, INPUT_PULLUP); swSolder.attach(sw_S); swSolder.interval(50); pinMode(bt_SON, INPUT_PULLUP); SolderOnButton.attach(bt_SON); SolderOnButton.interval(5); pinMode(bt_HAON, INPUT_PULLUP); HotAirOnButton.attach(bt_HAON); HotAirOnButton.interval(5); pinMode(bt_Sel, INPUT_PULLUP); SelButton.attach(bt_Sel); SelButton.interval(10); pinMode(bt_Up, INPUT_PULLUP); UpButton.attach(bt_Up); UpButton.interval(5); pinMode(bt_Dwn, INPUT_PULLUP); DwnButton.attach(bt_Dwn); DwnButton.interval(5); } /* internal procedure */ void resetHotAirStablePoint() { HA_temp_stable = false; } /* internal procedure */ void resetSolderStablePoint() { S_temp_stable = false; } /* Reset HotAir countdown */ void resetHotAirCountown() { HA_countdown = HA_sleeptime; } /* Reset Solder countdown */ void resetSolderCountdown() { S_countdown = S_sleeptime; } /* Activate Solder countdown procedure */ void Activate_S_countdown() { need_S_countdown = true; S_countdown = S_sleeptime; } /**************************************** INTERFACE CONTROLS & TIMERS **************************************/ /************************************************* DISPLAY *************************************************/ /* "Hello" screen */ void Splash() { lcd.clear(); #ifdef LCD_1602 lcd.setCursor(0, 0); lcd.print(F("Soldering Station")); lcd.setCursor(6, 1); #else lcd.setCursor(2, 1); lcd.print(F("Soldering Station")); lcd.setCursor(7, 2); #endif lcd.print(F("v ")); lcd.print(FIRMWARE_VERSION); } /* Set LCD design */ void initDisplay() { lcd.clear(); #ifdef LCD_1602 #else lcd.setCursor(11, 0); lcd.print(F("Set")); lcd.setCursor(16, 0); lcd.print(F("Act")); lcd.setCursor(0, 1); lcd.print(F("Solder")); lcd.setCursor(0, 2); lcd.print(F("HotAir")); lcd.setCursor(0, 3); lcd.print(F("FanRPM")); #endif } /* Update LCD */ void DisplayUpdate(boolean blink_state) { #ifdef LCD_1602 lcd.setCursor(0, 0); lcd.print(bspace); lcd.setCursor(0, 0); if (SolderProtect) { lcd.print(F("!")); lcd.print(s_error); } else if (need_S_countdown) { if (blink_state) lcd.print(S_countdown); } else if (SolderON) { (S_temp_stable) ? (lcd.print(F(" *"))) : (lcd.print(F(" :"))); } lcd.setCursor(3, 0); lcd.print(bspace); lcd.setCursor(3, 0); lcd.print(SetSolderT); lcd.write((byte)0); byte pos; uint16_t s_view_t; if (GetSolderT > 505) { lcd.setCursor(8, 0); lcd.print(F("---")); } else { uint16_t s_view_t; #ifdef SOLDER_DIGIT_JUMPS_REMOVE (S_temp_stable)? (s_view_t = SetSolderT) : (s_view_t = GetSolderT); #else s_view_t = GetSolderT; #endif pos = GetPos(s_view_t); lcd.setCursor(8, 0); lcd.print(bspace); lcd.setCursor(8+pos, 0); lcd.print(s_view_t); } lcd.write((byte)0); lcd.setCursor(0, 1); lcd.print(bspace); lcd.setCursor(0, 1); switch (hotair_state) { case st_stop: { break; } case st_work: { if (HA_temp_stable) { lcd.print(F(" *")); } else { lcd.print(F(" :")); } break; } case st_pause: { if (blink_state) lcd.print(HA_countdown); break; } case st_protection: { lcd.print(F("!")); lcd.print(ha_error); break; } } pos = GetPos(SetHotAirT); lcd.setCursor(3, 1); lcd.print(bspace); lcd.setCursor(3+pos, 1); lcd.print(SetHotAirT); lcd.write((byte)0); if (GetHotAirT > 505) { lcd.setCursor(8, 1); lcd.print(F("---")); } else { uint16_t ha_view_t; #ifdef HOTAIR_DIGIT_JUMPS_REMOVE (HA_temp_stable) ? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT); #else ha_view_t = GetHotAirT; #endif pos = GetPos(ha_view_t); lcd.setCursor(8, 1); lcd.print(bspace); lcd.setCursor(8+pos, 1); lcd.print(ha_view_t); } lcd.write((byte)0); lcd.setCursor(13, 1); lcd.print(bspace); lcd.setCursor(13, 1); pos = GetPos(SetHotAirRPM); if (need_Cooling && hotair_state != st_work) { lcd.print(F("100%")); } else { lcd.setCursor(13+pos, 1); lcd.print(SetHotAirRPM); lcd.print(F("%")); } lcd.setCursor(2, 0); lcd.print(F(" ")); lcd.setCursor(2, 1); lcd.print(F(" ")); lcd.setCursor(12, 1); lcd.print(F(" ")); switch (selected_Mode) { case modeSolder: { lcd.setCursor(2, 0); break; } case modeHotAir: { lcd.setCursor(2, 1); break; } case modeFanPWM: { lcd.setCursor(12, 1); break; } } lcd.write((byte)1); #else //LCD2004 lcd.setCursor(6, 1); lcd.print(bspace); lcd.setCursor(7, 1); if (SolderProtect) { lcd.print(F("!")); lcd.print(s_error); } else if (need_S_countdown) { if (blink_state) lcd.print(S_countdown); } else if (SolderON) { (S_temp_stable) ? (lcd.print(F(" *"))) : (lcd.print(F(" :"))); } lcd.setCursor(11, 1); lcd.print(bspace); lcd.setCursor(11, 1); lcd.print(SetSolderT); lcd.write((byte)0); lcd.setCursor(0, 0); lcd.print(GetDT - 5); lcd.write((byte)0); lcd.print(GetRT); lcd.write((byte)0); lcd.print(" "); byte pos; uint16_t s_view_t; if (GetSolderT > 505) { lcd.setCursor(16, 1); lcd.print(F("---")); } else { uint16_t s_view_t; #ifdef SOLDER_DIGIT_JUMPS_REMOVE (S_temp_stable) ? (s_view_t = SetSolderT) : (s_view_t = GetSolderT); #else s_view_t = GetSolderT; #endif pos = GetPos(s_view_t); lcd.setCursor(16, 1); lcd.print(bspace); lcd.setCursor(16+pos, 1); lcd.print(s_view_t); } lcd.write((byte)0); lcd.setCursor(6, 2); lcd.print(bspace); lcd.setCursor(7, 2); switch (hotair_state) { case st_stop: { break; } case st_work: { if (HA_temp_stable) { lcd.print(F(" *")); } else { lcd.print(F(" :")); } break; } case st_pause: { if (blink_state) lcd.print(HA_countdown); break; } case st_protection: { lcd.print(F("!")); lcd.print(ha_error); break; } } pos = GetPos(SetHotAirT); lcd.setCursor(11, 2); lcd.print(bspace); lcd.setCursor(11+pos, 2); lcd.print(SetHotAirT); lcd.write((byte)0); if (GetHotAirT > 505) { lcd.setCursor(16, 2); lcd.print(F("---")); } else { uint16_t ha_view_t; #ifdef HOTAIR_DIGIT_JUMPS_REMOVE (HA_temp_stable) ? (ha_view_t = SetHotAirT) : (ha_view_t = GetHotAirT); #else ha_view_t = GetHotAirT; #endif pos = GetPos(ha_view_t); lcd.setCursor(16, 2); lcd.print(bspace); lcd.setCursor(16+pos, 2); lcd.print(ha_view_t); } lcd.write((byte)0); lcd.setCursor(11, 3); lcd.print(bspace); lcd.setCursor(11, 3); pos = GetPos(SetHotAirRPM); if (need_Cooling && hotair_state != st_work) { lcd.print(F("100%")); } else { lcd.setCursor(11+pos, 3); lcd.print(SetHotAirRPM); lcd.print(F("%")); } for (byte z = 1; z < 4; z++) { lcd.setCursor(10, z); lcd.print(F(" ")); } lcd.setCursor(10, selected_Mode); lcd.write((byte)1); #endif } /* Get print position */ byte GetPos(uint16_t number) { if (number >= 100) { return 0; } else if (number < 10) { return 2; } return 1; } /*********************************************** END OF DISPLAY ********************************************/На базе прошивки 1.6.1 от Олега. Ничего больше не менял.
Sergey38
очень интересны ваши изменения
можете схему выложить , со всеми изменениями
схему , так как у Вас все работает
Sergey38
очень интересны ваши изменения
можете схему выложить , со всеми изменениями
схему , так как у Вас все работает
Основная схема без изменений (под несколько плат- Олега). только с кнопок 2 провода подключены вместо А0 и А1 к резервным D2 и D11. Остальные кнопки остались на своих местах. А на А0 иА1 подкличены выходы со второго ОУ.
Вообще у меня 1й канал второй AD8552 занят термопарой вмонтированной в корпус ПС(для большого паяльника, оловоотсоса и т.д.), а второй канал хотел пустить на защиту фена от неисправного вентилятора. на вход подал сигнал от датчика Холла, которое с фиритовым кольцом измеряет ток потребления вентилятора. И если ток равен нулю(обрыв, либо может полевик полетел) или больше заданного, например заклинило моторчик(как у меня однажды было) то должна сработать защита(пока в прошивке её нет, просто вывел на экран значения).. Никак не могу подобрать номиналы обвязки усилителя..
Sergey38 Выложите пожалуйста скетч.
Сибиряк, в сообщении 3017 есть скетч!
Всем привет, повторил станцию, все было хорошо, до вчерашнего дня, начал уходить блок в защиту как при кз и греется транзисторы, в итоге оба сгорели, заменил и если подать 24 в буквально за пару секунд нагреваются, если вытянуть ЛМ и включить паяльник пару секунд он греется,, а дальше автоматика отрубает его, с другой ЛМ тоже не работает, визуально все нормально
Igor22,
Сумбурно как-то проблему описали...
Какие конкретно транзисторы вылетели?
БП - китайский импульсник?
Нагреватель паяльника нихром или керамика?
Ну, правильное поведение, бессмысленно без контроля температуры включать.
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Сгорел irfz44n, сразу станцию питал блоком от ноутбука,(примерно месяцев 7) работала отлично, из Китая пришёл блок только втророй рабочий, где-то пол года, поставил этот китайский импульсник и через дня 4 случился косяк, не работает и паяльник и фен. Паяльник керамический с терморезистором. Транзисторы перепаял и все равно, без лм немного нагревается с лм вообще блок и китайский и ноутбучный уходят в защиту как при кз.
Извиняюсь, телефон глюканул
Тут логично заподозрить китайский блок, ведь с ноутбучным работало нормально.
Нагреватели с терморезистором (керамические), при холодном старте потребляют большой ток (порядка 8А), кратковременно, правда, но этого может хватать для срабатывания защиты питальника. Для этого в скетче есть вариант работы с "мягким стартом" в начале нагрева (просто скважность уменьшена до определённой температуры) вроде помогает.
Если не включать канал паяльника а просто подать питание нагреватель не греется? КОнтакты защитного реле само-собой замкнуть надо.
Если да, то помимо транзистора неплохо было бы проверить и оптопару им управляющую - возможно она неисправна, мосфет сразу распахивается и нагреватель большим током "садит" БП.
К стати, если станцию выключить и подать 24 вольта те транзисторы за пару секунд разогреваются так, что пальцем дольше 2х секунд не удержишь и на блоке от ноутбука сейчас тоже не работает
Если на включённой станции подключаю блок от ноутбука, то блок сразу в защиту уходит и без разницы включён нагрев паяльника или нет.
Извините, что вмешиваюсь, но по моему если включить логику получается мосфет греется от чрезмерной нагрузки соответственно снимаем нагрузку ищем коротыш . мосфет без нагрузки по определению не должен нагреваться так как путь тока а мосфете от стока к истоку и по идее в этом месте нагрев . либо если оптопара пробита и пропускает ток на ворота мосфета тогда он постоянно открыт в любом случае вам искать или в обвязка мосфета или в его нагрузке ещё примите к сведению, что максимальное напряжение для вывода gate вашего мофета скорее всего до 20 вольт .Отсюда возникает вопрос сколько импульсный китайчонок не самого высокого качества может выдать вольт в пике и сколько являются летальными для мосфетов... Ведь от бп от нубука всё работало.
Спасибо, завтра проверю.
Согласен с Секешфехервар, вполне возможно превышение допустимого на затворе.
Если в этом проблема, то лучше увеличить резистор от эмиттера оптопары на затвор мосфета до 3кОм - напряжение на затворе понизится с 24 до 18В. Также, к этому, можно с затвора на землю поставить стабилитрон на 15-18 вольт.
Добрый день , подскажите куда копать, пересобрал данную станцию но уже под терморезистор в паяльнике (3.8 0м) в итоге фен работает нормально , паяльник греется но на дисплее температура не меняется , номиналы обвязки лмки проверил , перепрошил Ардуино , пробовал настраивать канал паяльника многоооборотными резисторами результат 0 .
https://youtu.be/JvbrfGgl1_E
Может виной нагреватель , я его покупал отдельно с Али а нужно было купить паяльник в сборе ?
До этого мучался месяца 3 с паяльником на ТП так и не смог настроить , забил с заделал новую плату.
При нагреве паяльника Ваш измерительный элемент должен реагировать на изменения проверяйте возле лм'ки, в паяльнике. В моём случае кабель паяльника сломался через примерно 3 месяца неактивного использования.
Симптомы нагрев в определённом положении паяльника
Лечение 4 жильный кабель 0.5 кв мм, не советую использовать длинный кабель с ним больше мороки чем удобства.
По фену сейчас тож проблема : неконтролируемый нагрев до срабатывания защиты если фен лежит на столе то всё норм подозреваю, что виноват кабель, но разбираться нет времени.
Около 3-х ом - это сопротивление нагревателя, у терморезистора - в районе 50 Ом. Похоже, что перепутаны нагреватель с термодатчиком. Тут уже было такое.
Во втором посте темы я выкладывал -
По нагревателям.
Сопротивление керамического нагревателя при комнатной температуре составляет около 2,5–3,5 Ом.
Термодатчик - терморезистор. Его сопротивление — примерно 43–58 Ом.
У нихромовых нагревателей при комнатной температуре нагреватель имеет сопротивление около 10–17 Ом, а термодатчик - термопара, сопротивление, приблизительно 2–3 Ом.
Под терморезистор схема усилителя несколько отличается от того, что для термопары.
Да, вы правы, спасибо, я лоханулся, причем читал на форуме этот случай ,и пересматривал много раз сопротивление и почему то тупил, поменял местами провода датчика и нагревателя, как надо и теперь другая проблема похоже на кз и станция перезагружается в понедельник думаю всё ещё раз перепроверить https://youtu.be/fv92ii-mSNU
Что не делал, не хочет работать,
поменял транзисторы bc337, irfz44n, отпаял оптроны и все равно кз, заметил то, что если подать 24 в, то норм, если потом включаю питание станции, то блок в защиту уходит
Igor22 Диоды защитные правильно хоть впаяны
Да, правильно
я свою так и не довел до ума , застрял на калибровке
можно как то упростить этот процесс?
Заработала, все дело в китайских бракованный деталях, заменил диоды (был один сгоревшей) и как на зло один новый оказался бракованным и с bc 337 тоже самое, и все, заработало, заменил на китайском импульснике конденсаторы, на получше и поемче, все равно в защиту уходит, до замены до 100 градусов уходил, после до 80, мягкий старт включён
Теперь другая проблема, не греет фен, куда копать?
Меняйте местами выводы на семисторе Т1 и Т2
Так то то там вариантов много прежде чем ноги менять глянуть в даташит... У меня с путаными ногами симистор не закрывался. Пробуйте подать питание на моську если симистор открывается закрывается то силовая цепь в норме.
Проверка мос и симистора. Пост 1466
Проверка срабатывания реле
Проверка zero cross.
Ищите, подробнее уже писали.
В общем перепроверил правильность подключения все ок, выходит что при включении канала паяльника китайский блок уходит в защиту, без подключения нагревателя все щелкает и работает . На Ютубе советовали уменьшить мощность паяльника , подскажите как это можно сделать?