Страница 5 от 22 ПърваПърва 1 2 3 4 5 6 7 8 9 15 ... ПоследнаПоследна
Резултати 101 до 125 от 528

Тема: Релеен атенюатор с 32 стъпки + входен буфер + селектор с 3 входа

  1. #101
    Ако разбия въпросите ти:
    Цитат Публикувано от стефан990 Покажи мнения
    ... може ли след като се програмира да се премести на друга платка, ...
    Да. Добре би било да си оставиш и изводи към съединител за външно програмиране (AVR-ските RESET, SCK, MOSI, MISO през AVR програматор или по-лесно към aрдуиносвските RX-D1, TX-D0 и RESET с USB към TTL конвертор, напр. на ИС FT232, CP2102, CH340) за бъдещи корекции, изменения, ъпгрейти на програмата си. Изваждането на ИС от цокъл, препрограмиране и връщане обрато е удобно, но за еднократна операция (или ако някой друг е писал, тествал кода и е изчистил грешките му ). А често при писане на собствена програма пробите, изчистването на грешки и др. операции може да продължат до безкрайност.

    Цитат Публикувано от стефан990 Покажи мнения
    ... дали мога да си поръчам само контролера от комет ...
    Това е лесно изпълнимо: ATMEGA328 в корпус 28 PDIP, 32 TQFP (вторият има два аналогови входа повече).

    Цитат Публикувано от стефан990 Покажи мнения
    ... и да го програмирам на същата тази ардуино платка ?...
    За да е достъпен AVR микроконтролерът през средата на Arduino IDE, трябва еднократно да му "налееш" bootloader. Тогава той ще се превърне в Arduino (UNO, Nano, Pro Mini) и няма да му е нужен външен програматор за зареждане на бъдещи програми (а ще се зареждат през RX-TX).

    Еднократното запсване на bootloader: с програматор за AVR директно с hex (а по-лесно: през средата Arduino IDE, поддържаща много вдидове програматори).

    Друг, мисля по-достъпен начин: с друго Arduino, напр. UNO (примерно това, което вече имаш, а микроконтролера: на bredboard-a монтиран с 16 MHz кварцов резонатор). На другото UNO му зареждаш програма (в примерите е на Arduino IDE), която го превръща в програматор, през него ще запишеш на новия чип bootloader (Записване на зареждаща програма).

    Всичко това е достъпно от менютата на Arduino IDE, не трябва да инсталираш нищо външно.

    Не е сложно. След няколко опита процедурата става рутинна и не се замисляш дори какво правиш .
    А и няма какво толкова да объркаш. Примери и насоки из интернет има безброй.
    Редактирано от veso74; 26 April 2019 в 21:47.

    • #0
      Реклама от Google Реклама от Google
      Членува от
      Dec 2007
      Адрес
      Google.com

        
       

  2. #102
    Много ти благодаря veso74 за изчерпателните отговори

  3. #103
    А колко по-лесно щеше да бъде така:

    Potenciometer TP 283 2x5K.jpg
    Руски форум. Задаваш въпрос, после ти отговарят.
    Израелски форум. Задаваш въпрос, после на теб ти задават въпрос.
    Български форум. Задаваш въпрос, после дълго ти разказват колко си тъп.
    Явно кабелите са слушани години с тонкоректор на по-висока честота...
    Аз трябва DSD-тата да ги конвертирам в SACD, че да ги слушам нативно.
    Ама това с тия източници си е лесната част. С пустите ампове е големия зор!

  4. #104
    Цитат Публикувано от tarambuki Покажи мнения
    А колко по-лесно щеше да бъде така:

    Potenciometer TP 283 2x5K.jpg
    Целта на задачата е друга! Вникни в детайлите!

  5. #105
    Направих импровизиран атенюатор, но с диоди не с релета и не с 32, а с 6. Управляват се с два бутона, не с енкодер, че нямам в момента, пък и нямам идея как да напиша кода за него
    IMG_20190428_202228.jpg

    int buttonA = A1;
    int buttonB = A2;
    int relay1 = 1;
    int relay2 = 2;
    int relay3 = 3;
    int relay4 = 4;
    int relay5 = 5;
    int relay6 = 6;
    int counter = 1;
    void setup()
    {
    pinMode(buttonA, INPUT);
    pinMode(buttonB, INPUT);
    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT);
    pinMode(relay4, OUTPUT);
    pinMode(relay5, OUTPUT);
    pinMode(relay6, OUTPUT);
    }

    void loop()
    {
    int aState;
    aState = digitalRead(buttonA);

    int aLastState;
    aLastState = digitalRead(buttonB);

    if (aState == LOW)
    {
    counter++;
    delay(200);
    }
    if (aLastState == LOW)
    {
    counter--;
    delay(200);
    }
    else if (counter == 1)
    {
    digitalWrite(relay1, HIGH);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);
    digitalWrite(relay4, LOW);
    digitalWrite(relay5, LOW);
    digitalWrite(relay6, LOW);
    }
    else if (counter == 2)
    {
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, HIGH);
    digitalWrite(relay3, LOW);
    digitalWrite(relay4, LOW);
    digitalWrite(relay5, LOW);
    digitalWrite(relay6, LOW);
    }
    else if (counter == 3)
    {
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, HIGH);
    digitalWrite(relay4, LOW);
    digitalWrite(relay5, LOW);
    digitalWrite(relay6, LOW);
    }
    else if (counter == 4)
    {
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);
    digitalWrite(relay4, HIGH);
    digitalWrite(relay5, LOW);
    digitalWrite(relay6, LOW);
    }
    else if (counter == 5)
    {
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);
    digitalWrite(relay4, LOW);
    digitalWrite(relay5, HIGH);
    digitalWrite(relay6, LOW);
    }
    else if (counter == 6)
    {
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    digitalWrite(relay3, LOW);
    digitalWrite(relay4, LOW);
    digitalWrite(relay5, LOW);
    digitalWrite(relay6, HIGH);
    }
    }

  6. #106
    Адаш, не вярвам тези 6 стъпки да те устройват. Интересно е как се държат. Създават ли проблеми?

    Аха, сега вникнах в написаното, но въпроса остава.
    Успех!
    Редактирано от Стефан Петров; 28 April 2019 в 21:12.

  7. #107
    Не, не ме устройват 6, но това е само за експеримент. Не се държат особено добре, но с енкодера ще е съвсем различно, защото при него няма да се следи само ниско и високо ниво, а и ъгъла. Но като пристигне енкодерът ще пробвам да напиша код за него, но още не мога да разбера как трябва да изглежда, ще разгледам из нета. Като дойдат MCP-тата ще навърта и повече диоди

  8. #108
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    За да може това което публикуваш като код да е по-четимо, използвай тага за код:
    Код:
    // "Hello world"
        for (i = 0; i < 100; i ++)
        {
            some code...
        }
    Учените са открили, че 90% от хората са симулирали еволюцията.

  9. #109
    L.K.'s Avatar
    Членува от
    Nov 2010
    Адрес
    Казанлък
    Възраст
    53
    Мнения
    16,966
    Стефане, напредваш!

  10. #110
    Това по същество е преместващ регистър.
    Защо не опиташ да го организираш програмно?
    Може би ще се получи доста по компактен код.
    На всяко натискане на бутон "+" правиш "shift left", "-" правиш "shift right" примерно...

  11. #111

    Членува от
    Nov 2008
    Адрес
    София
    Възраст
    47
    Мнения
    911
    В моята тема за r2r има готов код, само във файла volume трябва да смените стъпките на релетата.
    "Истинската свобода е липсата на страх"

  12. #112
    asen_v_k постоянно гледам кодовете от твоя проект, но засега не не мога да ги схвана съвсем за да ги използвам, но ще се опитам.
    Засега само експериментирам с цел обучение, нека да свикна C++ тогава ще намалявам обема на кодовете.
    Подкарах 6-те светодиода с енкодер, управлението има е перфектно, нищо общо с двата бутона.
    PHP Code:
    /*
    ** Энкодер
    ** 
    */
     
    int relay1 1;
     
    int relay2 2;
     
    int relay3 3;
     
    int relay4 4;
     
    int relay5 5
     
    int relay6 6
    int counter 1;       // яркость LED, начинаем с половины
    int fadeAmount 1;        // шаг изменения яркости LED
    unsigned long currentTime;
    unsigned long loopTime;
    const 
    int pin_A A1;       // pin 12
    const int pin_B A2;       // pin 11
    unsigned char encoder_A;
    unsigned char encoder_B;
    unsigned char encoder_A_prev=0;
     
    void setup()  {
      
    // declare pin 9 to be an output:
      
    pinMode(relay1OUTPUT);
      
    pinMode(relay2OUTPUT);
      
    pinMode(relay3OUTPUT);
      
    pinMode(relay4OUTPUT);
      
    pinMode(relay5OUTPUT);
      
    pinMode(relay6OUTPUT);       // устанавливаем pin 9 как выход
      
    pinMode(pin_AINPUT);
      
    pinMode(pin_BINPUT);
      
    currentTime millis();
      
    loopTime currentTime

     
    void loop()  {
      
    currentTime millis();
      if(
    currentTime >= (loopTime 5)){ // проверяем каждые 5мс (200 Гц)
        
    encoder_A digitalRead(pin_A);     // считываем состояние выхода А энкодера 
        
    encoder_B digitalRead(pin_B);     // считываем состояние выхода B энкодера    
        
    if((!encoder_A) && (encoder_A_prev)){    // если состояние изменилось с положительного к нулю
          
    if(encoder_B) {
            
    // выход В в полож. сост., значит вращение по часовой стрелке
            // увеличиваем яркость, не более чем до 255
            
    if (counter fadeAmount >= 0counter -= fadeAmount;             
          }   
          else {
            
    // выход В в 0 сост., значит вращение против часовой стрелки     
            // уменьшаем яркость, но не ниже 0
            
    if(counter fadeAmount <= 6counter += fadeAmount;            
          }   
     
        }   
        
    encoder_A_prev encoder_A;     // сохраняем значение А для следующего цикла 
         
        
    if (counter == 1
      {
        
    digitalWrite(relay1HIGH);
        
    digitalWrite(relay2LOW);
        
    digitalWrite(relay3LOW);
        
    digitalWrite(relay4LOW);
        
    digitalWrite(relay5LOW);
        
    digitalWrite(relay6LOW);
      }
       else if (
    counter == 2
      {
        
    digitalWrite(relay1LOW);
        
    digitalWrite(relay2HIGH);
        
    digitalWrite(relay3LOW);
        
    digitalWrite(relay4LOW);
        
    digitalWrite(relay5LOW);
        
    digitalWrite(relay6LOW);
      }
       else if (
    counter == 3
      {
        
    digitalWrite(relay1LOW);
        
    digitalWrite(relay2LOW);
        
    digitalWrite(relay3HIGH);
        
    digitalWrite(relay4LOW);
        
    digitalWrite(relay5LOW);
        
    digitalWrite(relay6LOW);
      }
       else if (
    counter == 4
      {
        
    digitalWrite(relay1LOW);
        
    digitalWrite(relay2LOW);
        
    digitalWrite(relay3LOW);
        
    digitalWrite(relay4HIGH);
        
    digitalWrite(relay5LOW);
        
    digitalWrite(relay6LOW);
      }
       else if (
    counter == 5
      {
        
    digitalWrite(relay1LOW);
        
    digitalWrite(relay2LOW);
        
    digitalWrite(relay3LOW);
        
    digitalWrite(relay4LOW);
        
    digitalWrite(relay5HIGH);
        
    digitalWrite(relay6LOW);
      }
       else if (
    counter == 6
      {
        
    digitalWrite(relay1LOW);
        
    digitalWrite(relay2LOW);
        
    digitalWrite(relay3LOW);
        
    digitalWrite(relay4LOW);
        
    digitalWrite(relay5LOW);
        
    digitalWrite(relay6HIGH);
      }
        
        
    loopTime currentTime;
      }                       


  13. #113
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    Цитат Публикувано от стефан990 Покажи мнения
    ...Засега само експериментирам с цел обучение, нека да свикна C++ тогава ще намалявам обема на кодовете...
    Пиши за да свикваш. Няколко подсказвания:
    Според мен имаш грешка в цикъла "if - else if". Огледай си кода внимателно.

    Няма схема и само мога да гадая дали бутоните и релетата са на един и същ порт на микроконтролера.
    Огледай кода - дали съответното състояние на брояча не съответства на състоянието на порта. Ако да, тоя израз:
    Код:
    if (counter == 1)
    {
        digitalWrite(relay1, HIGH);
        digitalWrite(relay2, LOW);
        digitalWrite(relay3, LOW);
        digitalWrite(relay4, LOW);
        digitalWrite(relay5, LOW);
        digitalWrite(relay6, LOW);
    }
    може да стане така:
    Код:
    if (counter == 1)
    {
        port = counter;
    }
    или ако бутоните са ти на същия порт и са младшите битове, да съответства на състоянието на порта шифтнато два пъти, ще е така:
    Код:
    else if (counter == 1)
    {
        port = counter << 2;
    }
    Няма да е лошо да слагаш по някой коментар в кода. Изглежда като загуба на време, но в някои случаи е полезно.

    Горните примери са само за начало де. Като понапреднеш, ще го оптимизираме още.
    Редактирано от ittso; 29 April 2019 в 10:29.
    Учените са открили, че 90% от хората са симулирали еволюцията.

  14. #114
    Да, else беше излишно и без него кодът си работи
    Релетата (светодиодите) са на един порт на контролера, а енкодерът на друг.
    Не успях да приложа успешно предложените от теб оптимизации, но по мой си начин съкратих кода
    PHP Code:
    /*
    /*
    ** Volume control
    ** 
    */
     
    int Volume 1;      // Volume zapochva ot 1
    int step 1;        // stapka 1
    unsigned long currentTime;
    unsigned long loopTime;
    const 
    int pin_A A1;       // pin A1
    const int pin_B A2;       // pin A2
    unsigned char encoder_A;
    unsigned char encoder_B;
    unsigned char encoder_A_prev=0;
     
    void setup()  
    {
      
    // declare pin 9 to be an output:
      
    pinMode(1OUTPUT);
      
    pinMode(2OUTPUT);
      
    pinMode(3OUTPUT);
      
    pinMode(4OUTPUT);
      
    pinMode(5OUTPUT);
      
    pinMode(6OUTPUT);    
      
    pinMode(pin_AINPUT);
      
    pinMode(pin_BINPUT);
      
    currentTime millis();
      
    loopTime currentTime

     
    void loop()  
    {
      
    currentTime millis();
      if(
    currentTime >= (loopTime 5))     // proveryava na vseki 5ms 
     
    {
        
    encoder_A digitalRead(pin_A);     // otchita sastoyanie na pin А na enkodera 
        
    encoder_B digitalRead(pin_B);     // otchita sastoyanie na pin B na enkodera     
        
    if((!encoder_A) && (encoder_A_prev))    // ako sastoyanieto se e promenilo ot + na 0
         
    { if(encoder_B
            {
            if (
    Volume step >= 1Volume -= step
            
    // izhod B e na otricatelno sastoyanie oznachava vartena obratno na chasovnikovata strelka
            // namalyavane na Volume ne po-nisko ot 1  
                
    delay(50); // izchakva 50ms predi namalyavane na prednoto nivo
            
    }    
            else 
            {
            if(
    Volume step <= 6Volume += step;
            
    // izhod B e na polojitelno sastoyanie oznachava vartene po chasovnikovata strelka     
            // uvelichavane na Volume ne poveche ot 32
            
    delay(50); // izchakva 50ms predi uvelichavane na sledvashto nivo         
            
    }  
          }   
        
    encoder_A_prev encoder_A;     // sahranyava stoynostta na A za sledvashtiya cikal
         
        
    if (Volume == 1
          {
    digitalWrite(1HIGH);}
        if (
    Volume != 1)
          {
    digitalWrite(1LOW);}
     
        if (
    Volume == 2
          {
    digitalWrite(2HIGH);}
        if (
    Volume != 2)
          {
    digitalWrite(2LOW);}

        if (
    Volume == 3
          {
    digitalWrite(3HIGH);}
        if (
    Volume != 3)
          {
    digitalWrite(3LOW);}

        if (
    Volume == 4
          {
    digitalWrite(4HIGH);}
        if (
    Volume != 4)
          {
    digitalWrite(4LOW);}

        if (
    Volume == 5
          {
    digitalWrite(5HIGH);}
        if (
    Volume != 5)
          {
    digitalWrite(5LOW);}

        if (
    Volume == 6
          {
    digitalWrite(6HIGH);}
        if (
    Volume != 6)
          {
    digitalWrite(6LOW);}
          
       
    loopTime currentTime;
     }                       


  15. #115
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    Цитат Публикувано от стефан990 Покажи мнения
    ...Не успях да приложа успешно предложените от теб оптимизации, но по мой си начин съкратих кода...
    Ами нормално. Разсейвал съм се като съм писал. Горните примери са приложими за R-2R матрица.

    Така, очевидно напредваш, затова още малко подсказвания.
    В оригиналния проект управляваш 32 релета. Тост това предполага брояч от 0 до 32, като 0 е мют - всички релета са изключени. Общо 33 състояния.
    Какво ще стане ако броячът стане 33? Ако е 255 и се увеличи с 1 стъпка? Ако е 0 и намалее с 1 стъпка?
    Предвид някаква защита броячът да не преминава лимитите в + и в -.
    Учените са открили, че 90% от хората са симулирали еволюцията.

  16. #116
    Мисля mute да е ниво едно, защото релетата ще са 32 и трябва да намаля стъпките на 31, пък mute на -70dB смятам, че ще е добре. Пробвах да добавя muting ама нещо не ми се получава. Иначе ми се ще при натискане на mute плавно да се намали звука през всички стъпки за около секунда и при повторно натискане пак през всички стъпки да се върне на нивото на което е било. Но това няма да е толкова лесно, поне засега.
    Интересното при този код е че не слиза под 1 и не превишава 6 (с релетата ще е 32)

  17. #117
    Добре би било да избягваш изпозлването на изводи 0 и 1 в програмите си, освен ако това не се налага по някаква причина. Вътрешно те са свързани към интерфейсния чип. При нискоомен товар ще ти се затрудни комуникацията (при препрограмиране ще се налага разкачване на изпълнителната схема от извода нататък, както и при евентуално бъдещо изпозлване на Serial (напр. Serial монитор) за комуникация, контрол на съдържание на променливи и др.).
    Прикрепени изображения Прикрепени изображения
    Редактирано от veso74; 29 April 2019 в 20:55.

  18. #118
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    Цитат Публикувано от стефан990 Покажи мнения
    ...Иначе ми се ще при натискане на mute плавно да се намали звука през всички стъпки за около секунда и при повторно натискане пак през всички стъпки да се върне на нивото на което е било. Но това няма да е толкова лесно, поне засега...
    Не му се плаши. Днес не е лесно, но утре ще бъде...

    При активен мют сетваш някаква променлива (флаг). Когато въпросният флаг е активен, запомняш текущия волюм, и през някакъв интервал намаляваш брояча за волюм, съобразявайки се с лимита за минимум. В случая 0.
    Когато не е активен, натрупваш брояча до запаметената стойност на волюма. Пак през някакъв интервал, съобразен със желаната скорост на усилване.
    Има и още детайли, но засега и това е достатъчно.
    Учените са открили, че 90% от хората са симулирали еволюцията.

  19. #119
    За напред ще се опитам да ги оставя свободни извод 0 и 1.

    Добавих и mute
    PHP Code:
    /*
    ** Volume control
    ** 
    */


    const int buttonPin 8;
    int Mute 0;
    int Volume 1;      // Volume zapochva ot 1
    int step 1;        // stapka 1
    unsigned long currentTime;
    unsigned long loopTime;
    const 
    int pin_A A1;       // pin A1
    const int pin_B A2;       // pin A2
    unsigned char encoder_A;
    unsigned char encoder_B;
    unsigned char encoder_A_prev=0;
     
    void setup()  
    {
      
    pinMode(7OUTPUT);
      
    pinMode(2OUTPUT);
      
    pinMode(3OUTPUT);
      
    pinMode(4OUTPUT);
      
    pinMode(5OUTPUT);
      
    pinMode(6OUTPUT);
      
    pinMode(buttonPinINPUT);    
      
    pinMode(pin_AINPUT);
      
    pinMode(pin_BINPUT);
      
    currentTime millis();
      
    loopTime currentTime

     
    void loop() 
    {
      
    currentTime millis();
      if(
    currentTime >= (loopTime 5))     // proveryava na vseki 5ms 
     
    {
        
    encoder_A digitalRead(pin_A);     // otchita sastoyanie na pin А na enkodera 
        
    encoder_B digitalRead(pin_B);     // otchita sastoyanie na pin B na enkodera     
        
    if((!encoder_A) && (encoder_A_prev))    // ako sastoyanieto se e promenilo ot + na 0
         
    { if(encoder_B
            {
            if (
    Volume step >= 1Volume -= step
            
    // izhod B e na otricatelno sastoyanie oznachava vartena obratno na chasovnikovata strelka
            // namalyavane na Volume ne po-nisko ot 1  
                
    delay(50); // izchakva 50ms predi namalyavane na prednoto 
            
    }    
            else 
            {
            if(
    Volume step <= 6Volume += step;
            
    // izhod B e na polojitelno sastoyanie oznachava vartene po chasovnikovata strelka     
            // uvelichavane na Volume ne poveche ot 32
            
    delay(50); // izchakva 50ms predi uvelichavane na sledvashto nivo         
            
    }  
          }   
        
    encoder_A_prev encoder_A;     // sahranyava stoynostta na A za sledvashtiya cikal
         
        
    if (Volume == 1
          {
    digitalWrite(7HIGH);}
      else 
    digitalWrite(7LOW);
           
        if (
    Volume == 2
          {
    digitalWrite(2HIGH);}
      else 
    digitalWrite(2LOW);
       
     if (
    Volume == 3
          {
    digitalWrite(3HIGH);}
      else 
    digitalWrite(3LOW);
     
        if (
    Volume == 4
          {
    digitalWrite(4HIGH);}
      else 
    digitalWrite(4LOW);

        if (
    Volume == 5
          {
    digitalWrite(5HIGH);}
      else 
    digitalWrite(5LOW);

        if (
    Volume == 6
          {
    digitalWrite(6HIGH);}
      else 
    digitalWrite(6LOW);

       if (
    digitalRead(buttonPin) == LOW
       {
        
    Mute++;
        
    delay(200);
       }
       if (
    Mute == 0) {}
       if (
    Mute == 1Volume 1;
       else 
       {
        
    Mute 0;
       }
        
    loopTime currentTime;
     }                       

    ittso, можеш ли да дадеш примерен код за променлива (флаг), която да помни волумето ?

  20. #120
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    Ми сковах нещо. Това няма да тръгне директно при теб, само онагледява идеята. Ако го префасонираш леко, би трябвало да потегли.
    Не е изключено да има и някоя недомислица де...

    Код:
    // definitions
    #define MAX_VOLUME  32
    
    // global variables
    unsigned char mute;             // флаг (променлива) указващ дали мют е активен. 
    unsigned char tempVolume;       // променлива в която временно се съхранява актуалната стойност на волюм преди мют.
    unsigned char tempVolTrig = 0;  // флаг указващ дали стойността на волюма е съхранена. целта е да се избегне...
                                    // ...копиране при всяко минаване през цикъла. в противен случай при всяко преминаване...
                                    // ...бихме копирали променената стойност на волюма.
    unsigned char volumeCounter;    // брояч за волюм който използваш в момента. вероятно при теб името на променливата е друго.
    
    // -----------------------------------------------------------
    
    // main loop code
    if (mute == 1)                  // ако мют е активен...
    {
        if (tempVolTrig == 0)       // ако стойността на волюма не е съхранена...
        {
            tempVolume = volumeCounter; // я съхраняваме в tempVolume
            tempVolTrig = 1;        // сетваме флаг че стойността на волюма е съхранена
        }
    
        if (volumeCounter != 0)     // ако волюма не е 0...
        {
            volume counter --;      // намаляваме стойността на брояча с 1
            // some delay code      // някакво закъснение за плавно намаляване
        }
    }
    
    else                            // ако мют не е активен...
    {
        tempVolTrig = 0;            // изчистваме флага, за да може цикъла да се повтори при следващ мют
    
        /*
        if (tempVolume > MAX_VOLUME)    // като опция, може да не го използваш. проверка дали съхранения волюм не е с по-голяма стойност от максималния зададен
        {
            tempVolume = MAX_VOLUME;    // ако е с по-голяма стойност, в случая съхранения волюм става равен на максимално зададения. 
        }
        */
    
        if (volumeCounter < tempVolume) // ако брояча за волюм е с по-малка от съхранената стойност
        {
            volume counter ++;      // увеличаваме стойността на брояча с 1
            // some delay code      // някакво закъснение за плавно усилване
        }
    }
    Учените са открили, че 90% от хората са симулирали еволюцията.

  21. #121
    Ако ползваш енкодер е добре да го направиш да реагира на ускорението. Ще е по-удобно да се усилва и намаля с различна скорост. Става като се отмерва време между стъпките. Добре е при най-бавно въртене стъпката да е през две (4 полу такта). Така ще се избегне неволно прещракване при заставане на енкодера в междинно положение между стъпките. Важна е настройката. Иначе "копчето" ще се усеща като на евтините аудио устройства от най-нисък клас. Ще прескача, няма да се управлява удобно и ще трябва да въртиш като луд. От опит го казвам. Въпреки, че на ардуиното, много не ми е ясно как ще стане, аз ползвам асемблер.

  22. #122
    Много ти благодаря ittso за отделеното време да напишеш кода
    Успях да го подкарам частично (само плавно намалява нивото, след това не се връща на нивото преди mute)
    PHP Code:
    // definitions
    #define MAX_VOLUME  6

    // global variables
    unsigned char Mute;             // флаг (променлива) указващ дали мют е активен. 
    unsigned char tempVolume;       // променлива в която временно се съхранява актуалната стойност на волюм преди мют.
    unsigned char tempVolTrig 0;// флаг указващ дали стойността на волюма е съхранена. целта е да се избегне...
                                  // ...копиране при всяко минаване през цикъла. в противен случай при всяко преминаване...
                                    // ...бихме копирали променената стойност на волюма.
    unsigned char counter;    // брояч за волюм който използваш в момента. вероятно при теб името на променливата е друго.
    const int buttonPin 8;
     
    int buttonA A1;
     
    int buttonB A2;
     
    int relay1 7;
     
    int relay2 2;
     
    int relay3 3;
     
    int relay4 4;
     
    int relay5 5;
     
    int relay6 6;
     
     
     
    void setup() 
    {
      
    pinMode(buttonAINPUT); // бутон за увеличаване на нивото
      
    pinMode(buttonBINPUT); // бутон за намаляване на нивото
      
    pinMode(relay1OUTPUT);
      
    pinMode(relay2OUTPUT);
      
    pinMode(relay3OUTPUT);
      
    pinMode(relay4OUTPUT);
      
    pinMode(relay5OUTPUT);
      
    pinMode(relay6OUTPUT);
      
    pinMode(buttonPinINPUT); // бутон за mute
    }

    void loop() 
    {
       
    int aState;
       
    aState digitalRead(buttonA);
      
       
    int aLastState;
       
    aLastState digitalRead(buttonB);
       
       
       if (
    aState == LOW
       { 
        
    counter++; 
        
    delay(200);
       }
       if (
    aLastState == LOW)
       {
        
    counter--;
        
    delay(200);
       }
        if (
    counter == 1
      {
    digitalWrite(relay1HIGH);}
      else 
    digitalWrite(relay1LOW);
      
       if (
    counter == 2)
       {
    digitalWrite(relay2HIGH);}
       else 
    digitalWrite(relay2LOW);
     
    if (
    counter == 3
     {
    digitalWrite(relay3HIGH);}
       else 
    digitalWrite(relay3LOW);
     
     if (
    counter == 4
      {
    digitalWrite(relay4HIGH);}
       else 
    digitalWrite(relay4LOW);
     
      if (
    counter == 5
      {
    digitalWrite(relay5HIGH);}
       else 
    digitalWrite(relay5LOW);
       
       if (
    counter == 6
      {
    digitalWrite(relay6HIGH);}
       else 
    digitalWrite(relay6LOW);

       if (
    digitalRead(buttonPin) == LOWMute 1;
       
       if  (
    Mute == 1// ако мют е активен...
       
    {
        if (
    tempVolTrig == 1)       // ако стойността на волюма не е съхранена...
        
    {
            
    tempVolume counter// я съхраняваме в tempVolume
            
    tempVolTrig 0;        // сетваме флаг че стойността на волюма е съхранена
        
    }

        if (
    counter != 1)     // ако волюма не е 0...
        
    {
            
    counter --; 
            
    delay(100);// намаляваме стойността на брояча с 1
            // some delay code      // някакво закъснение за плавно намаляване
        
    }
    }

    else                            
    // ако мют не е активен...
    {
        
    tempVolTrig 1;            // изчистваме флага, за да може цикъла да се повтори при следващ мют

       /*
        if (tempVolume > MAX_VOLUME)    // като опция, може да не го използваш. проверка дали съхранения волюм не е с по-голяма стойност от максималния зададен
        {
            tempVolume = MAX_VOLUME;    // ако е с по-голяма стойност, в случая съхранения волюм става равен на максимално зададения. 
        }
        */

        
    if (counter tempVolume// ако брояча за волюм е с по-малка от съхранената стойност
        
    {
            
    counter ++;      // увеличаваме стойността на брояча с 1
           
    delay(100); // some delay code      // някакво закъснение за плавно усилване
        
    }
    }
       

    Добавих предложения от теб код към "стария код" без енкодер (с два бутона е) че е по-прост и ми е по-лесно с него

    употребител, с енкодера като въртя бавно нивото се променя бавно, а като го въртя бързо се променя бързо. С бутоните увеличаването/намаляването е тромаво и напомня за евтин китайски модул

  23. #123
    Имам някои грешки в предния код, които ги коригирах, но няма промяна

    PHP Code:
    // definitions
    #define MAX_VOLUME  6

    // global variables
    unsigned char Mute;             // флаг (променлива) указващ дали мют е активен. 
    unsigned char tempVolume;       // променлива в която временно се съхранява актуалната стойност на волюм преди мют.
    unsigned char tempVolTrig 0;// флаг указващ дали стойността на волюма е съхранена. целта е да се избегне...
                                  // ...копиране при всяко минаване през цикъла. в противен случай при всяко преминаване...
                                    // ...бихме копирали променената стойност на волюма.
    unsigned char counter;    // брояч за волюм който използваш в момента. вероятно при теб името на променливата е друго.
    const int buttonPin 8;
     
    int buttonA A1;
     
    int buttonB A2;
     
    int relay1 7;
     
    int relay2 2;
     
    int relay3 3;
     
    int relay4 4;
     
    int relay5 5;
     
    int relay6 6;
     
     
     
    void setup() 
    {
      
    pinMode(buttonAINPUT); // бутон за увеличаване на нивото
      
    pinMode(buttonBINPUT); // бутон за намаляване на нивото
      
    pinMode(relay1OUTPUT);
      
    pinMode(relay2OUTPUT);
      
    pinMode(relay3OUTPUT);
      
    pinMode(relay4OUTPUT);
      
    pinMode(relay5OUTPUT);
      
    pinMode(relay6OUTPUT);
      
    pinMode(buttonPinINPUT); // бутон за mute
    }

    void loop() 
    {
       
    int aState;
       
    aState digitalRead(buttonA);
      
       
    int aLastState;
       
    aLastState digitalRead(buttonB);
       
       
       if (
    aState == LOW
       { 
        
    counter++; 
        
    delay(200);
       }
       if (
    aLastState == LOW)
       {
        
    counter--;
        
    delay(200);
       }
        if (
    counter == 1
      {
    digitalWrite(relay1HIGH);}
      else 
    digitalWrite(relay1LOW);
      
       if (
    counter == 2)
       {
    digitalWrite(relay2HIGH);}
       else 
    digitalWrite(relay2LOW);
     
    if (
    counter == 3
     {
    digitalWrite(relay3HIGH);}
       else 
    digitalWrite(relay3LOW);
     
     if (
    counter == 4
      {
    digitalWrite(relay4HIGH);}
       else 
    digitalWrite(relay4LOW);
     
      if (
    counter == 5
      {
    digitalWrite(relay5HIGH);}
       else 
    digitalWrite(relay5LOW);
       
       if (
    counter == 6
      {
    digitalWrite(relay6HIGH);}
       else 
    digitalWrite(relay6LOW);

       if (
    digitalRead(buttonPin) == LOWMute 1;
       
       if  (
    Mute == 1// ако мют е активен...
       
    {
        if (
    tempVolTrig == 0)       // ако стойността на волюма не е съхранена...
        
    {
            
    tempVolume counter// я съхраняваме в tempVolume
            
    tempVolTrig 1;        // сетваме флаг че стойността на волюма е съхранена
        
    }

        if (
    counter != 0)     // ако волюма не е 0...
        
    {
            
    counter --; // намаляваме стойността на брояча с 1
            
    delay(100); 
            
    // some delay code      // някакво закъснение за плавно намаляване
        
    }
    }

    else                            
    // ако мют не е активен...
    {
        
    tempVolTrig 0;            // изчистваме флага, за да може цикъла да се повтори при следващ мют

       /*
        if (tempVolume > MAX_VOLUME)    // като опция, може да не го използваш. проверка дали съхранения волюм не е с по-голяма стойност от максималния зададен
        {
            tempVolume = MAX_VOLUME;    // ако е с по-голяма стойност, в случая съхранения волюм става равен на максимално зададения. 
        }
        */

        
    if (counter tempVolume// ако брояча за волюм е с по-малка от съхранената стойност
        
    {
            
    counter ++;      // увеличаваме стойността на брояча с 1
           
    delay(100); 
           
    // some delay code      // някакво закъснение за плавно усилване
        
    }
    }
       


  24. #124
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,923
    На първо време, пооправи си кода да е в по-прегледен вид. Знам, досадно е, но се учи да пишеш чисто.
    Коригирай дългите коментари в кода който публикувах. Не е необходимо да са толкова разточителни и подробни. Такива са само за да се ориентираш кое какво прави и защо.
    Използвай имена на променливи и константи които да ти говорят нещо като гледаш кода. На пръв поглед "counter" изглежда добре, но ако се наложи да имаш още няколко "брояча"? counter_2 и counter_3 определено вече не е.
    В текущия ти код няма това което ще спомена, но да го имаш предвид. Избягвай имена състоящи се от един символ, като масово използваните i, j и т.н. Класически пример: for (i = 0; i < var; i ++)
    Пестеливо е като начин на писане, но сещаш ли се какво ще стане ако се наложи да замениш такава с файнд и риплейс на редактора? На колко места в кода ще намери i или j? По-удачно е вместо i или j да се използва ii или jj.

    Състави си алгоритъм как трябва да работи това нещо. И това е нещо което изглежда като загуба на време, но не е.
    Ако алгоритъма не работи на "квадратчета" и "ромбчета", няма да работи и като код.

    Доколкото дебъгването (откриване на грешки, защо нещо не работи или работи не както искаш) е неделима част от "писането", ще те оставя сам да се сбориш с текущия проблем. Знам, звучи гадно, но това е положението.
    Редактирано от ittso; 1 May 2019 в 17:52.
    Учените са открили, че 90% от хората са симулирали еволюцията.

  25. #125
    Ще се опитам да пиша по-прегледно и ще променя променливите да са по-разбираеми за мен. Още веднъж ittso ти благодаря за помощта. Не очаквам някой друг да ми напише кода, напълно достатъчно ми е като запъна някъде, някой да бутне едно

Страница 5 от 22 ПърваПърва 1 2 3 4 5 6 7 8 9 15 ... ПоследнаПоследна

Права за публикуване

  • Вие не можете да започвате нова тема
  • Вие не можете да отговаряте в тема
  • Вие не можете да прикачвате към мненията си
  • Вие не можете да редактирате мненията си
  •  
  • BB кодове са Включени
  • Smilies са Включени
  • [IMG] кодове са Включени
  • [VIDEO] code is Включени
  • HTML кодове са Изключени