ИК паяльная станция на Arduino Mega 2560. Доработка скетча "ARS_v2_Lilium_JSN"

Тема в разделе "Глядите, что я сделал", создана пользователем Jalnin, 2 ноя 2012.

Статус темы:
Закрыта.
  1. vector99

    vector99 Гик

    такого параметра в нашей прошивке НЕТ. Есть параметр "Скорость нагрева":
    Код (Text):

    //счётчик скорости роста температуры        
          if ((currentMillis - previousMillis) > 1000 * rampRateStep[currentStep - 1] * 0.1) //скорость роста температуры от 0.1с. до 3с.
           {
            previousMillis = currentMillis;
            counter = counter + 1;
            setpointRamp = counter + startTemp;
            //myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            //myGLCD.printNumI(setpointRamp,420, 300,3,'0');
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(setpointRamp,90, 120,3,'0');
            Setpoint1 = setpointRamp;
           }

     
    А весь процес отработки верхнего нагревателя с отображением на дисплее:
    Код (Text):

    //"Старт и процесс пайки", рост температуры с заданной скоростью
        case REFLOW_STATE_STEP_RAMP:
          if (updateScreen) {
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("СТАРТ",370, 5);
            myGLCD.textRus("ПРОФИЛЬ",0, 5);
            myGLCD.setColor(VGA_LIME);
            myGLCD.textRus("ШАГ",5, 300);
            myGLCD.textRus("ВРЕМЯ",100, 300);
            //myGLCD.textRus("СКОРОСТЬ",280, 300);
            myGLCD.setColor(250, 180, 000);
            myGLCD.textRus("УСТАН",5, 153);
            myGLCD.textRus("УСТАН",5, 266);
            myGLCD.textRus("НАГРЕВ",235, 153);
            myGLCD.textRus("НАГРЕВ",235, 266);
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(temperatureStep[editStep],90, 120,3,'0');
            myGLCD.printNumI(SP2,90, 232,3,'0');
            updateScreen = false;
          }
            if (profileName == 1){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("СНЯТИЕ ЧИПА БЕССВИНЕЦ",75, 40);
            }
            if (profileName == 2){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus(" СНЯТИЕ ЧИПА СВИНЕЦ   ",75, 40);
            }
            if (profileName == 3){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("УС-ВКА ЧИПА БЕССВИНЕЦ",75, 40);
            }
            if (profileName == 4){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus(" УС-ВКА ЧИПА СВИНЕЦ   ",75, 40);
            }
            if (profileName == 5){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("   НИЖНИЙ ПОДОГРЕВ     ",75, 40);
          }
       
          if (tc2 >= SP2-1 && !TopStart) TopStart = true;  //если температура низа вышла на уставку включаем верхний нагреватель
     
          if (TopStart == true){        // включен верхний нагреватель  
          myPID1.SetMode(AUTOMATIC);//включение ПИД верхнего нагреветеля
          myPID2.SetMode(MANUAL);// фиксируем мощность нижнего нагревателя
          if (flag == 0)           //фиксируем стартовую температуру
           {
            startTemp = tc1;
            flag = 1;
           }
    //устанавливаем нужный шаг, до которой нагрета плата  
          if (startTemp > temperatureStep[currentStep -1]){
            for (x=1; startTemp > temperatureStep[currentStep - 1]; currentStep++){
              x++;
           }
           }  
          if (currentStep > x && flag == 1){
            flag = 0;
            startTemp = temperatureStep[currentStep - 2];    
            flag = 1;
           }
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(currentStep,60, 300);
            //myGLCD.setFont(SevenSegNumFont);
           // myGLCD.printNumI(temperatureStep[currentStep - 1],90, 120);
     
    //счётчик скорости роста температуры        
          if ((currentMillis - previousMillis) > 1000 * rampRateStep[currentStep - 1] * 0.1) //скорость роста температуры от 0.1с. до 3с.
           {
            previousMillis = currentMillis;
            counter = counter + 1;
            setpointRamp = counter + startTemp;
            //myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            //myGLCD.printNumI(setpointRamp,420, 300,3,'0');
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(setpointRamp,90, 120,3,'0');
            Setpoint1 = setpointRamp;
           }
           } //закрывам скобку

          if (setpointRamp >= temperatureStep[currentStep - 1]) //если достигли нужной температуры
           {
           // myGLCD.setColor(VGA_RED);
           // myGLCD.printNumI(temperatureStep[currentStep - 1],420, 300);
            reflowState = REFLOW_STATE_STEP;
           }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>50)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
            updateScreen = true;
           }
          break;
     
        case REFLOW_STATE_STEP:
          Setpoint1 = temperatureStep[currentStep - 1];
          if (Input1 >= temperatureStep[currentStep - 1])
           {
            counter = 0;
            reflowState = REFLOW_STATE_STEP_DWELL;    
           }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>60)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
            updateScreen = true;
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
           }
          break;
    //считаем время перехода на следующий шаг
        case REFLOW_STATE_STEP_DWELL:
          if (currentMillis - previousMillis > 1000)
           {    
            previousMillis = currentMillis;
            dwellTimerStep[currentStep - 1] = dwellTimerStep[currentStep - 1] - 1;
            TimerStep = dwellTimerStep[currentStep - 1];
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(TimerStep,190, 300,2,'0');
           }
          if (dwellTimerStep[currentStep - 1] == 0) //если счётчик равен установленному времени
           {
            myGLCD.setFont(BigFont);
            myGLCD.setColor(VGA_RED);
            myGLCD.printNumI(TimerStep,190, 300,2,'0');
            tone(buzzerPin, 1045, 500);  //звуковой сигнал
            //counter = 0;
            setpointRamp = 0;
       
          if (profileSteps == currentStep) //если достигли последнего шага
           {
              currentStep = 1;
              x = 1;      //устанавливаем переменную в исходное состояние
              flag = 0;   //после завершения профиля сбрасываем флаг
              reflowState = REFLOW_STATE_COMPLETE;
           }
          else //если шаг не последний
           {      
              currentStep++; //переходим на следующий шаг
              reflowState = REFLOW_STATE_STEP_RAMP;      
           }
            }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>60)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
            updateScreen = true;
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
           }
          break;
    //завершение пайки  
        case REFLOW_STATE_COMPLETE:
           digitalWrite(P1_PIN, HIGH);
           digitalWrite(P2_PIN, HIGH);
           digitalWrite(P3_PIN, HIGH);
           digitalWrite(P4_PIN, HIGH);
                 
          reflowStatus = REFLOW_STATUS_OFF;
          reflowState = REFLOW_STATE_IDLE;  
          updateScreen = true;
          break;
         }

     
    в данном коде реализован обратный отсчёт перехода на следующий шаг:
    if (currentMillis - previousMillis > 1000)
    {
    previousMillis = currentMillis;
    dwellTimerStep[currentStep - 1] = dwellTimerStep[currentStep - 1] - 1;
    TimerStep = dwellTimerStep[currentStep - 1];
    myGLCD.setFont(BigFont);
    myGLCD.setColor(250, 180, 000);
    myGLCD.printNumI(TimerStep,190, 300,2,'0');
    }
    if (dwellTimerStep[currentStep - 1] == 0) //если счётчик равен установленному времени
    {
    myGLCD.setFont(BigFont);
    myGLCD.setColor(VGA_RED);
    myGLCD.printNumI(TimerStep,190, 300,2,'0');
    tone(buzzerPin, 1045, 500); //звуковой сигнал
    //counter = 0;
    setpointRamp = 0;
    следующая реализация прошивки с аналоговыми кнопками и TFT дисплеем ожидается в течении двух недель! LCD версия мной прекращена, либо по коллективной просьбе.
     
    Последнее редактирование: 20 сен 2017
  2. elvfai11

    elvfai11 Нуб

    Спасибо, разобрался! Подскажите ещё какие коэффициенты ПИД регулятора для верха и для низа Вы используете?
     
  3. vector99

    vector99 Гик

    Пока никакие, станция ещё не собрана!
     
  4. Arslan13

    Arslan13 Нуб

    Приветствую ,детектор нуля на оптроне 4n35 можно собрать? они вроде идентичны
     
  5. vector99

    vector99 Гик

    Да, можно!
     
  6. xake

    xake Нерд

    Несколько вопросов к Вам:
    -дисплей подключали через согласователь уровней или через делители?
    -ссылку на библиотеку минимальную "Adafruit_ILI9341.h" можно?
    -использовали 1 датчик температуры?
    Код (C++):
    int thermoCSbott  = 6; //CS
    int thermoCStop  = 6; //CS
     
    Последнее редактирование: 9 окт 2017
  7. Yurik-o

    Yurik-o Нерд

    -дисплей подключил через резисторы 1к - 5шт схем полно, я уже не помню какие линии именно
    -фрукт оригинальный с гитхаба
    -по датчику - возможно попалась тестовая версия с одним датчиком, это легко исправить

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

    использую все тот же nano v3 и 2.4TFT 320*240 он у меня без тача
     
    Последнее редактирование: 26 окт 2017
    xake нравится это.
  8. Yurik-o

    Yurik-o Нерд

    для сотиков и видеокарт хватает
    низ - 4шт последовательно по 1кВт J189 (на 3-х сильно перегревает)
    верх - 3шт по 150Вт

    на графике - грел феном
     

    Вложения:

    • v1m4_disp_1.jpg
      v1m4_disp_1.jpg
      Размер файла:
      239,2 КБ
      Просмотров:
      1.231
    • v1m4_disp_2.jpg
      v1m4_disp_2.jpg
      Размер файла:
      237,8 КБ
      Просмотров:
      1.248
    Последнее редактирование: 10 окт 2017
    xake нравится это.
  9. xake

    xake Нерд

    Тоже пробую с 1 датчиком сделать.
    А как было реализовано, нагрев до нужной температуры и фиксация низа по мощности?
     
  10. Vinyla

    Vinyla Нуб

    Здравствуйте, а откуда можно скачать такую прошивку, с отображением графика?
     
  11. Yurik-o

    Yurik-o Нерд

    версия еще до такой функции, но меня и она устраивает, т.к я считаю, что при фиксации низа может быть скачок температуры, который может привести к отвалу деталей на нижней стороне
     
  12. Yurik-o

    Yurik-o Нерд

    она пока в разработке
     
  13. xake

    xake Нерд

    "Прикрутил" энкодер к NANO версии
     

    Вложения:

    • ARS_NANO_Enc.zip
      Размер файла:
      233,4 КБ
      Просмотров:
      423
  14. dr-baks

    dr-baks Нерд

    Подскажите а где взять скейч под ардуино уно.
     
  15. xake

    xake Нерд

    На UNO будет работать скетч для NANO
     
  16. dr-baks

    dr-baks Нерд

    Не получается загрузить.Пишет ошибка компиляции ide 1.6.3.Пробывал и 1.8.1 и 1.8.3
     
  17. dr-baks

    dr-baks Нерд

    Поставил 1.6.7 вроде бы грузиться а потом выдаёт ошибку и пишет что скейч сильно большой.
     
  18. Arslan13

    Arslan13 Нуб

    Здравствуйте снова, по-тихоньку собираю станцию. Но, почему то не приходит питание на реле верхнего нагревателя, где копать?
    Само реле и нагреватель работают
     
    Последнее редактирование: 25 окт 2017
  19. m2blit

    m2blit Нерд

    Попробуй изменить значение 2 на большее, например 5 или 10
    if (tc1 >= SP2-2 && !TopStart) TopStart = true; //если температура низа вышла на уставку включаем верхний нагреватель
     
  20. dr-baks

    dr-baks Нерд

    Ребята подскажите можно заменить Max 6675 на ad8552 и на них сделать контроль температуры.
     
Статус темы:
Закрыта.