Страница 12 от 21 ПърваПърва ... 2 8 9 10 11 12 13 14 15 16 ... ПоследнаПоследна
Резултати 276 до 300 от 504

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

  1. #276
    Днес вече ми остана време за ардуиното. Върнах реакцията на енкодера по прекъсване. При мутинг си остава плавното намаляване и увеличаване. Добавих и Standby, като софтуерно спирам работата на енкодера за нивото, енкодера за селектора, мутинг функцията и "занулявам" изходите на всички MCP - та. При натискане на standby бутона импулса управляващ силовото захранване се включва/изключва със закъснение 100мс, а релето (светодиода) което е на текущото ниво се изключва след 2 секунди и се включва със същото закъснение, но плавно се връща на нивото на което е било преди изключването от standby бутона.

    Код:
    #include "Rotary.h"
    #include <SPI.h>
    
    const int8_t PowerSupply = A3;
    const int8_t PowerButton = 4;
    bool powerON = false;
    
    const int8_t encoderVolBut = 1;
    int8_t Mute = 0;
    int8_t vol_mute;
    
    int8_t selector = 0;
    Rotary r2 = Rotary(8, 9);
    const int8_t Dac = A0;
    const int8_t Dek = A1;
    const int8_t Vinyl = A2;
    
    const int8_t MCP_CS = 10;
    
    bool ch_flag = true;
    int8_t enc_dir = 0;
    int8_t  vol = 0;
    int8_t vol_old = 1;
    Rotary r = Rotary (2, 3);                    // encoder -> pin 2, pin 3
    
    void set_mcp();
    void set_relays();
    void Selector();
    
    //---------------------------------------------------------------------------------------------------------
    
    void setup() 
    {
      attachInterrupt(0, rotary_encoder, CHANGE);
      attachInterrupt(1, rotary_encoder, CHANGE);
    
      pinMode(PowerSupply, OUTPUT);
      pinMode(PowerButton, INPUT);
      digitalWrite(PowerButton, HIGH);
      
      pinMode(encoderVolBut, INPUT);  
      
      pinMode(Dac, OUTPUT);
      pinMode(Dek, OUTPUT);
      pinMode(Vinyl, OUTPUT);
     
      SPI.begin();                               
      pinMode(MCP_CS, OUTPUT);
      digitalWrite(MCP_CS, HIGH);           
      set_mcp(0x40, 0x00, 0x00);
      set_mcp(0x40, 0x05, 0x28);
      
      set_mcp(0x42, 0x00, 0x00);
      set_mcp(0x42, 0x05, 0x28);
      
      set_mcp(0x44, 0x00, 0x00);
      set_mcp(0x44, 0x05, 0x28);
      
      set_mcp(0x46, 0x00, 0x00);
      set_mcp(0x46, 0x05, 0x28);        
    }
    //---------------------------------------------------------------------------------------------------------
    
    void loop()
    {
      Selector();
      
       if (ch_flag) 
      {
       ch_flag = false;
       vol += enc_dir;
       vol = constrain(vol, 0, 33);
       if (vol != vol_old) 
       {
         set_relays();
         vol_mute = vol;
       }
        enc_dir = 0; 
      }
    
      // MUTING------------------------------------------------------------------------------------------------
       if((digitalRead (encoderVolBut) == LOW)&& (powerON == true))
       {
        Mute++;
        delay(200);
       }
       switch(Mute)
        {
          case 0: set_relays(); break;
          case 1:
         
            while(vol >= 1)
             {
              set_relays();
              vol -= 1;
              delay(10);
             }
              if(powerON = true) 
              set_mcp(0x40, 0x09, 0b00000001);
          break;
          default:
            while(vol <  vol_mute)
             {
              set_relays();
              vol += 1;
              delay(30);
             }
            set_relays();
            vol_mute;
            Mute = 0;
          break;
        }
        
    // STANDBY------------------------------------------------------------------------------------------------
        if (digitalRead(PowerButton) == LOW) 
        {
          delay(100);                     
          powerON = !powerON;           
          digitalWrite(PowerSupply, powerON);
          delay(2000);
        }
        switch(powerON)
        { 
          case false:
           Mute = 0;
           vol = 0;
           set_mcp(0x40, 0x09, 0b00000000);
           set_mcp(0x42, 0x09, 0b00000000);
           set_mcp(0x44, 0x09, 0b00000000);
           set_mcp(0x46, 0x09, 0b00000000);
           
          
         break;
         case true:
          if(Mute == 0)
         while(vol <  vol_mute)
          {
           set_relays();
           vol += 1;
           delay(100);
          }
           set_relays();
           vol_mute;
         break;
        }
    }
      
    //---------------------------------------------------------------------------------------------------------
    
      void set_mcp(byte mcp_addr,byte addr,byte data)
    { 
      digitalWrite(MCP_CS, LOW);
      delay(1);
      SPI.transfer(mcp_addr);
      SPI.transfer(addr);
      SPI.transfer(data);
      delay(1);
      digitalWrite(MCP_CS, HIGH);
      
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void rotary_encoder() 
    {  // rotary encoder events        
      uint8_t result = r.process();
    
      if ((result)&& (powerON == true))
      
      {   ch_flag = true;
        if (result == DIR_CW)        // clockwise
          enc_dir = 1;
        else                         // counterclockwise
          enc_dir = -1;
      }
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void set_relays() 
    {  
    if(powerON == true) 
    {
     switch(vol)
     {
     
      case 0:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 1:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 2:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 3:   set_mcp(0x40, 0x09, 0b00000010);  break;
      case 4:   set_mcp(0x40, 0x09, 0b00000100);  break;
      case 5:   set_mcp(0x40, 0x09, 0b00001000);  break;
      case 6:   set_mcp(0x40, 0x09, 0b00010000);  break;
      case 7:   set_mcp(0x40, 0x09, 0b00100000);  break; 
      case 8:   set_mcp(0x40, 0x09, 0b01000000);  break;   
      case 9:   set_mcp(0x40, 0x09, 0b10000000);   
                set_mcp(0x42, 0x09, 0b00000000);  break;        
      case 10:  set_mcp(0x42, 0x09, 0b00000001);   
                set_mcp(0x40, 0x09, 0b00000000);  break;  
      case 11:  set_mcp(0x42, 0x09, 0b00000010);  break;
      case 12:  set_mcp(0x42, 0x09, 0b00000100);  break;
      case 13:  set_mcp(0x42, 0x09, 0b00001000);  break;
      case 14:  set_mcp(0x42, 0x09, 0b00010000);  break;
      case 15:  set_mcp(0x42, 0x09, 0b00100000);  break;
      case 16:  set_mcp(0x42, 0x09, 0b01000000);  break;
      case 17:  set_mcp(0x42, 0x09, 0b10000000);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 18:  set_mcp(0x44, 0x09, 0b00000001);  
                set_mcp(0x42, 0x09, 0b00000000);  break;
      case 19:  set_mcp(0x44, 0x09, 0b00000010);  break;
      case 20:  set_mcp(0x44, 0x09, 0b00000100);  break;
      case 21:  set_mcp(0x44, 0x09, 0b00001000);  break;
      case 22:  set_mcp(0x44, 0x09, 0b00010000);  break;
      case 23:  set_mcp(0x44, 0x09, 0b00100000);  break;
      case 24:  set_mcp(0x44, 0x09, 0b01000000);  break;
      case 25:  set_mcp(0x44, 0x09, 0b10000000);  
                set_mcp(0x46, 0x09, 0b00000000);  break;
      case 26:  set_mcp(0x46, 0x09, 0b00000001);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 27:  set_mcp(0x46, 0x09, 0b00000010);  break;
      case 28:  set_mcp(0x46, 0x09, 0b00000100);  break;
      case 29:  set_mcp(0x46, 0x09, 0b00001000);  break;
      case 30:  set_mcp(0x46, 0x09, 0b00010000);  break;
      case 31:  set_mcp(0x46, 0x09, 0b00100000);  break;
      case 32:  set_mcp(0x46, 0x09, 0b01000000);  break;
      case 33:  set_mcp(0x46, 0x09, 0b10000000);  break;
     }
    }
    }
     
    //---------------------------------------------------------------------------------------------------------
      
    void Selector()
      {
        uint8_t result_2 = r2.process(); 
     
        if ((result_2) && (powerON == true))
        {
        if (result_2 == DIR_CW)
          {selector++;
          delay(200);}
        else
         { selector--;
          delay(200);}
        }
          if (selector == -1) 
              selector = 2;
         else selector != 2;
        
          if (selector == 0) 
              digitalWrite(Dac, HIGH);
         else digitalWrite(Dac, LOW);
      
          if (selector == 1) 
              digitalWrite(Dek, HIGH);
         else digitalWrite(Dek, LOW);
       
          if (selector == 2) 
              digitalWrite(Vinyl, HIGH);
         else digitalWrite(Vinyl, LOW);
    
          if (selector == 3) 
              selector = 0;
         else selector != 0;
      }

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

        
       

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

  3. #278
    Как да накарам с натискане на бутон да се извършва едно действие, а със задържането му за определено време да се извършва друго ? Може би има отговор в книжката, но още не съм стигнал до края . Опитах се да намеря някакъв не сложен пример из нета, но не успях.

  4. #279
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,659
    При натискане на бутона, започваш да инкрементираш някакъв брояч. Когато стигне зададена стойност, вдигаш флаг че имаш състояние "задържан бутон" или правиш каквото имаш да правиш.
    Нулираш брояча за задържан бутон при отпускане на бутона, а ако използваш флаг, и него.

    Хубаво е да има и защита от препълване и превъртане на брояча.
    Учените са открили, че 90% от хората са симулирали еволюцията.

  5. #280
    Сори за офтопика, 2 бързи въпроса:

    1. Logic Analyzer - това ок ли е за целта, ако се закучи някакъв част, ако трябва да се управляват устройства с техен си протокол:
    - https://www.ebay.com/itm/USB-Logic-A...M/362535554469

    2. Някой програмирал ли е attiny 24/44/84 през ардуиното? Има някакви скъпи платки с нищо по тях, има и туториал:
    - https://www.instructables.com/id/Usi...ATTINY84-20PU/

    С attiny 85 има готови програматорчета с юсб (още не съм ги пробвал), но по-малко in/out възможности.

    Идеята за attiny е да се ползва като slave у-во по I2C, в паралел, да му се назначи адрес и да служи като интерфейс за някакъв модул, управляван от arduino-то.
    И за това има туториал, не ми се търси сега.

    Така, при ниските скорости които биха трябвали за такъв тип проекти, може почти неограничено да експандваме arduino Uno.
    И с паметта, като логиката за под-модулите е в attiny контролерчетата, едва ли ще имаме проблеми.
    Прикрепени изображения Прикрепени изображения

  6. #281
    Нещо такова няма ли да свърши чудесна работа, ами трябва да е подчинено устройство с микроконтролер?
    https://store.comet.bg/Catalogue/Product/18107/

  7. #282
    Цитат Публикувано от Supraphon Покажи мнения
    Нещо такова няма ли да свърши чудесна работа, ами трябва да е подчинено устройство с микроконтролер?
    https://store.comet.bg/Catalogue/Product/18107/
    Това не трябва ли да се програмира на ниско ниво?
    Може ли да му се назначи I2C адрес?

  8. #283
    Това е най-елементарен преместващ регистър, не знам какво имаш предвид под "ниско ниво", но все си мисля, че не трябва да е проблем да се пусне на SPI шината независимо от програмния език с който работиш. I2C адрес няма как да му назначиш, защото това не е устройство поддържащо този интерфейс. Иначе от тези може да навържеш серийно колкото си искаш.

  9. #284
    Цитат Публикувано от ittso Покажи мнения
    При натискане на бутона, започваш да инкрементираш някакъв брояч. Когато стигне зададена стойност, вдигаш флаг че имаш състояние "задържан бутон" или правиш каквото имаш да правиш.
    Нулираш брояча за задържан бутон при отпускане на бутона, а ако използваш флаг, и него.

    Хубаво е да има и защита от препълване и превъртане на брояча.
    Това с брояча се получи, но не както очаквах. Задържам бутона - "усилвателят се включва", натискам бутона без да го задържам - включва се мутинга, натискам повторно бутона без да го задържам - изключва мутинга, но като натисна бутона и го задържа броячът винаги минава през мутинга преди да "изключи усилвателя". Тоест ако мутинга е включен, преди да се изключи усилвателят ще се изключи мутинга, а ако мутингът е изключен ще се включи. Мога ли по някакъв начин да заобиколя мутинга при задържан бутон ?
    Добавих и втори брояч, който да нулира първия
    Код:
    // PUSH Vol Encoder button------------------------------------------------------------------------------------------------
    if (digitalRead(buton) == LOW) 
     {
       {
       reset_count = true;
       count++;
       delay(2);
       }
     if((count == 1) && (powerON == true))
       { 
        mute = !mute; 
       }
     if(count > 200)
       {                 
       powerON = !powerON;             
       digitalWrite(PowerSupply, powerON);
       mute = false;
       delay(500);
       count = 0;
       }
     }
     if(reset_count == true)
      {
       { 
       count1++;
       delay(2);
       }
     if(count1 > 201)
       {
        count = 0;
        reset_count = false;
        count1 = 0;
       }
      }

  10. #285
    Защо напускаш процедурата преди тя да е определила натиснат ли е кратко бутон или е дълго натиснат/задържан, а оставяш тя да се върти в loop?
    (всъщност кодът ти не е в процедура/функция? ...).

    Вариант:
    do {
    ...
    броене или отчитане на време или друго действие}
    (ако е много дълго натискането, също напусни цикъла - бутонът е задържан}
    ...
    while (digitalRead(buton) == LOW);

    и следва анализ:
    вариант 1: 0..20 милисекунди: много кратко, нищо не прави - за debounce: смущение, "фалшив сигнал" или друго, за което не е нужно действие
    вариант 2: от x до y: кратко натискане
    вариант 3: по-голямо от y: дълго натискане или задържане

    Всъщност и брояч не е необходим. Погледни за Arduino функции: millis() и micros();
    Достатъчно е на променлива (32 битова: unsigned long, uint32_t) да присвоиш в началото стойността, при изход (или събитие) да извадиш стойностите и ще имаш информация колко време е изминало. Няма подсказвам повече .
    Редактирано от veso74; 12 June 2019 в 23:07.

  11. #286
    От 3 часа се мъча да го подкарам с millis(), но без успех. Вероятно с него ще работи по-добре, кодът ще е по-грамотно написан и вероятно ще е по-кратък. За съжаление моя код е излишно сложен, написан доста идиотски. Поне го докарах при задържане на бутона да не включва/изключва мутинга.
    Ето как изглежда целият код:
    Код:
    #include "Rotary.h"
    #include <SPI.h>
    
    
    
    const int8_t PowerSupply = A3;
    const uint8_t buton = 4;
    bool powerON = false;
    bool mute = false;
    bool reset_count = false;
    int count = 0;
    int count1 = 0;
    
    int8_t selector = 0;
    Rotary r2 = Rotary(8, 9);
    const int8_t Dac = A0;
    const int8_t Dek = A1;
    const int8_t Vinyl = A2;
    
    const int8_t encoderVolBut = 1;
    
    int8_t vol_mute;
    
    const int8_t MCP_CS = 10;
    
    bool ch_flag = true;
    int8_t enc_dir = 0;
    int8_t  vol = 0;
    int8_t vol_old = 1;
    Rotary r = Rotary (2, 3);                    // encoder -> pin 2, pin 3
    
    void set_mcp();
    void set_relays();
    void Selector();
    void Standby();
    void Muting();
    //---------------------------------------------------------------------------------------------------------
    
    void setup() 
    {
      attachInterrupt(0, rotary_encoder, CHANGE);
      attachInterrupt(1, rotary_encoder, CHANGE);
    
      pinMode(PowerSupply, OUTPUT);
      pinMode(buton, INPUT);
    
      
      pinMode(encoderVolBut, INPUT);  
      
      pinMode(Dac, OUTPUT);
      pinMode(Dek, OUTPUT);
      pinMode(Vinyl, OUTPUT);
     
      SPI.begin();                               
      pinMode(MCP_CS, OUTPUT);
      digitalWrite(MCP_CS, HIGH);           
      set_mcp(0x40, 0x00, 0x00);
      set_mcp(0x40, 0x05, 0x28);
      
      set_mcp(0x42, 0x00, 0x00);
      set_mcp(0x42, 0x05, 0x28);
      
      set_mcp(0x44, 0x00, 0x00);
      set_mcp(0x44, 0x05, 0x28);
      
      set_mcp(0x46, 0x00, 0x00);
      set_mcp(0x46, 0x05, 0x28);        
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void loop()
    { 
      PushButton();
      Selector();
      Standby();
      Muting();
      
       if (ch_flag) 
      {
       ch_flag = false;
       vol += enc_dir;
       vol = constrain(vol, 0, 33);
       if (vol != vol_old) 
       {
         set_relays();
         vol_mute = vol;
       }
        enc_dir = 0; 
      }
    
    
    }
      
    //---------------------------------------------------------------------------------------------------------
    
      void set_mcp(byte mcp_addr,byte addr,byte data)
    { 
      digitalWrite(MCP_CS, LOW);
      delay(1);
      SPI.transfer(mcp_addr);
      SPI.transfer(addr);
      SPI.transfer(data);
      delay(1);
      digitalWrite(MCP_CS, HIGH);
      
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void rotary_encoder() 
    {  // rotary encoder events        
      uint8_t result = r.process();
    
      if ((result)&& (powerON == true))
      
      {   ch_flag = true;
        if (result == DIR_CW)        // clockwise
          enc_dir = 1;
        else                         // counterclockwise
          enc_dir = -1;
      }
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void set_relays() 
    {  
    if(powerON == true) 
    {
     switch(vol)
     {
     
      case 0:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 1:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 2:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 3:   set_mcp(0x40, 0x09, 0b00000010);  break;
      case 4:   set_mcp(0x40, 0x09, 0b00000100);  break;
      case 5:   set_mcp(0x40, 0x09, 0b00001000);  break;
      case 6:   set_mcp(0x40, 0x09, 0b00010000);  break;
      case 7:   set_mcp(0x40, 0x09, 0b00100000);  break; 
      case 8:   set_mcp(0x40, 0x09, 0b01000000);  break;   
      case 9:   set_mcp(0x40, 0x09, 0b10000000);   
                set_mcp(0x42, 0x09, 0b00000000);  break;        
      case 10:  set_mcp(0x42, 0x09, 0b00000001);   
                set_mcp(0x40, 0x09, 0b00000000);  break;  
      case 11:  set_mcp(0x42, 0x09, 0b00000010);  break;
      case 12:  set_mcp(0x42, 0x09, 0b00000100);  break;
      case 13:  set_mcp(0x42, 0x09, 0b00001000);  break;
      case 14:  set_mcp(0x42, 0x09, 0b00010000);  break;
      case 15:  set_mcp(0x42, 0x09, 0b00100000);  break;
      case 16:  set_mcp(0x42, 0x09, 0b01000000);  break;
      case 17:  set_mcp(0x42, 0x09, 0b10000000);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 18:  set_mcp(0x44, 0x09, 0b00000001);  
                set_mcp(0x42, 0x09, 0b00000000);  break;
      case 19:  set_mcp(0x44, 0x09, 0b00000010);  break;
      case 20:  set_mcp(0x44, 0x09, 0b00000100);  break;
      case 21:  set_mcp(0x44, 0x09, 0b00001000);  break;
      case 22:  set_mcp(0x44, 0x09, 0b00010000);  break;
      case 23:  set_mcp(0x44, 0x09, 0b00100000);  break;
      case 24:  set_mcp(0x44, 0x09, 0b01000000);  break;
      case 25:  set_mcp(0x44, 0x09, 0b10000000);  
                set_mcp(0x46, 0x09, 0b00000000);  break;
      case 26:  set_mcp(0x46, 0x09, 0b00000001);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 27:  set_mcp(0x46, 0x09, 0b00000010);  break;
      case 28:  set_mcp(0x46, 0x09, 0b00000100);  break;
      case 29:  set_mcp(0x46, 0x09, 0b00001000);  break;
      case 30:  set_mcp(0x46, 0x09, 0b00010000);  break;
      case 31:  set_mcp(0x46, 0x09, 0b00100000);  break;
      case 32:  set_mcp(0x46, 0x09, 0b01000000);  break;
      case 33:  set_mcp(0x46, 0x09, 0b10000000);  break;
     }
    }
    }
     
    //---------------------------------------------------------------------------------------------------------  
    
    void PushButton()
    {
     
     while (digitalRead(buton) == LOW) 
     {
       {
       reset_count = true;
       count++;
       delay(4);
       }
     if((count == 1) && (powerON == true))
       { 
        mute = !mute; 
       }
     if(count == 200)
       {                 
       powerON = !powerON;             
       digitalWrite(PowerSupply, powerON);
       mute = false;
       
       count = 0;
       }
     }
     if(reset_count == true)
      {
       { 
       count1++;
       delay(4);
       }
     if(count1 > 200)
       {
        count = 0;
        reset_count = false;
        count1 = 0;
       }
      }
    }
    
    //---------------------------------------------------------------------------------------------------------
    
      void Standby() 
    {
       switch(powerON)
        { 
          case false:
           vol = 2;
           set_mcp(0x40, 0x09, 0b00000000);
           set_mcp(0x42, 0x09, 0b00000000);
           set_mcp(0x44, 0x09, 0b00000000);
           set_mcp(0x46, 0x09, 0b00000000);
           if(mute == 1)
           vol_mute = 2;
           mute = 0; 
         break;
         case true:
          if(mute == 0)
           while(vol <  vol_mute)
            {
             set_relays();
             vol += 1;
             delay(100);
            }
           vol_mute;
         break;
        }
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void Muting()
    {
      switch(mute)
        {
          case 0: 
            set_relays(); 
          break;
          case 1:
            if(vol == 2)
            mute = 0;
            while(vol >= 2)
             {
              set_relays();
              vol -= 1;
              delay(10);
             }
              if(powerON = true) 
              set_mcp(0x40, 0x09, 0b00000001);
          break;
          default:
            while(vol <  vol_mute)
             {
              set_relays();
              vol += 1;
              delay(30);
             }
            vol_mute;
            mute = 0;
          break;
        }
    }
    
    //---------------------------------------------------------------------------------------------------------
    
    void Selector()
      {
        uint8_t result_2 = r2.process(); 
     
        if ((result_2) && (powerON == true))
        {
        if (result_2 == DIR_CW)
          {selector++;
          delay(200);}
        else
         { selector--;
          delay(200);}
        }
          if (selector == -1) 
              selector = 2;
         else selector != 2;
        
          if (selector == 0) 
              digitalWrite(Dac, HIGH);
         else digitalWrite(Dac, LOW);
      
          if (selector == 1) 
              digitalWrite(Dek, HIGH);
         else digitalWrite(Dek, LOW);
       
          if (selector == 2) 
              digitalWrite(Vinyl, HIGH);
         else digitalWrite(Vinyl, LOW);
    
          if (selector == 3) 
              selector = 0;
         else selector != 0;
      }

  12. #287
    офф топик малко, ама самата идея ми се струва като лош UI.

    Защо държиш да имаш тези функции само на един бутон?
    Пък и едната да е изключване...
    Толкова ли не може да сложиш изключването на отделно бутонче?
    Мутинга е по-логично да е на енкодера.

    Ако искаш да ползваш един енкодер за всичко, смислен UI би бил с копчето на енкодера влизаш в меню, с въртене на енкодера да избираш опции в менюто, пак с копчето да потвърждаваш избор - който прави нещо ,или те вкарва в избор на под меню и т.н.

    И пак е добре да имаш второ копче - примерно за стъпка назад, а не да се мъчиш да нацелваш тайминг.
    За целта ще трябва и дисплей.

    А кода.... Бая код е станало .

  13. #288
    Идеята ми е всичко да се управлява с два енкидера. Единия енкодер за нивото, а бутонът му ще включва усилвателя (когато се задържи за определено време) и ще включва изключва/изключва мутинга с натискане натискане на същия бутон, но без задържане
    Вторият енкодер ще е за селектора, с натискането му ще превключва за регулиране на яркостта на индикацията и с повторното му натискаме ще превключи на селектира
    Може енкодера за звука да остане само за мутинга, а този за селектора да е и за включване на индикацията. Това е лесна работа трудното е грамотно да напиша кода за задържан бутон, но може и така да си остане, важното е че работи и знам кое какво прави. Все пак в бъдеще като понапредна мога да го променя

  14. #289
    ... а не да се мъчиш да нацелваш тайминг
    То при "дълго натискане / задържане" няма "мъчене" - натискаш, минава 400 ms примерно (ако искаш дръж бутона натиснат още), решението вече е взето - задействана е втората функция. За POWER-OFF е практично, проверено. Допада ми.

  15. #290
    Това "дистанционно" има ли някакъв изглед?
    Руски форум. Задаваш въпрос, после ти отговарят.
    Израелски форум. Задаваш въпрос, после на теб ти задават въпрос.
    Български форум. Задаваш въпрос, после дълго ти разказват колко си тъп.
    Явно кабелите са слушани години с тонкоректор на по-висока честота...
    Аз трябва DSD-тата да ги конвертирам в SACD, че да ги слушам нативно.
    Ама това с тия източници си е лесната част. С пустите ампове е големия зор!

  16. #291
    Направих малко промени по кода. Бутонът на енкодера за селектора и за индикацията ще е за включване на усилвателя. Задържам бутона- усилвателят се включва, със завъртане на енкодера се избира входа, с натискане на на бутона на енкодера за кратко се включва избор на ниво на светене на индикацията, с повторно натискане се превключва от промяната на нивото на индикацията към селектора.
    При натискане на бутона на енкодера за нивото на звука се включва/изключва мутинга. Плавното намаляване до първата стъпка и от нея до нивото на което е било преди mute си остава.

    За съжаление входовете/изходите на контролера взеха да ми идват малко. Мога ли да добавя един чип MCP23008, който ще се управлява по I2s. За него ще са необходими два изхода на контролера, а MCP то ще го използвам за входовете усилвателя и индикацията.

    Дистанционното пристигна, трябва да се захващам с него. Ще се опитам да намеря някой демонтиран приемник, че не ми са е да поръчам само него от комет. Някой може ли да предложи читава библиотека за дистанционно управление. И малко разяснения биха ми били от полза

    Код:
    #include "Rotary.h"
    #include <SPI.h>
    
    const int8_t MCP_CS = 10;
    const int8_t PowerSupply = A3;
    const int8_t encoderSelBut = 4;
    const int8_t Brightnes = 1;
    bool powerON = false;
    bool selBrightnes = false;
    bool reset_count = false;
    
    int count = 0;
    int count1 = 0;
    int count2 = 0;
    int mute = 0;
    int countBts = 0;
    int countSel = 0;
    
    Rotary r2 = Rotary(8, 9);
    const int8_t Dac = A0;
    const int8_t Dek = A1;
    const int8_t Vinyl = A2;
    const int8_t bts1 = 0;
    const int8_t bts2 = 5;
    const int8_t bts3 = 6;
    
    const int8_t encoderVolBut = 7;
    int8_t vol_mute;
    
    bool ch_flag = true;
    int8_t enc_dir = 0;
    int8_t  vol = 0;
    int8_t vol_old = 1;
    Rotary r = Rotary (2, 3);                    // encoder -> pin 2, pin 3
    
    void PushEncoderSelButton();
    void PushEncoderVolButton();
    void Brigthtness();
    void set_mcp();
    void set_relays();
    void Selector();
    void Standby();
    void Muting();
    
    void setup() 
    {
      attachInterrupt(0, rotary_encoder, CHANGE);
      attachInterrupt(1, rotary_encoder, CHANGE);
    
      pinMode(PowerSupply, OUTPUT);
      pinMode(Brightnes, OUTPUT);
      pinMode(encoderSelBut, INPUT);
      pinMode(encoderVolBut, INPUT);
    
      pinMode(bts1, OUTPUT);
      pinMode(bts2, OUTPUT);
      pinMode(bts3, OUTPUT);
      pinMode(Dac, OUTPUT);
      pinMode(Dek, OUTPUT);
      pinMode(Vinyl, OUTPUT);
     
      SPI.begin();                               
      pinMode(MCP_CS, OUTPUT);
      digitalWrite(MCP_CS, HIGH);           
      set_mcp(0x40, 0x00, 0x00);
      set_mcp(0x40, 0x05, 0x28);
      
      set_mcp(0x42, 0x00, 0x00);
      set_mcp(0x42, 0x05, 0x28);
      
      set_mcp(0x44, 0x00, 0x00);
      set_mcp(0x44, 0x05, 0x28);
      
      set_mcp(0x46, 0x00, 0x00);
      set_mcp(0x46, 0x05, 0x28);        
    }
    
    void loop()
    { 
      PushEncoderSelButton();
      SelEncoder();
      Standby();
      Muting();
      
       if (ch_flag) 
      {
       ch_flag = false;
       vol += enc_dir;
       vol = constrain(vol, 0, 33);
       if (vol != vol_old) 
       {
         set_relays();
         vol_mute = vol;
       }
        enc_dir = 0; 
      }
    }
      
    void set_mcp(byte mcp_addr,byte addr,byte data)
    { 
      digitalWrite(MCP_CS, LOW);
      delay(1);
      SPI.transfer(mcp_addr);
      SPI.transfer(addr);
      SPI.transfer(data);
      delay(1);
      digitalWrite(MCP_CS, HIGH);
    }
    
    void rotary_encoder() 
    {  // rotary encoder events        
      uint8_t result = r.process();
    
      if ((result)&& (powerON == true))
      
      {   ch_flag = true;
        if (result == DIR_CW)        // clockwise
          enc_dir = 1;
        else                         // counterclockwise
          enc_dir = -1;
      }
    }
    
    void set_relays() 
    {  
    if(powerON == true) 
    {
     switch(vol)
     {
      case 0:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 1:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 2:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 3:   set_mcp(0x40, 0x09, 0b00000010);  break;
      case 4:   set_mcp(0x40, 0x09, 0b00000100);  break;
      case 5:   set_mcp(0x40, 0x09, 0b00001000);  break;
      case 6:   set_mcp(0x40, 0x09, 0b00010000);  break;
      case 7:   set_mcp(0x40, 0x09, 0b00100000);  break; 
      case 8:   set_mcp(0x40, 0x09, 0b01000000);  break;   
      case 9:   set_mcp(0x40, 0x09, 0b10000000);   
                set_mcp(0x42, 0x09, 0b00000000);  break;        
      case 10:  set_mcp(0x42, 0x09, 0b00000001);   
                set_mcp(0x40, 0x09, 0b00000000);  break;  
      case 11:  set_mcp(0x42, 0x09, 0b00000010);  break;
      case 12:  set_mcp(0x42, 0x09, 0b00000100);  break;
      case 13:  set_mcp(0x42, 0x09, 0b00001000);  break;
      case 14:  set_mcp(0x42, 0x09, 0b00010000);  break;
      case 15:  set_mcp(0x42, 0x09, 0b00100000);  break;
      case 16:  set_mcp(0x42, 0x09, 0b01000000);  break;
      case 17:  set_mcp(0x42, 0x09, 0b10000000);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 18:  set_mcp(0x44, 0x09, 0b00000001);  
                set_mcp(0x42, 0x09, 0b00000000);  break;
      case 19:  set_mcp(0x44, 0x09, 0b00000010);  break;
      case 20:  set_mcp(0x44, 0x09, 0b00000100);  break;
      case 21:  set_mcp(0x44, 0x09, 0b00001000);  break;
      case 22:  set_mcp(0x44, 0x09, 0b00010000);  break;
      case 23:  set_mcp(0x44, 0x09, 0b00100000);  break;
      case 24:  set_mcp(0x44, 0x09, 0b01000000);  break;
      case 25:  set_mcp(0x44, 0x09, 0b10000000);  
                set_mcp(0x46, 0x09, 0b00000000);  break;
      case 26:  set_mcp(0x46, 0x09, 0b00000001);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 27:  set_mcp(0x46, 0x09, 0b00000010);  break;
      case 28:  set_mcp(0x46, 0x09, 0b00000100);  break;
      case 29:  set_mcp(0x46, 0x09, 0b00001000);  break;
      case 30:  set_mcp(0x46, 0x09, 0b00010000);  break;
      case 31:  set_mcp(0x46, 0x09, 0b00100000);  break;
      case 32:  set_mcp(0x46, 0x09, 0b01000000);  break;
      case 33:  set_mcp(0x46, 0x09, 0b10000000);  break;
     }
    }
    }
      
    void PushEncoderSelButton()
    {
     while (digitalRead(encoderSelBut) == LOW) 
     {
       {
       reset_count = true;
       count++;
       delay(4);
       }
     if((count == 1) && (powerON == true))
       { 
        selBrightnes = !selBrightnes; 
        
       }
     if(count > 200)
       {                 
       powerON = !powerON;             
       digitalWrite(PowerSupply, powerON);
       selBrightnes = false;
       digitalWrite(Brightnes, LOW);
       delay(500);
       count = 0;
       }
     }
     if(reset_count == true)
       { 
       count1++;
       delay(4);
       }
     if(count1 > 201)
       {
        count = 0;
        reset_count = false;
        count1 = 0;
       }
       if(selBrightnes == true)            
       {
        digitalWrite(Brightnes, HIGH);
        Brigthtness();
       }
       else 
       {
        digitalWrite(Brightnes, LOW);
        Selector();    
       }
    }
    
    void Standby() 
    {
       switch(powerON)
        { 
          case false:
           vol = 2;
           set_mcp(0x40, 0x09, 0b00000000);
           set_mcp(0x42, 0x09, 0b00000000);
           set_mcp(0x44, 0x09, 0b00000000);
           set_mcp(0x46, 0x09, 0b00000000);
           digitalWrite(Dac, LOW);
           digitalWrite(Dek, LOW);
           digitalWrite(Vinyl, LOW);
           digitalWrite(bts1, LOW);
           digitalWrite(bts2, LOW);
           digitalWrite(bts3, LOW);
           if(mute == 1)
           vol_mute = 2;
           mute = 0; 
         break;
         case true:
          if(mute == 0)
           while(vol <  vol_mute)
            {
             set_relays();
             vol += 1;
             delay(100);
            }
           set_relays();
           vol_mute;
         break;
        }
    }
    
    void Muting()
    {
     if (digitalRead(encoderVolBut) == LOW) 
     {
       {
       mute++;
       delay(200);
       }
       switch(mute)
        {
          case 0: 
            set_relays(); 
          break;
          case 1:
            if((vol == 2))
            mute = 0;
            while(vol > 2)
             {
              set_relays();
              vol -= 1;
              delay(10);
             }
              if(powerON = true) 
              set_mcp(0x40, 0x09, 0b00000001);
          break;
          default:
            while(vol <  vol_mute)
             {
              set_relays();
              vol += 1;
              delay(30);
             }
            vol_mute;
            mute = 0;
          break;
        } 
     }
    }
    
    void SelEncoder()
      {
        uint8_t result_2 = r2.process(); 
     
        if (((result_2) && (powerON == true)))
        {
        if (result_2 == DIR_CW)      
           {
             if(selBrightnes == true)
             { countBts++; delay(50); }
             else
             { countSel++; delay(50); }
           } 
        else   
           {
             if(selBrightnes == true)
             { countBts--; delay(50); }
             else
             { countSel--; delay(50); }
           } 
        }
         Brigthtness();
         Selector();
      }
      
    void Brigthtness()
      {
         if (countBts == -1) 
              countBts = 0;
         if ((countBts == 0) && (powerON == true)) 
              digitalWrite(bts1, HIGH);
         else digitalWrite(bts1, LOW);
      
          if ((countBts == 1)  && (powerON == true))
              digitalWrite(bts2, HIGH);
         else digitalWrite(bts2, LOW);
       
          if ((countBts == 2)  && (powerON == true))
              digitalWrite(bts3, HIGH);
         else digitalWrite(bts3, LOW);
    
          if (countBts == 3) 
              countBts = 2;
      } 
      
    void Selector()
     {
          if (countSel == -1) 
              countSel = 2;
         else countSel != 2;
        
          if ((countSel == 0) && (powerON == true)) 
              digitalWrite(Dac, HIGH);
         else digitalWrite(Dac, LOW);
      
          if ((countSel == 1)  && (powerON == true))
              digitalWrite(Dek, HIGH);
         else digitalWrite(Dek, LOW);
       
          if ((countSel == 2)  && (powerON == true))
              digitalWrite(Vinyl, HIGH);
         else digitalWrite(Vinyl, LOW);
    
          if (countSel == 3) 
              countSel = 0;
         else countSel != 0;
     }
    Редактирано от стефан990; 15 June 2019 в 18:35.

  17. #292
    Точно заради ограниченията в i/o, аз бих разучил още малко, за да ползвам attiny контролерче като слейв у-во по I2C.
    Хитро е с енкодера и копчето, но в един момент почва да дразни.
    Не правиш супер компактно у-во, на предния панел ще имаш място за още бутони.

    Само не знам, ще може ли attiny 85 да бъде интерфейс за един енкодер, ако тр. и с евтин регистър шифт, или тр. д се ползват по-големите "тинита".
    За тях няма евтини юсб програматорчета, но може да ги вържеш през ардуиното.

    Когато стигна до този ми проект, бих го правил така - модулно.
    Ардуиното като мастър, другото модул по модул, слейв контролерчета като устройства по i2c.

    Като вържеш и дисплей, хептен няма да ти останат i/o.
    Редактирано от emosms; 15 June 2019 в 19:13.

  18. #293
    Цитат Публикувано от стефан990 Покажи мнения
    ... Някой може ли да предложи читава библиотека за дистанционно управление
    съобщение #254 и по-надолу

  19. #294
    Атенюаторът вече си има и дистанционно
    Код:
    #include <IRremote.h>   
    #include "Rotary.h"
    #include <SPI.h>
    
    const int IR_receiver = A5;
    IRrecv irrecv(IR_receiver);
    decode_results results;
    bool RemoteMuteButton = false;
    bool RemoteSelButtons = false;
    bool RemoteSelUpButton = false;
    bool RemoteVolButtons = false;
    bool RemoteVolDownButton = false;
    bool RemoteVolUpButton = false;
    
    const int8_t MCP_CS = 10;
    const int8_t PowerSupply = A3;
    const int8_t encoderSelBut = 4;
    const int8_t Brightnes = 1;
    bool powerON = false;
    bool selBrightnes = false;
    bool reset_count = false;
    
    int count = 0;
    int count1 = 0;
    int count2 = 0;
    int mute = 0;
    int countBts = 0;
    int countSel = 0;
    
    Rotary r2 = Rotary(8, 9);
    
    const int8_t Dac = A0;
    const int8_t Dek = A1;
    const int8_t Vinyl = A2;
    const int8_t bts1 = 0;
    const int8_t bts2 = 5;
    const int8_t bts3 = 6;
    
    const int8_t encoderVolBut = 7;
    int8_t vol_mute;
    
    bool ch_flag = true;
    int8_t enc_dir = 0;
    int8_t  vol = 0;
    int8_t vol_old = 1;
    Rotary r = Rotary (2, 3);                   
    
    void PushEncoderSelButton();
    void PushEncoderVolButton();
    void Brigthtness();
    void set_mcp();
    void set_relays();
    void Selector();
    void Standby();
    void Muting();
    
    void setup() 
    {
      irrecv.enableIRIn();
      irrecv.blink13(true);
      
      attachInterrupt(0, rotary_encoder, CHANGE);
      attachInterrupt(1, rotary_encoder, CHANGE);
    
      pinMode(PowerSupply, OUTPUT);
      pinMode(Brightnes, OUTPUT);
      pinMode(encoderSelBut, INPUT);
      pinMode(encoderVolBut, INPUT);
    
      pinMode(bts1, OUTPUT);
      pinMode(bts2, OUTPUT);
      pinMode(bts3, OUTPUT);
      pinMode(Dac, OUTPUT);
      pinMode(Dek, OUTPUT);
      pinMode(Vinyl, OUTPUT);
     
      SPI.begin();                               
      pinMode(MCP_CS, OUTPUT);
      digitalWrite(MCP_CS, HIGH);           
      set_mcp(0x40, 0x00, 0x00);
      set_mcp(0x40, 0x05, 0x28);
      
      set_mcp(0x42, 0x00, 0x00);
      set_mcp(0x42, 0x05, 0x28);
      
      set_mcp(0x44, 0x00, 0x00);
      set_mcp(0x44, 0x05, 0x28);
      
      set_mcp(0x46, 0x00, 0x00);
      set_mcp(0x46, 0x05, 0x28);        
    }
    
    void loop()
    { 
      PushEncoderSelButton();
      SelEncoder();
      Standby();
      Muting();
      Remote();
      
       if (ch_flag ||  (RemoteVolButtons && powerON))
      {
       ch_flag = false;
       vol += enc_dir;
       vol = constrain(vol, 0, 33);
       if(RemoteVolUpButton)
        {
         RemoteVolUpButton = false;
         vol += 1;
        }   
       if(RemoteVolDownButton)
        {
         RemoteVolDownButton = false;
         vol -= 1;
        }
       if (vol != vol_old)
        {
         RemoteVolButtons = false;
         set_relays();
         vol_mute = vol;
        }
       enc_dir = 0; 
      }
    }
      
    void set_mcp(byte mcp_addr,byte addr,byte data)
    { 
      digitalWrite(MCP_CS, LOW);
      delay(1);
      SPI.transfer(mcp_addr);
      SPI.transfer(addr);
      SPI.transfer(data);
      delay(1);
      digitalWrite(MCP_CS, HIGH);
    }
    
    void rotary_encoder() 
    {  // rotary encoder events        
      uint8_t result = r.process();
    
      if(result && powerON)
        {  
           ch_flag = true;
        if (result == DIR_CW)      
          enc_dir = 1;
        else                         
          enc_dir = -1;
        }
    }
    
    void set_relays() 
    {  
    if(powerON) 
    {
     switch(vol)
     {
      case 0:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 1:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 2:   set_mcp(0x40, 0x09, 0b00000001);  break;
      case 3:   set_mcp(0x40, 0x09, 0b00000010);  break;
      case 4:   set_mcp(0x40, 0x09, 0b00000100);  break;
      case 5:   set_mcp(0x40, 0x09, 0b00001000);  break;
      case 6:   set_mcp(0x40, 0x09, 0b00010000);  break;
      case 7:   set_mcp(0x40, 0x09, 0b00100000);  break; 
      case 8:   set_mcp(0x40, 0x09, 0b01000000);  break;   
      case 9:   set_mcp(0x40, 0x09, 0b10000000);   
                set_mcp(0x42, 0x09, 0b00000000);  break;        
      case 10:  set_mcp(0x42, 0x09, 0b00000001);   
                set_mcp(0x40, 0x09, 0b00000000);  break;  
      case 11:  set_mcp(0x42, 0x09, 0b00000010);  break;
      case 12:  set_mcp(0x42, 0x09, 0b00000100);  break;
      case 13:  set_mcp(0x42, 0x09, 0b00001000);  break;
      case 14:  set_mcp(0x42, 0x09, 0b00010000);  break;
      case 15:  set_mcp(0x42, 0x09, 0b00100000);  break;
      case 16:  set_mcp(0x42, 0x09, 0b01000000);  break;
      case 17:  set_mcp(0x42, 0x09, 0b10000000);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 18:  set_mcp(0x44, 0x09, 0b00000001);  
                set_mcp(0x42, 0x09, 0b00000000);  break;
      case 19:  set_mcp(0x44, 0x09, 0b00000010);  break;
      case 20:  set_mcp(0x44, 0x09, 0b00000100);  break;
      case 21:  set_mcp(0x44, 0x09, 0b00001000);  break;
      case 22:  set_mcp(0x44, 0x09, 0b00010000);  break;
      case 23:  set_mcp(0x44, 0x09, 0b00100000);  break;
      case 24:  set_mcp(0x44, 0x09, 0b01000000);  break;
      case 25:  set_mcp(0x44, 0x09, 0b10000000);  
                set_mcp(0x46, 0x09, 0b00000000);  break;
      case 26:  set_mcp(0x46, 0x09, 0b00000001);  
                set_mcp(0x44, 0x09, 0b00000000);  break;
      case 27:  set_mcp(0x46, 0x09, 0b00000010);  break;
      case 28:  set_mcp(0x46, 0x09, 0b00000100);  break;
      case 29:  set_mcp(0x46, 0x09, 0b00001000);  break;
      case 30:  set_mcp(0x46, 0x09, 0b00010000);  break;
      case 31:  set_mcp(0x46, 0x09, 0b00100000);  break;
      case 32:  set_mcp(0x46, 0x09, 0b01000000);  break;
      case 33:  set_mcp(0x46, 0x09, 0b10000000);  break;
     }
    }
    }
    
    void Remote()
    {
     if (irrecv.decode(&results))
     {
      switch(results.value)
      {
        case 0xFF00FF:  // Power button
        {
         powerON = !powerON;             
         digitalWrite(PowerSupply, powerON);
         selBrightnes = false;
         digitalWrite(Brightnes, LOW);
         delay(500);
        }
        break;
        case 0xFF18E7:  // Mute button
        RemoteMuteButton = true;
        break;
        case 0xFFE817:  // Vol up button
        {
         RemoteVolButtons = true;
         RemoteVolUpButton = true;
        }
        break;
        case 0xFF6897:  // Vol down button
        { 
         RemoteVolButtons = true;
         RemoteVolDownButton = true;
        }
        break;
        case 0xFF28D7:  // Sel up button
        {
        RemoteSelButtons = true;
        RemoteSelUpButton = true;
        }
        break;
    
        case 0xFFA857:  // Sel down button
        RemoteSelButtons = true;
        break;
        case 0xFF8877:  // Sel brightness button
        selBrightnes = !selBrightnes; 
        break;
      }
      irrecv.resume(); 
     }
    }
      
    void PushEncoderSelButton()
    {
     while (digitalRead(encoderSelBut) == LOW)
     {
       {
       reset_count = true;
       count++;
       delay(4);
       }
     if(count == 1 && powerON)
       selBrightnes = !selBrightnes;    
     if(count > 200)
       {                 
       powerON = !powerON;             
       digitalWrite(PowerSupply, powerON);
       selBrightnes = false;
       digitalWrite(Brightnes, LOW);
       delay(500);
       count = 0;
       }
     }
     if(reset_count)
       { 
       count1++;
       delay(4);
       }
     if(count1 > 201)
       {
        count = 0;
        reset_count = false;
        count1 = 0;
       }
       if(selBrightnes)            
       {
        digitalWrite(Brightnes, HIGH);
        Brigthtness();
       }
       else 
       {
        digitalWrite(Brightnes, LOW);
        Selector();    
       }
    }
    
    void Standby() 
    {
       switch(powerON)
        { 
          case false:
           vol = 2;
           set_mcp(0x40, 0x09, 0b00000000);
           set_mcp(0x42, 0x09, 0b00000000);
           set_mcp(0x44, 0x09, 0b00000000);
           set_mcp(0x46, 0x09, 0b00000000);
           digitalWrite(Dac, LOW);
           digitalWrite(Dek, LOW);
           digitalWrite(Vinyl, LOW);
           digitalWrite(bts1, LOW);
           digitalWrite(bts2, LOW);
           digitalWrite(bts3, LOW);
           if(mute == 1)
           vol_mute = 2;
           mute = 0; 
         break;
         case true:
          if(mute == 0)
           while(vol <  vol_mute)
            {
             set_relays();
             vol += 1;
             delay(100);
            }
           set_relays();
           vol_mute;
         break;
        }
    }
    
    void Muting()
    {
     if (digitalRead(encoderVolBut) == LOW || RemoteMuteButton)
     {
       {
       mute++;
       delay(200);
       }
       switch(mute)
        {
          case 0: 
            set_relays(); 
            RemoteMuteButton = false;
          break;
          case 1:
            if((vol == 2))
            mute = 0;
            while(vol > 2)
             {
              set_relays();
              vol -= 1;
              delay(10);
             }
              if(powerON) 
              set_mcp(0x40, 0x09, 0b00000001);
              RemoteMuteButton = false;
          break;
          default:
            while(vol <  vol_mute)
             {
              set_relays();
              vol += 1;
              delay(30);
             }
            vol_mute;
            mute = 0;
            RemoteMuteButton = false;
          break;
        } 
     }
    }
    
    void SelEncoder()
      {
        uint8_t result_2 = r2.process(); 
     
        if ((result_2 && powerON) || (RemoteSelButtons && powerON))
        {
        if (result_2 == DIR_CW || RemoteSelUpButton)    
           {
             RemoteSelButtons = false;
             if(selBrightnes)
             { countBts++; delay(0); }
             else
             { countSel++; delay(100); }
             RemoteSelUpButton = false;
           } 
        else 
           {
             if(selBrightnes)
             { countBts--; delay(0); }
             else
             { countSel--; delay(100); }
             RemoteSelButtons = false;
             
           } 
        }
         Brigthtness();
         Selector();
      }
      
    void Brigthtness()
      {
         if (countBts == -1) 
              countBts = 0;
         if (countBts == 0 && powerON)
              digitalWrite(bts1, HIGH);
         else digitalWrite(bts1, LOW);
      
          if (countBts == 1  && powerON)
              digitalWrite(bts2, HIGH);
         else digitalWrite(bts2, LOW);
       
          if (countBts == 2  && powerON)
              digitalWrite(bts3, HIGH);
         else digitalWrite(bts3, LOW);
    
          if (countBts == 3) 
              countBts = 2;
      } 
      
    void Selector()
     {
          if (countSel == -1) 
              countSel = 2;
         else countSel != 2;
        
          if (countSel == 0 && powerON) 
              digitalWrite(Dac, HIGH);
         else digitalWrite(Dac, LOW);
      
          if (countSel == 1  && powerON)
              digitalWrite(Dek, HIGH);
         else digitalWrite(Dek, LOW);
       
          if (countSel == 2  && powerON)
              digitalWrite(Vinyl, HIGH);
         else digitalWrite(Vinyl, LOW);
    
          if (countSel == 3) 
              countSel = 0;
         else countSel != 0;
     }
    Но при задържане на бутон на дистанционното управление последващият код е FFFFFFFF, тоест ще е малко трудно да накарам да се увеличава/намалява звука при задържане на бутон vol+ или vol-

  20. #295
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,659
    В библиотеката няма ли готови функции за задържан бутон?
    Учените са открили, че 90% от хората са симулирали еволюцията.

  21. #296
    Успях да подкарам звука да се усилва/намалява при задържан бутон
    Код:
    void Remote()
    {
     if(irrecv.decode(&results) || RemoteHoldButton) 
     {
      switch(results.value)
      {
        case 0xFF00FF:  // Power button
        {
         RemoteHoldButton = false;
         powerON = !powerON;             
         digitalWrite(PowerSupply, powerON);
         selBrightnes = false;
         digitalWrite(Brightnes, LOW);
         delay(500);
         }
        break;
        case 0xFF18E7:  // Mute button  
        {
        RemoteHoldButton = false; 
        RemoteMuteButton = true;   
        }
        break;
        case 0xFFE817:  // Vol up button
        {
         RemoteVolButtons = true;
         RemoteVolUpButton = true;  
         ir_button_old = 0xFFE817; 
         RemoteHoldButton = false; 
        }
        break;
        case 0xFF6897:  // Vol down button
        { 
         RemoteVolButtons = true;
         RemoteVolDownButton = true;
         ir_button_old = 0xFF6897;
         RemoteHoldButton = false;
        }
        break;
        case 0xFF28D7:  // Sel up button
        {
        RemoteHoldButton = false;
        RemoteSelButtons = true;
        RemoteSelUpButton = true;
        }
        break;
        case 0xFFA857:  // Sel down button
        {
        RemoteHoldButton = false;
        RemoteSelButtons = true;
        }
        break;
        case 0xFF8877:  // Sel brightness button
        {
        RemoteHoldButton = false;
        selBrightnes = !selBrightnes; 
        }
        break;
        case 0xFF40BF:  // DAC Input
        {
        RemoteHoldButton = false;
        }
        break;
        case 0xFFC03F:  // DEK Input
        {
        RemoteHoldButton = false;
        }
        break;
        case 0xFF20DF:  // VINYL Input
        {
        RemoteHoldButton = false;
        }
        break;
        case 0xFFA05F:  // ...
        case 0xFF609F:  // ...
        case 0xFFE01F:  // ...
        case 0xFF10EF:  // ...
        case 0xFF906F:  // ...
        case 0xFF08F7:  // ...
        case 0xFF48B7:  // ...
        case 0xFFC837:  // ...
        {
         RemoteHoldButton = false;
        }
        break;
        case 0xFFFFFFFF:
        {
        if((button_vol_old == 0xFFE817) || (button_vol_old == 0xFF6897))
         { 
          results.value = ir_button_old;
          RemoteHoldButton = true;
         }
        }
        break;
      }
      button_vol_old = results.value;    
      irrecv.resume(); 
     }
    }

  22. #297
    Гайкаджия ittso's Avatar
    Членува от
    Jul 2008
    Адрес
    София
    Мнения
    4,659
    Тоест, проектът е завършен откъм софтуер?
    Учените са открили, че 90% от хората са симулирали еволюцията.

  23. #298
    Всъщност още не е готов софтуера. Искам да добавя F-RAM памет и едно MCP23008 за индикацията и селектора, че изходите/входовете на контролера няма да са ми достатъчни, а и с него ще мога да направя яркостта на индикацията с 5 нива. Също така ще се опитам да оптимизирам текущия код, че някои неща не ми харесва как изглеждат.

  24. #299
    Дано само не регулираш яркостта с ШИМ

  25. #300
    Напр. вместо
    Код:
          if (countSel == -1) 
              countSel = 2;
         else countSel != 2;
    може да го оставиш
    Код:
           if (countSel == -1)
               countSel = 2;
    Редът "else countSel != 2" нищо не прави, а и компилаторът дава червени препоръчителни редове (ако са пуснати "всички съобщения". Имаш още едно такова сравнеие по-долу.

Страница 12 от 21 ПърваПърва ... 2 8 9 10 11 12 13 14 15 16 ... ПоследнаПоследна

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

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