Страница 14 из 15 ПерваяПервая ... 489101112131415 ПоследняяПоследняя
Показано с 131 по 140 из 144
  1. #131
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фен паяльный

    странно, а раньше тоже AMS1117 стоял?

  2. #132
    Местный Аватар для Kevin
    Регистрация
    02.02.2018
    Возраст
    55
    Сообщений
    127
    Вес репутации
    135

    По умолчанию Re: Фен паяльный

    Да, я выпаял его из нерабочей и впаял в рабочую (она работает с ним) Что то не получается управлять вентилятором с другого пина. Вращая ручку энкодера ни чего не происходит вплоть до достижения максимального значения - тогда моторчик запускается на полную.
    Последний раз редактировалось Kevin; 17.05.2018 в 00:15.

  3. #133
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фен паяльный

    Может в коде ошибка?

  4. #134
    Местный Аватар для Kevin
    Регистрация
    02.02.2018
    Возраст
    55
    Сообщений
    127
    Вес репутации
    135

    По умолчанию Re: Фен паяльный

    Возможно. Нужно ведь как то второй таймер подключить? int motorPin = 6; заменить на 9 недостаточно?
    PHP код:
    #include "U8glib.h"
    #include "rus6x12.h"
    #include <CyberLib.h> //Библиотека от Cyber-Place.ru
    //===========================================================
    U8GLIB_SSD1306_128X64 u8g(A4, /* data=*/ A3, /* cs=*/ A2, /* dc=*/ A1, /* reset=*/ A0); // наш дисплей  ||
    //===========================================================
    volatile uint8_t tic, Dimmer;
    int motorPin = 6;
    int motorSpeed = 75;                   // Изначальная скорость двигателя
    int fanPower = 170;                    // Изначальная мощность фена
    int stepFen = 5;                       // шаг изменения мощности
    int stepMoto = 5;                       // шаг изменения мощности
    int selectMode = 0;                    // Что изменять, скорость или мощность фена
    // ===================================  энкодер   ===================== 
    unsigned long currentTime;
    unsigned long loopTime;
    #define PIN_ENCODER_CLK 3
    #define PIN_ENCODER_DT 5
    #define PIN_ENCODER_SW 7 
    unsigned char ENCODER_CLK;
    unsigned char ENCODER_DT;
    unsigned char ENCODER_CLK_prev=0;
    // =================================== Кнопка энкодера   =====================
    bool     button_state      = false;
    bool     button_auto_state = false;
    uint32_t ms_button         = 0;
    uint32_t ms_auto_click     = 0;
    // ===================================  дисплей   =====================
    void draw(void) {
      
    u8g.setFont(u8g_font_courR24n);            // тонкие цифры
      
    u8g.setPrintPos(15, 22);
      
    u8g.print(fanPower);

      
    u8g.setPrintPos(15, 64);
      
    u8g.print(motorSpeed);

      
    u8g.setPrintPos(-2, 70);
      
    u8g.print("*");
       
     
    // if(selectMode == 1 && (millis() & 512))
      
    if(selectMode == 1)
      {  
      
    u8g.setPrintPos(78, 23);
      
    u8g.print(".");
      }
      
    //if(selectMode == 2 && (millis() & 512))
      
    if(selectMode == 2)
      {
      
    u8g.setPrintPos(78, 59);
      
    u8g.print(".");
      }
    // =================================== 
      
    u8g.setPrintPos(81, 6);
      
    u8g.setFont(rus6x12);
      
    u8g.print("температура");

      
    u8g.setPrintPos(84, 43);
      
    u8g.print("обороты");
    // =================================== 
      
    u8g.setFont(u8g_font_courR14r);
      
    u8g.setPrintPos(95, 27);
    //  u8g.print(SetPower);

      
    u8g.setPrintPos(95, 64);
    //  u8g.print(SetSpeed);
      
    // ===================================    ===================== 
      
    u8g.drawLine(77, 0, 77, 64);      // Вертикальная линия
      
    u8g.drawLine(80, 32, 128, 32);    // Горизонтальная короткая линия

    //  u8g.drawBitmapP(0, 0, 1, 24, Termometr);
    //  u8g.drawBitmapP(-2, 47, 2, 14, Cooler);
    }
     
    void setup()  {
    // =================================== Диммер  ===================== 
    //TCCR0B = TCCR0B & 0b11111000 | 5;
      
    TCCR1B = TCCR1B & 0b11111000 | 5;
      
    Dimmer = fanPower;
      
    D4_Out;  //Настраиваем порты на выход
      
    D4_Low;  //установить на выходах низкий уровень сигнала
      
    D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
      
    attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
      
    StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
      
    StopTimer1(); //остановить таймер
    // ===================================  энкодер   ===================== 
      
    pinMode(PIN_ENCODER_CLK, INPUT);
      
    pinMode(PIN_ENCODER_DT, INPUT);
      
    pinMode(PIN_ENCODER_SW, INPUT_PULLUP); //  Кнопка энкодера
      
    pinMode(motorPin, OUTPUT);
      
    currentTime = millis();
      
    loopTime = currentTime; 
      
    Serial.begin(9600);           // для отладки
    //======================  Обновление дисплея ======================
            
    u8g.firstPage();  
            do {
    draw();} while( u8g.nextPage() );
    //======================  Обновление дисплея ======================
    } 

    void loop()  
    {
       
    analogWrite(motorPin, motorSpeed);  // Устанавливаем первоначальную скорость
    // =================================== Кнопка энкодера   =====================
      
    uint32_t ms    = millis();
      
    bool pin_state = digitalRead(PIN_ENCODER_SW); 
      if( 
    pin_state  == LOW && !button_state && ( ms - ms_button ) > 50 )// Фиксируем нажатие кнопки  
      
    {
        
    button_state      = true;
        
    button_auto_state = false;  
        
    ms_button         = ms;
        if(
    selectMode == 1)
        {
          
    selectMode = 2;  
          
    Serial.println("Press key");
        }
        else
        {
          
    selectMode = 0;
        }
    //======================  Обновление дисплея ======================
            
    u8g.firstPage();  
            do {
    draw();} while( u8g.nextPage() );
    //======================  Обновление дисплея ======================
      
    }
      if( 
    pin_state  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ) // После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
      
    {
        
    button_auto_state = true;
        
    ms_auto_click     = ms;
        
    selectMode = 1;
        
    Serial.println("Auto press key");    
    //======================  Обновление дисплея ======================
            
    u8g.firstPage();  
            do {
    draw();} while( u8g.nextPage() );
    //======================  Обновление дисплея ======================
      
    }  
      if( 
    pin_state == HIGH && button_state && ( ms - ms_button ) > 50  ) // Фиксируем отпускание кнопки 
      
    {
        
    button_state      = false;   
        
    ms_button         = ms;
        if( !
    button_auto_state )
        
    Serial.println("No Press key");
      }
    // =================================== Вал энкодера   =====================  
      
    currentTime = millis();
      if(
    currentTime >= (loopTime + 5))
      { 
    // проверяем каждые 5мс (200 Гц)
        
    ENCODER_CLK = digitalRead(PIN_ENCODER_CLK);        // считываем состояние выхода А энкодера 
        
    ENCODER_DT = digitalRead(PIN_ENCODER_DT);         // считываем состояние выхода B энкодера    
        
    if((!ENCODER_CLK) && (ENCODER_CLK_prev))
        {                                      
    // если состояние изменилось с положительного к нулю
          
    if(ENCODER_DT)                        // выход В в полож. сост., значит вращение по часовой стрелке
          
    {
            if (
    selectMode == 1)  
            {
              if(
    fanPower - stepFen >= 0)
              
    fanPower -= stepFen;              // увеличиваем мощность фена, не ниже 0    
            
    }
            
    //else
            
    if (selectMode == 2) 
            {
              if(
    motorSpeed + stepMoto <= 255)
              
    motorSpeed += stepMoto;          // Прибавляем скорость   
            
    }   
          }   
          else                                
    // выход В в 0 сост., значит вращение против часовой стрелки 
          
    { 
            if (
    selectMode == 1)  
            {
              if(
    fanPower + stepFen <= 255) 
              
    fanPower += stepFen;            // уменьшаем мощность фена, но не более чем до 255    
            
    }
           
    // else
            
    if (selectMode == 2) 
            {
              if(
    motorSpeed - stepMoto  >= 0)
              
    motorSpeed -= stepMoto;          // уменьшаем скорость 
            
    }           
          }   
    //======================  Обновление дисплея ======================
            
    u8g.firstPage();  
            do {
    draw();} while( u8g.nextPage() );
    //======================  Обновление дисплея ======================
        
    }   
      
    ENCODER_CLK_prev = ENCODER_CLK;     // сохраняем значение А для следующего цикла 
      
    loopTime = currentTime;
      }   
      
    Dimmer = fanPower;                    
    }

    // ===================================  обработчик и прерываний  ===================== 
    void halfcycle() //прерывания таймера
    {
      
    tic++; //счетчик
      
    if(Dimmer < tic ) D4_High; //управляем выходом
    }
    void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
    {
      
    tic=0; //обнулить счетчик
      
    ResumeTimer1(); //запустить таймер
      
    attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
    }
    void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
    {
      
    StopTimer1(); //остановить таймер
      
    D4_Low; //логический ноль на выходы
      
    tic=0; //обнулить счетчик
      
    attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
    } 
    Последний раз редактировалось Kevin; 17.05.2018 в 00:36.

  5. #135
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фен паяльный

    StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
    Timer1 тоже занят
    остается только Timer2

  6. #136
    Местный Аватар для Kevin
    Регистрация
    02.02.2018
    Возраст
    55
    Сообщений
    127
    Вес репутации
    135

    По умолчанию Re: Фен паяльный

    Получилось на 11 пин

  7. #137
    Местный Аватар для Kevin
    Регистрация
    02.02.2018
    Возраст
    55
    Сообщений
    127
    Вес репутации
    135

    По умолчанию Re: Фен паяльный

    Вроде работает нормально - регулирует обороты и температуру. Встроенную термопару пока подключать не стал - измеряю температуру термопарой мультиметра. Заметил что температура не очень стабильна, а при добавлении оборотов немного падает (что и не удивительно). Вот и думаю - надо как то сделать поддержание установленной температуры, но боюсь что намудрю. Как лучше реализовать данное действо. Думаю так:

    1. Регулируя температуру, устанавливать мощность диммера на примерную величину (к примеру 170 единиц диммера = 200 градусов)
    2. Задать переменной (к примеру setTemp) значение 200
    3. И далее в секундном таймере делать проверку - если температура на термопаре фена больше setTemp на 10, то уменьшить мощность диммера на -1. А если меньше - то прибавить.

    Верна ли логика моих мыслей?
    Последний раз редактировалось Kevin; 17.05.2018 в 20:25.

  8. #138
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фен паяльный

    Логика верна, но нужно регулировать дельту в обе стороны. как на понижение так и на увеличение температуры

  9. #139
    Местный Аватар для Kevin
    Регистрация
    02.02.2018
    Возраст
    55
    Сообщений
    127
    Вес репутации
    135

    По умолчанию Re: Фен паяльный

    Цитата Сообщение от Chip Посмотреть сообщение
    как на понижение так и на увеличение температуры
    А я вроде про повышение писал

    Цитата Сообщение от Kevin Посмотреть сообщение
    ....
    3. И далее в секундном таймере делать проверку - если температура на термопаре фена больше setTemp на 10, то уменьшить мощность диммера на -1. А если меньше - то прибавить.

  10. #140
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    56
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: Фен паяльный

    Не внимательно прочитал

Страница 14 из 15 ПерваяПервая ... 489101112131415 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 20 (пользователей: 0 , гостей: 20)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •