ИК паяльная станция на 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. Я кодом уже два месяца не занимаюсь по разным жизненным вопросам (операции, трудоустройство). Также переделываю проект популярного самодельного осциллографа под свои возможности. Но кое в чем присоединюсь к обсуждению.

    По коду могу посоветовать:
    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 КБ
      Просмотров:
      114
    • Station2.ino
      Размер файла:
      20,4 КБ
      Просмотров:
      100
    • Beep.ino
      Размер файла:
      850 байт
      Просмотров:
      97
    • Buttons.ino
      Размер файла:
      5,3 КБ
      Просмотров:
      90
    • Flud.ino
      Размер файла:
      9,1 КБ
      Просмотров:
      93
    • Init_pins.ino
      Размер файла:
      823 байт
      Просмотров:
      100
    • PID.ino
      Размер файла:
      1,8 КБ
      Просмотров:
      91
    • Pwm_SSR.ino
      Размер файла:
      1,1 КБ
      Просмотров:
      90
    • Station2.ino
      Размер файла:
      20,4 КБ
      Просмотров:
      89
    • Time.ino
      Размер файла:
      1,4 КБ
      Просмотров:
      89
    Последнее редактирование: 12 июл 2018
  5. Dmitrysh

    Dmitrysh Гик

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

    Вложения:

  8. 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
  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 справился, но у него алгоритм иной :)