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

Тема в разделе "Arduino & Shields", создана пользователем vector99, 7 дек 2016.

  1. revolover

    revolover Гик

    Сделаю два кода: в одном вырежу - в другом создам работу с меню и загрузку параметров. А далее их совмещу. Только бы времени хватило, а то вся паялка на полку ляжет до пенсии.
     
  2. vector99

    vector99 Гик

    Вот неплохая основа для построения меню
    https://tsibrov.blogspot.com/2018/01/arduino-text-menu.html?m=1
    Да и с дребезгом здесь аппаратное подавление. Я вчера испытал эти микросхемы, работать с ними понравилось!
     
  3. revolover

    revolover Гик

    А мне что-то расхотелось энкодер в последнее время.
    Вот неплохой образец (как идея) http://forum.amperka.ru/threads/gem-Графическое-меню-для-arduino.14642/
     
  4. Aleksander1997

    Aleksander1997 Нерд

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

    По коду могу посоветовать:
    1 Насчет удобства - в среде Arduino IDE существует механизм вкладок (1)
    Туда удобно перенести функции для работы с определенным модулем и разгрузить этим код.
    Предлагаю такие названия- eeprom, pid, buttons... time, beep(по желанию)
    2 Могу свою выложить старую версию кода. Новой как таковой нет - есть 3-4 скетча с настройками, собираюсь через неделю взяться и доделать
    3 Собирал схему детектора нуля (pc817) и связку moc3052 c bta16 - 600, но владелец станции (отец) запретил ее туда встроить. Он пользуется программой heater с сайту mysku, и уже отремонтировал пару телефонов на ней.
    В данный момент станция управляет только двумя твердотельными реле SSR-40 DA со встроенным детектором. Поэтому вопрос - возможно ли к ним применить алгоритм Брезенхема? Фазовое регулировние тут не подойдет. Пока все также - управляет нагревателями шим 5 - 8 Гц.
    4 По поводу меню (http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-interfeis-printable)
    Тестовый вариант, нужен дисплей 16*2 и одна лишняя кнопка (включена подтяжка к питанию).
    Код (C++):
    // TEST
    #include <avr/pgmspace.h>
    #include <Wire.h> // библиотека для управления устройствами по I2C
    #include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 2004
    #include "Cl_do_btn_long.h" // подключаем библиотеку для опроса кнопок

    LiquidCrystal_I2C lcd(0x27, 16, 2); // присваиваем имя lcd для дисплея 20х4

    #define BTN_NEXT 11 // кнопка

    uint8_t i = 0;

    char buf[6];

    Cl_do_btn_long Btn_next(BTN_NEXT);

    void press_next() { /*обработчик короткого*/
       if (i < 5) i++; //увеличивает счетчик кнопки на 1
       else i = 0;          //если счетчик достиг предела положений то его надо обнулить.
    }
    void longPress_next() { /*обработчик длинного*/
    }

    struct reflowStation : public Printable {
            float rampRateStep[9];
            int temperatureStep[9];
            int dwellTimerStep[9];
    int profileSteps;
            int pwr_BOTTOM;
            int pwr_TOP;
    int Setpoint2;    
    float kp1;
            float kd1;
            float ki1; // возможно int
            float kp2;
            float kd2;
            float ki2; // возможно int;        

    size_t printTo(Print& p) const {
    size_t res;
                    if (i == 0) res = p.print(profileSteps);
    else if (i == 1) res = p.print(pwr_BOTTOM);
                    else if (i == 2) res = p.print(pwr_TOP);
                    else if (i == 3) res = p.print(kp1);
                    else if (i == 4) res = p.print(kd1);
                    else res = p.print(ki1);
                    //res += p.print(kp2);
    return res;
    }
    };

    const char string_0[] PROGMEM = "IDLE ";
    const char string_1[] PROGMEM = "STEPS";
    const char string_2[] PROGMEM = "HEAT ";
    const char string_3[] PROGMEM = "PWR  ";
    const char string_4[] PROGMEM = "RAMP ";
    const char string_5[] PROGMEM = "RESET";

    const char *const text[] PROGMEM  = { string_0, string_1, string_2, string_3, string_4, string_5 };

    void setup () {
      lcd.begin();
      lcd.backlight(); // включение подсветки дисплея

      DDRB = 0x00; // назначить пины кнопок на вход
      PORTB = 0b00111111; // подключить внутренние подтягивающие pull-up резисторы

    }  // void setup()


    void loop() {

      Btn_next.run(&press_next, &longPress_next);

      reflowStation pr;
      pr.Setpoint2 = 100;
      pr.profileSteps = 9;
      pr.kp1 = 36.6;
      pr.kd1 = 93.2;
      pr.ki1 = 55.1;
      pr.kp2 = 14.3;
      pr.kd2 = 78.5;
      pr.ki2 = 99.4;
      pr.pwr_BOTTOM = 33.8;
      pr.pwr_TOP = 46.7;

      lcd.setCursor(0, 1);
      lcd.print(pr);
     
      function(i);
    }  // void loop()

    void function (const uint8_t n) {
            strcpy_P(buf, (char*)pgm_read_word(&(text[n])));
            lcd.setCursor(0, 0);
            lcd.print(buf);
    }
     
     

    Вложения:

    • Безымянный.png
      Безымянный.png
      Размер файла:
      71,9 КБ
      Просмотров:
      20
    • Station2.ino
      Размер файла:
      20,4 КБ
      Просмотров:
      13
    • Beep.ino
      Размер файла:
      850 байт
      Просмотров:
      11
    • Buttons.ino
      Размер файла:
      5,3 КБ
      Просмотров:
      10
    • Flud.ino
      Размер файла:
      9,1 КБ
      Просмотров:
      10
    • Init_pins.ino
      Размер файла:
      823 байт
      Просмотров:
      9
    • PID.ino
      Размер файла:
      1,8 КБ
      Просмотров:
      11
    • Pwm_SSR.ino
      Размер файла:
      1,1 КБ
      Просмотров:
      10
    • Station2.ino
      Размер файла:
      20,4 КБ
      Просмотров:
      12
    • Time.ino
      Размер файла:
      1,4 КБ
      Просмотров:
      12
    Последнее редактирование: 12 июл 2018 в 10:49
  5. Dmitrysh

    Dmitrysh Гик

    Вот как раз для вашего случая он хорошо подходит.
     
  6. Aleksander1997

    Aleksander1997 Нерд

    Dmitrysh, если вас не затруднит, можете ответить мне на пару вопросов
    Начиная с поста #38 в котором приведен алгоритм, везде читаю что нужен внешний детектор перехода нуля. Платка сделана, и можно поставить на 2 пин . В остальном больше доработок железа не нужно?
    Алгоритм подходит для любых самодельных и покупных твердотельных реле без и контролем?
     
    Последнее редактирование: 12 июл 2018 в 11:57
  7. Aleksander1997

    Aleksander1997 Нерд

    У меня на макетной плате собраны оба варианта и детектор
     

    Вложения:

  8. Aleksander1997

    Aleksander1997 Нерд

    revolover, покажите свои наработки

    Кстати тоже раньше заинтересовала эта программа. Сохранился тестовый код
    Код (C++):
    #include "max6675.h"
    #define relayPin 10

    const int thermoDO = 3;
    const int thermoCS = 4;
    const int thermoCLK = 5;

    MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
    const int vccPin = 6;
    const int gndPin = 7;

    float setTemp; // переменная для заданного значения температуры
    long lastTime = 0; // время съема последнего значения температуры
    const int period = 10; // интервал времени между последовательными считываниями температуры

    void setup() {
      pinMode(relayPin, OUTPUT);
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
      Serial.begin(9600);
      Serial.println("MAX6675 test");
      // wait for MAX chip to stabilize
      delay(500);
    }

    void loop() {
      long now = millis(); // Переменная для хранения точки отсчета
      if (now >= lastTime + period){
      lastTime = now;
      float measuredTemp = thermocouple.readCelsius();
      setTemp = 200.0;
      float error = setTemp - measuredTemp;
      Serial.println("$");
      Serial.println(round(measuredTemp));
      Serial.println(" ");
      Serial.println(round(setTemp));
      Serial.println(";");
      if (error > 0)
    {
      digitalWrite(relayPin, HIGH);
    }
    else
    {
      digitalWrite(relayPin, LOW);
    }
      }
      }

     
    Только вот ждем термопару с китая
    А то лишняя для опытов слишком громоздкая и инерционная
    20180712121343.jpg
     
    Последнее редактирование: 12 июл 2018 в 13:16
  9. revolover

    revolover Гик

  10. Нафаня

    Нафаня Нуб

    Перезалейте пожалуйста,архив повреждён(
     
  11. revolover

    revolover Гик

    Вы сейчас кого просите? Или хотя бы уточните, какой архив.
     
  12. Yojiq

    Yojiq Нерд

    Немного теории о термопарах -
    В 90е годы когда на заводах не хватало термопар их изготавливали прям на коленке, получали на склад проволоку в виде двух типов хромель и алюмель, резали их на длину под размер кожуха в который их потом вставляли и производили сварку "капли".
    Так вот у кого есть длинная термопара вы можете отрезать около 10 сантиметров, зачистить 5-6 миллиметров где будет капля сварена и скрутить два провода между собой.
    После этого нам понадобится графитовый стержень (карандаш) и лабораторный блок питания, берем толстый провод (медный) и накручиваем на очищенный участок термопары под будущей каплей и через графитовый стержень подаем напряжение на скрученные концы (напряжение и ток подбираются), капля сваривается достаточно легко.
    А далее вам нужно просто удлинить парой двух медных проводов желательно скрученных между собой, погрешностей данная конструкция никаких вносить не будет.
    Так что не обязательно покупать много термопар ;)
     
    and-payalnik, revolover и Dmitrysh нравится это.
  13. Dmitrysh

    Dmitrysh Гик

    Кроме отдельного детектора нуля других доработок не нужно. Алгоритм подходит для всех типов реле с контролем и без контроля.нуля. Не забывайте настроить прерывание от детектора и из него вызываем алгоритм.
     
  14. Нафаня

    Нафаня Нуб

  15. Yojiq

    Yojiq Нерд

    обнови винрар или винзип скачай
    у меня все норм открывается
     
  16. SOLOway

    SOLOway Гик

    Yojiq Я не раз пользовался подобным способом! Только добавлю замечание - удлинять термопару медным проводом допустимо, если место удлинения будет находиться там, где комнатная температура и сами удлинительные провода не будут подвергаться нагреву, в противном случае показания термопар будут неверными. Также если используется аналоговый усилитель для термопары, то диод, компенсирующий температуру холодного спая нужно закрепить в месте удлинения.
    bamik, вроде по структурированию кода, от него больше всего замечаний было!
     
  17. Yojiq

    Yojiq Нерд

    правильное дополнение, думаю этого достаточно чтобы остальное не брать в учет
     
  18. Yojiq

    Yojiq Нерд

    если код будет писаться с нуля может сначала структурную схему от рисовать и отталкиваться от нее в написании ?
     
  19. Dmitrysh

    Dmitrysh Гик

    А что нам это даст? Кто-нибудь справился со скоростью роста и удержания температуры для произвольного нагревателя?
     
  20. SOLOway

    SOLOway Гик

    mon справился, но у него алгоритм иной :)