Паяльная станция и некоторые проблемы

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Stix1191, 14 янв 2017.

  1. Stix1191

    Stix1191 Нерд

    Собрал паяльную станцию по схеме, но ни как не пойму как подключить кнопки.
    Помогите пожалуйста подключить, может рисунком или где косяк в моей версии?
    Питание ардуино и питание паяльника от разных бп.
     

    Вложения:

  2. ZAZ-965

    ZAZ-965 Гуру

    В первом варианте было правильно.
    Земли двух блоков питания соединены?
     
  3. Stix1191

    Stix1191 Нерд

    спасибо.
    нет, земли не соединены.
    Соединить?
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Да, общий провод обоих источников соединить.
     
  5. Stix1191

    Stix1191 Нерд

    Соединил спасибо.
    Вылезла еще проблема, семисигментник показывают всякую ерунду.
    У меня индикатор GNT-5631AG
    https://www.rcscomponents.kiev.ua/datasheets/GNT-5631Ax-Bx.pdf
    Я так понимаю, что для моего индикатора строку
    byte digits[] = {
    B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};
    нужно поменять на
    byte digits[] = {
    B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
    а
    ANODES(CATHODES):
    D1 - a
    D2 - b
    D4 - c
    D6 - d
    D7 - e
    D5 - f
    D3 - g
    D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))

    стоит заменить на
    ANODES(CATHODES):
    D1 - a
    D2 - b
    D3 - c
    D4 - d
    D5 - e
    D6 - f
    D7 - g
    D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))
    Но все равно индикатор пишет херь, а не цифры.
     
  6. Stix1191

    Stix1191 Нерд

    Код (C++):
    Скетч программы
    [code=cpp]/*
    Arduino IDE 1.5.4
    Паяльник на Arduino Pro Mini  v0.4

    Alex link
    http://www.youtube.com/c/AlexLink-Free
    http://vk.com/linklife
    http://www.facebook.com/groups/Arduno.life/
    // Пины еодключения индикаторов
    ANODES(CATHODES):
    D1 - a
    D2 - b
    D4 - c
    D6 - d
    D7 - e
    D5 - f
    D3 - g
    D0 - dp (digital point) Я НЕ подключал - резерв... индикатора :)))
          a1
       ********
       *      *
    f *      * b2
    5 *  g3  *
       ********
       *      *
    e *      * c4
    7 *  d6  *
       ******** # dp0
    CATHODES(ANODES):
    D16 - cathode 3
    D15 - cathode 2
    D12 - cathode 1
    */


    // ------------------------------------------------------------------------------------------------
    int indicator = 1; // 0 = Катод  1 = Анод  Выбрать под Ваш индикатор !!!!

    byte  digits[] = {
      B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};

    int digit_common_pins[]={16,15,12};  // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)
    int refresh_delay = 5;
    int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000
    long actual_count_delay = 0;
    long actual_refresh_delay = 0;
    int increment = 0;   //Стартовое значение на сегментах
    int max_digits =3;  //  Кол-во знакомест
    int current_digit=max_digits-1;
    int increment_max = pow(10,max_digits);
    // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------


    //--------------------- переменные паяльника -----------------------------
    int knopka = 3; //Пин кнопок


    int tin = 0; // Пин Датчика температуры IN Analog через LM358N
    int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM

    int tempust = 230; // установленная температура
    int tempmin = 200; // минимальная температура
    int tempmax = 480; // максимальная температура
    int tempreal = 250; // переменная датчика текущей температуры
    int temppwmmin = 40; // минимальное значение PWM нагревателя
    int temppwmmax = 180; // максимальное значение PWM нагревателя
    int temppwmreal = 0; // текущее значение PWM нагревателя
    int airreal = 100; // стартовое значение PWM вентилятора(если нужно)

    int temperror = -50; // разница температур(установленная - реальная)

    int temprazn = 0; // переменная разницы температуры(установленная - текущая)

    void setup(){
    if(indicator == 0){   //Если вначале был выбран общий Катод
                        for(int i=0; i<10;i++){
                                               digits[i] = ~ digits[i];
                                               }
                       }
      pinMode(pinpwm,OUTPUT);     // Порт нагрузки(паяльника) настраиваем на выход
      analogWrite(pinpwm, temppwmreal);     //Вывод  шим в нагрузку паяльника (выводим 0 - старт с выключеным паяльником- пока не опредилим состояние температуры)
      // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------
      DDRD = B11111111;
      for (int y=0;y<max_digits;y++)
              {
               pinMode(digit_common_pins[y],OUTPUT);
               digitalWrite(digit_common_pins[y], LOW);  
              }
      // -------------------------------------------------- не изменять, это для Сегментов -----------------------------------------------

    }

    void loop() {
     
      show(increment);   // Вывести значение переменной на экран(LED)
     
     
       if (tempreal < tempust ){   // Если температура паяльника ниже установленной температуры то:
       
                if ((tempust - tempreal) < 16 & (tempust - tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,
                                         // Если разница меньше 10 градусов то
                                 {
                                  temppwmreal = 99;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                  }
                 else  if ((tempust - tempreal) < 7 & (tempust - tempreal) > 3)
                                                                    {            
                                                                      temppwmreal = 80;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                                     }
                               
                             else if ((tempust - tempreal) < 4 )
                                                          {            
                                                           temppwmreal = 45;  // Понижаем мощность нагрева (шим 0-255  мы делаем 99)  - таким образом мы убираем инерцию перегрева
                                                           }
                                                       
                                                       
                                else {
                                      temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255  мы делаем 230) на максимум для быстрого нагрева до нужной температуры
                                     }
                         
                               
          analogWrite(pinpwm, temppwmreal);     //Вывод в шим порт (на транзистор) значение мощности
        }
    else { //Иначе (если температура паяльника равняется или выше установленной)
             
                temppwmreal = 0;  // Выключаем мощность нагрева (шим 0-255  мы делаем 0)  - таким образом мы отключаем паяльник
                analogWrite(pinpwm, temppwmreal);   //Вывод в шим порт (на транзистор) значение мощности
              }
      if(millis() - actual_count_delay > count_delay) // это для сегментов

      {
        actual_count_delay = millis();
         // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)
     
        tempreal = analogRead(0);// считываем текущую температуру
     
        tempreal=map(tempreal,-50,700,0,500);   // нужно вычислить
        increment=tempreal;
      //---------------------------------------------------------- Кнопки -------------------------------------------------------------------------
              if (analogRead(knopka) == 0)  // Если нажата вниз кнопка то понизить температуру на 5
                                   {
                                   if( tempust <= tempmin || (tempust-5) <= tempmin )
                                                              {
                                                                tempust= tempmin;
                                                                increment = tempust;
                                                              }
                                           else {
                                                 tempust=tempust-5;
                                                 increment = tempust;
                                                 show(increment);   // Вывести значение переменной на экран(LED)
                                             
                                                  }
                                   
                                   
                               
                                   }
              else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 )  // Если нажата вверх кнопка то повысить температуру на 5
                                           {
                                           tempust=tempust+5;
                                           if( tempust >=tempmax)
                                                              {
                                                                tempust= tempmax;
                                                              }
                                           increment = tempust;
                                           show(increment);   // Вывести значение переменной на экран(LED)
                                       
                                           }
     
      }
    }

    void show(int value) { //------------------------------- подпрограмма для вывода на сегменты   - лучше не изменять ---------------------------------------------
      int digits_array[]={};
      int y=0;
      boolean empty_most_significant = true;

      if(millis() - actual_refresh_delay >= refresh_delay)
      {

      for (int z=max_digits-1;z>=0;z--)
      {


        digits_array[z] = value / pow(10,z); //rounding down by converting from float to int
     
        if(digits_array[z] != 0 ) empty_most_significant = false;  // DON'T SHOW LEADING ZEROS
     
        value = value - digits_array[z] * pow(10,z);




       if(z==current_digit)
            {
             if(!empty_most_significant || z==0){ // DON'T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT
             
                                                PORTD = digits[digits_array[z]];
                                                }
                                           else
                                                {
                                                 if(indicator == 0){   //Если вначале был выбран общий Катод
                                                                    PORTD = B00000000;
                                                                    }
                                                         else{
                                                               PORTD = B11111111;
                                                              }
                                                }

           if(indicator == 0){
                             digitalWrite(digit_common_pins[z], LOW);
                             }
                 else{
                      digitalWrite(digit_common_pins[z], HIGH);
                     }
          }
    else{
       
         if(indicator == 0){
                             digitalWrite(digit_common_pins[z], HIGH);
                             }
                 else{
                      digitalWrite(digit_common_pins[z], LOW);
                     }
       }

    }

          current_digit--;
          if(current_digit < 0)
          {
            current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS
          }
    actual_refresh_delay =  millis();  
    }

    }
     
    [/code]
     
  7. Stix1191

    Stix1191 Нерд

    Да, и строку
    int digit_common_pins[]={16,15,12};
    заменил на
    int digit_common_pins[]={8,9,10};
     
  8. Stix1191

    Stix1191 Нерд

    С другой стороны, какая разница как подключен индикатор и, что он показывает, при нажатии на кнопку паяльник все равно должен нагреваться. Если не нагревается, то где-то косяк, правильно?
     
  9. Stix1191

    Stix1191 Нерд

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