Ик паяльная станция на arduino mega 2560. доработка скетча "ars_v2_lilium_jsn" | ч. 2

Тема в разделе "Глядите, что я сделал", создана пользователем NikitOS, 20 сен 2020.

  1. Gor

    Gor Нерд

    Управлять легче, если управление правильное. Речь идет о конкретном проекте, в котором имеются явные проблемы с поддержанием заданной температуры, о чем и писалось в начале страницы, с конкретными примерами.
    Я уже писал что настроенный без верха ПИД, работает не так как в паре с включенным верхом, могу только добавить что и профили под разными номерами, например первый и пятый, с абсолютно одинаковыми настройками, ведут себя по разному, то есть ошибки зависят еще и от номера профиля.
    Я думал что ошибки накопились в еппром во время настроек, оставил в скетче всего три профиля, еппром очистил, залил заново, результат не поменялся.
    Возвращаемся к первому ответу. Как бы не был настроен ПИД, при правильной работе результат должен быть повторяемый, этого не наблюдается.
    Про настройки ПИД я читал и провел за экспериментами не один день и только окончательно убедился в том, что скетч работает с ошибками.
    Заинтриговали, чем такое решение, опробованное на многих профессиональных станциях, я имею в виду алюминиевый стол, должно удивить именно меня?
    При более быстром нагреве они не успеют прогреться до этих температур? Если смотреть на профиль от термопро, то там нагрев растянут более чем позволяет данный скетч.
    Смотрел одного экстрасе... эксперта ютуба по русфлюсам, так тот паяет на столе от магистра, как паяльником, чисто по наитию, без понятия о термопрофилях, уходит пить кофе, забывая о оставленных на столе платах, и вроде назад, если верить на слово, не приносят.
    Опять возвращаемся к первому ответу, а именно к неправильной работе скетча. И даже в общем, не могу согласиться - чем выше скорость нагрева, тем больше разница температур между верхом, низом и элементами с разной теплоемкостью и теплопроводностью, потому как тепло не успевает равномерно распределиться за короткий промежуток времени.
    Хотел бы я знать ответ на этот вопрос, но не силен в программировании... может автор проекта из демократической страны и там так принято?
    Про то что ПИД настраивал не один день, я вроде уже писал. Я привел один пример, перелеты могут быть, могут не быть, от какого ветра зависит я не знаю. Окна, кстати закрываю, чтобы и этот фактор исключить.
    Спасибо.
     
  2. Dmitrysh

    Dmitrysh Гуру

    Это не странно, один нагреватель влияет на второй.
    Здесь правильные слова два последних.
    Вы не правы, ниже разберем вашу ситуацию.
    не настроен ПИД, все профили работают одинаково в плане ПИД.
    Не надо так думать, еепром хранит только данные профилей, ошибок там никаких копится не может в принципе.
    НЕТ не должен. ПИД это самоподстраивающаяся система, каждый новый старт профиля абсолютно индивидуальный и зависит от многих факторов, таких как начальные температуры нагревателей и объектов нагрева,температуры помещения, температуры коммутирующих элементов, напряжения сети, положения термопар и др.
    Не разобрались до конца и что то упустили, скетч работает правильно(в разрезе ПИД, за остальное спрашивать Ваташи, его творение).
    Вас удивит насколько сложнее такую систему настраивать. На сколько я знаю на термопро плату ставили на прогретый стол, с чего бы? Подумайте.
    Где то успевают, где то нет, здесь вопрос о времени нахождения в таких условиях.
    Поймите, я не имею в виду экстремальный нагрев со скорость 3-7 градусов в секунду, я про нормальный 0,5-1. Здесь уже нужно смотреть на толщину платы, чем толще плата тем медленнее греем. Я считаю что не надо плату 10-15мин греть, не к чему это.
    А вот и золотые слова, сейчас мы узнаем ответ на вопрос который вас мучает.
    Код ПИД регулятора:
    Код (C++):
    byte Pid2(double temp, double ust, byte kP, byte kI, byte kd)   { // низ
      byte out = 0;
      static float ed = 0;
      e2 = (ust - temp);   //ошибка регулирования
      p2 =  (kP * e2);     //П составляющая
      integra2 = (integra2 < i_min) ? i_min : (integra2 > i_max) ? i_max : integra2 + (kI * e2) / 1000.0; //И составляющая
      d2 = kd * (e2 - ed); //Д составляющая
      ed = e2;
      out = (p2 + integra2 + d2 < u.Profili.min_pwr_BOTTOM) ? u.Profili.min_pwr_BOTTOM : (p2 + integra2 + d2 > bottomMaxPwr) ? bottomMaxPwr : p2 + integra2 + d2;
      return out;
    }
     
    Начальные условия кР=7, kI=4, kD=225; Температура платы 128, заданная температура 120.
    Посчитаем что нам выдаст ПИД: пропорциональная -56, интеграл 0, дифференциал -1800. На выходе регулятора 0. Все как бы и нормально. Но мы же знаем из ваших слов, что регулятор поддерживает температуру, а это значит, что на выходе явно не 0.
    Что бы это могло значить? А это значит, что одна из составляющих не даёт ПИД регулятору снизить подводимую мощность до нуля.
    Какая это может быть составляющая? Посмотрим, пропорциональная явно не может, она равна -56, дифференциальная тоже отрицательная(а если честно, то при остановке роста температуры она равна нулю и так оно и будет), значит остаётся интегральная.
    Как мы знаем, при ненулевой положительной ошибке интегральная увеличивается с каждым вызовом ПИД, это по сути сумма ошибок за определенный промежуток времени. Отсюда и будем "плясать".
    Допустим интегральная составляющая "накопилась" до 90 единиц. Что мы имеем на выходе:
    пропорциональная -56, интегральная 90, дифференциальная(при условии остановки роста температуры) 0. На выходе 34. Вот это уже похоже на правду. Что будет происходить дальше?
    А дальше интегральная составляющая должна медленно убывать за счёт отрицательного вклада своей суммы при отрицательной ошибке. И соответственно на выходе мы бы имели 33, 32, 31 ....0 и соответственно падающую температуру до момента стабилизации на уставке.
    Хотелось бы, НО есть одно большое но. При падении температуры мы попадаем в "дифференциальную" яму. Когда падает температура начинает быстро расти дифференциальная составляющая и не даёт нам температуру снизить.
    Вот поэтому вам и кажется что ПИД поддерживает температуру 128 градусов, а в реальности он просто не дает ей упасть. И ему все равно какая это температура. До скольки успел перегреть,такую и держит. Поэтому и каждый раз у вас разная температура может быть.
    Это проблема не ПИД, это проблема настройки. Коэффициенты подобраны не верно.
    Ну вот как то так, может несколько сложно объяснил, как смог, так сказать.
     
    Последнее редактирование модератором: 15 сен 2023
    Vladimir71, Gor и SOLOway нравится это.
  3. Gor

    Gor Нерд

    Большое спасибо за подробные объяснения.
    Я привел пример (в начале прошлой страницы), сделанный в совершенно равных условиях - прогнал, выключил, остудил до комнатной температуры, которая за это время так же не изменилась, все время было 27 градусов, плата, датчики ничего не трогалось, в настройках ничего не менялось. Результаты я предоставил.
    Спасибо за сделанные расчеты, было бы прекрасно если бы и программа каждый раз так хорошо считала, можно было бы быть уверенным в результате.
    Греть плату 10-15 минут - не руководство к действию, а лишь мое мнение что более растянутый преднагрев платы даст больше положительного эффекта чем негативного в виде воздействия на конденсаторы.
    Я не нашел ответа на вопрос - откуда взяты профили которые гуляют по интернету, и на которые ориентируются при работе с самодельными паялками?
    Подозреваю, что они разрабатывались для пайки в печах в условиях производства. Тогда эти требования к скорости нагрева платы понятны - в замкнутом пространстве произвести равномерный нагрев потоками нагретого воздуха или газа не представляет большой сложности, а сокращение времени до разумного минимума, в условиях массового производства имеет решающее значение.
    Я предполагаю, что все эти требования из профилей для промышленных печей переносятся на паяльные станции открытого типа, где условия нагрева непосредственно чипа, можно условно назвать изолированными, приближенными к пайке в печи, воздействие идет и сверху и снизу, а вот условия нагрева самой платы резко отличаются, перепад температур между верхом платы и низом очень высок и этот фактор видимо не учитывают.
     
  4. Dmitrysh

    Dmitrysh Гуру

    Я так понимаю это стандартные термо профили производителей чипов, они не зависят от типа станции.
     
    Vladimir71 нравится это.
  5. SOLOway

    SOLOway Гуру

    Несмотря на то, что у нас не печь замкнутого цикла, профиль нагрева соблюдать нужно, в нашем случае нужно ориентироваться на те же стандарты, на которые опирались производители чипов, а именно на стандарты, которым соответствуют используемые нами материалы, будь то плата, микросхема, припой, или флюс, влажность, или окружающая температура, и т.п. Вот пример, описанный известным мастером, уважаемым активным в прошлом участником тем по строительству самодельных станций, maxlabt:
    "Если коротко, то необходимы четыре шага (фазы) пайки. Вот так, примерно, по-моему.
    1. преднагрев со скоростью 0,7-0,8*С/ сек
    2. активация флюса и накопление тепла в зоне пайки, скорость 0,2-0,3*С/ сек
    3. Собственно расплавление припоя, скорость 0,5-0,7*С/ сек
    4. удержание пика в течении 15 сек
    Каждая фаза имеет свое назначение. Скорость и длительность каждой фазы могут иметь разные значения (допуски), но их наличие обязательно.
    ".

    В серьезных производственных фирмах, кроме печей, используются и обычного открытого формата ик паяльные станции, например, в компании МЦСТ, производителе российских процессоров и мат.плат для них (плюс ПО), замечена станция размером со средний двухкамерный холодильник, лежащий на боку, у станции очень похожая на огромную стеклокерамическую варочную поверхность рабочая поверхность термостола... Это только один из примеров, в видео на ютубе попадались цеха со станциями также открытого типа у фирм и заводов разных стран. Так что этот формат станций не только удел любителей и сервисных центров.
    МЦСТ также использует в одном из своих подразделений станцию немецкого производителя, смотрите с момента 16:16 в представленном материале:


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

     

    Вложения:

    • J-STD-020F.pdf
      Размер файла:
      938,1 КБ
      Просмотров:
      340
    Последнее редактирование: 16 сен 2023
  6. Alex_s

    Alex_s Нерд

    Добрый вечер подскажите почему при компиляции версии 10_2 сыпет ошибками, при этом все прошивается и работает?
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino: In function 'void printFromPGM(int, int, int)':
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:531:42: warning: invalid conversion from 'int8_t* {aka signed char*}' to 'char*' [-fpermissive]
    strcpy_P(buffer, pgm_read_word(charMap));
    ^
    In file included from C:\Users\Alex\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino/Arduino.h:28:0,
    from sketch\Svs_V10_2_Neu.ino.cpp:1:
    c:\users\alex\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:1268:14: note: initializing argument 1 of 'char* strcpy_P(char*, const char*)'
    extern char *strcpy_P(char *, const char *);
    ^~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:532:30: warning: invalid conversion from 'int8_t* {aka signed char*}' to 'char*' [-fpermissive]
    myGLCD.print(buffer, xx, yy);
    ^
    In file included from C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:4:0:
    C:\Users\Alex\Documents\Arduino\libraries\UTFT/UTFT.h:217:8: note: initializing argument 1 of 'void UTFT::print(char*, int, int, int)'
    void print(char *st, int x, int y, int deg=0);
    ^~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino: In function 'int stlenFromPGM(int)':
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:543:29: warning: NULL used in arithmetic [-Wpointer-arith]
    } while (buffer[i++] != NULL);
    ^~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino: In function 'void GlabPrint()':
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:565:17: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[0], 2, 2); //x=22
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:566:17: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[1], RIGHT, 2); //x=404
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino: In function 'void HeartPic()':
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1004:19: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[12],SsPic2, 90); //
    ^~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino: In function 'void loop()':
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1588:48: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    int Xset2 = (Xsize - (stlenFromPGM(&myStr2) * 16)) / 2;
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:535:5: note: initializing argument 1 of 'int stlenFromPGM(int)'
    int stlenFromPGM (int charMap) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1590:27: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myStr2, Xsize * i + Xset2, Yset + (Ysize - 16) / 2); // текст в рамке
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1617:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myStr3[Vklad_G], 10, i * Y_S_win + Y_shift); // выводим текст названия параметра
    ^~~~~~~~~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1759:25: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myStr3[Gi][Li], 10, Y_shift); // выводим текст названия параметра
    ^~~~~~~~~~~~~~~


    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1782:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[4], 300, Y_shift+1); // "ИЗ "
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1790:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&(AdrProfN[ArObsi[1]-1]), 15, 116); // название выводимого профиля
    ^~~~~~~~~~~~~~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1792:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[5], 15, 148); // " НИЗ 1 2 3 4 ";
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1876:31: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[6], 20, 302); // text:ПРЕДВАРИТЕЛЬНЫЙ НАГРЕВ НИЗА
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1898:35: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[7], 20, 302); // text:НИЖНИЙ НАГРЕВАТЕЛЬ ВКЛЮЧЕН
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1932:39: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[8], 20, 302); // text:ПРЕДВАРИТЕЛЬНЫЙ НАГРЕВ ВЕРХА
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:1949:37: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[9], 20, 302); // text:ВЕРХНИЙ НАГРЕВАТЕЛЬ ВКЛЮЧЕН
    ^~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:2055:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[10], 20, 302);
    ^~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:2060:29: warning: invalid conversion from 'const char* const*' to 'int' [-fpermissive]
    printFromPGM (&myText[11], 5, 302);
    ^~~~~~~~~~~
    C:\Users\Alex\Desktop\Svs_V10_2_Neu\Svs_V10_2_Neu.ino:529:6: note: initializing argument 1 of 'void printFromPGM(int, int, int)'
    void printFromPGM (int charMap, int xx, int yy) {
    ^~~~~~~~~~~~
    C:\Users\Alex\Documents\Arduino\libraries\UTFT\UTFT.cpp: In member function 'void UTFT::AdrawBitmap(int, int, int, int, int*, int)':
    C:\Users\Alex\Documents\Arduino\libraries\UTFT\UTFT.cpp:1303:35: warning: invalid conversion from 'int' to 'void*' [-fpermissive]
    Wr_mem = *data+2*((ty*sx)+tx)+574; // 324
    ~~~~~~~~~~~~~~~~~~~~^~~~

     
  7. Watashi

    Watashi Гуру

    Последняя версия ArduinoIDE 1.8.19 или 2.1 и выше более строго проверяет написанный код и в основном сыпятся ошибки типа "warning" предупреждающие и поэтому компиляция проходит. Я уже большинство ошибок пофиксил, осталась одна или две и вылезло несколько по библиотеке UTFT. когда закончу с этим, выложу в общий доступ. Кстати, часть ошибок касается тех мест в программе которые не компилировались на DUE, так что есть шанс что начнет и на DUE работать)
     
    Последнее редактирование модератором: 5 ноя 2023
    tik-tak, Vladimir71, Alex_s и ещё 1-му нравится это.
  8. Watashi

    Watashi Гуру

    Последнее редактирование модератором: 1 ноя 2023
    Alex_s, Vladimir71 и SOLOway нравится это.
  9. Vladimir71

    Vladimir71 Нерд

    Уважаемый, @Watashi ! Подскажите, при каких условиях происходит остановка профиля с ошибкой? Я понимаю, что связано это с температурой, но хотелось бы конкретики. Скетч глянул, но не особо разбираюсь. Если запускаю профиль с нуля, т.е. с комнатной температуры на датчиках, то как-бы проходит, хоть и с отклонением от графика. Если запустить повторно, с градусов 30-40, то выскакивает ошибка. Понятно, что это нормально, но интересно. В общем, что является причиной ошибки: отклонение от графика; разница между верхом и низом; скорость нарастания; ну, или что-то еще?
     
    Последнее редактирование модератором: 4 ноя 2023
  10. Watashi

    Watashi Гуру

    Все достаточно просто. Берутся последние 5 измерений температуры ( эти измерения в свою очередь тоже являются средним за 5-6 измерений) и 5 последних значений управляющего сигнала на нагреватели и если управляющий сигнал растет и доходит до максимума. а при этом температура не растет - то это и есть ошибка, остановка профиля. В вся проверка начинается после 50гр и только для низа. Можно было бы аналогично сделать и для верха. но я не уверен что это нужно.
     
    Vladimir71 нравится это.
  11. Vladimir71

    Vladimir71 Нерд

    Получается остановка идет по причине постоянства температуры? Типа того, что грею на 100%, а температура не изменяется, как бы нагреватели не греют или датчик не в зоне стоит? Получается скорость нарастания и разница в показания низа и верха эту ошибку не вызывают? Почему интересует меня, потому что есть разница в показаниях низа и верха. На холодную вроде одинаково показывают, а при нагреве верх быстрее растет, чем низ. Пока в причине не разбирался особо, в процессе.
     
    Последнее редактирование модератором: 5 ноя 2023
  12. Vladimir71

    Vladimir71 Нерд

    Уважаемый, @Watashi ! Появился еще вопрос по прошивке. При использовании нижнего подогрева график доходит до края и картинка на экране останавливается. В этот момент программа продолжает отслеживать и регулировать температуру или процесс останавливается?
     
    66shev нравится это.
  13. avang

    avang Нуб

    Hello
    I couldn't find the 3.2 TFT 480*320 touch LCD sample
    I found a model that has a shield and the pins are different
    can i use it???
    @Watashi
     
  14. _Alf_

    _Alf_ Нерд

    Уважаемый, @Watashi спасибо за ваш труд!
    Я чуть модифицировал ваш скетч для для работы на ESP32 для своей станции.
    В наличии был ESP32 с малым количеством портов I/O то кнопки и энкодер не подключал. (Управление только тачскрином).

    Изменения выложил в Git
    Вдруг кому пригодится.

    https://github.com/alfyaroslav/Svs_bgaReflowStation
     
    Последнее редактирование: 13 фев 2024
    -=Z=-, Vladimir71, tik-tak и 2 другим нравится это.
  15. rosin

    rosin Нерд

    Не много изменил прошивку от @Watashi, добавил возможность, во вкладке общие, для каждого профиля, задавать
    свою температуру старта. Для этого надо в функциях loadProfile/SaveProfile, изменить тело оператора for и в файле Peremen.h написать
    #define AdresPreHeatCell 1950

    Для loadProfile:
    Код (C++):
    for (j = 0; j < 6; j++) {                   // чтение вкладки "ОБЩИЕ"
        if(j == 4)                                  // Подмена на новое значение, температуры старта профиля
          {
            ArObsi[j] = EEPROM.read(AdresPreHeatCell + NnProf);
            continue;
          }
        ArObsi[j] = EEPROM.read(numMax*SizePrrof + Adres+1 + j);
      }
    Для SaveProfile:
    Код (C++):
    for (j = 0; j < 6; j++) {                  // запись вкладки "ОБЩИЕ"
        if(j == 4)                                 // Подмена на новое значение, температуры старта профиля
          {
             EEPROM.update(AdresPreHeatCell + NnProf, ArObsi[j]);
             continue;
          }
       EEPROM.update(numMax*SizePrrof + Adres+1 +j, ArObsi[j]);
      }
     
    Vladimir71 нравится это.
  16. MikhaS

    MikhaS Нерд

    Возможно кому-нить пригодится. Прошивал плату mega2560 с экраном ILI9486 и с первого раза не удалось увидеть правильной картинки. Перелопатил весь форум с инструкциями по замене библиотеки и прочим танцам с бубном. По факту оказалось все проще. Читаем инструкцию и в файле UTFT_Rus_W1.zip\UTFT_Rus_W1\hardware\avr\HW_AVR_defines.h включаем 16 битный режим:
    // #define USE_8BIT_ON_MEGA 1 // use 8 bit bas
    #define USE_8BIT_ON_MEGA 0 // use 16 bit bas
    После этого все работает отлично.
     
    SOLOway нравится это.
  17. le_fleurs

    le_fleurs Нерд

    Ребята прошу помощи иначе уже не знаю куда копать.
    Дисплей ILI9486. В скетче указал UTFT myGLCD(ILI9486,38,39,40,41);

    В настройках memorysaver закоментил // #define DISABLE_ILI9486
    в HW_AVR_defines установлено 16бит.

    Но Экран все равно показывает ерунду. До этого все было хорошо. Но по глупости все испортил, и теперь уже 4й час бьюсь ну никак не получается заставить его работать. Прошу совета.
    photo_5406761461251954976_y.jpg
     
  18. le_fleurs

    le_fleurs Нерд

    Долго мучался, менял библиотеки но без результата. Затем взял удалил все библиотеки дисплея установил их через Arduino установка ZIP библиотек. и выставил как указывал выше и чудо, заработало.
     
    Vladimir71 и SOLOway нравится это.
  19. xake

    xake Нерд

    @Watashi, запись профилей в EEPROM с ProfDate.c теперь в прошивке?
    Нашел! :)
    ps: добавить бы остановку профиля по короткому нажатию энкодера
     
    Последнее редактирование: 12 мар 2024
  20. alkf

    alkf Нуб

    Как увеличить или уменьшить размер букв , библиотека UTFT_Rus_W1 ? не особо силён в программирование поэтому не нашёл .