Ad5206 и управление с ик пульта с помощью ардуино.

Тема в разделе "Arduino & Shields", создана пользователем bichko, 24 янв 2020.

  1. DetSimen

    DetSimen Guest

    чота такое припоминаю, но с трудом, видима, совсем синий был.
     
    KindMan нравится это.
  2. KindMan

    KindMan Гуру

    Да, вы как раз единственный, кто откликнулся :) но без конструктива, где конкретно хреново. :( (не может ведь быть, что везде)
     
  3. DetSimen

    DetSimen Guest

    ну вот как тебе сказать.... К лагаритму, мошт, претензий и нет, но стиль....
    вот так, например, добрые люди не пишут
    Код (C++):
    switch (CurrTime[2]) {
        case 1:
          if (CurrTime[1] == 1) return NY;
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        case 5:
        break;
        case 6:
        break;
        case 7:
        break;
        case 8:
        break;
        case 9:
        break;
        case 10:
        break;
        case 11:
        break;
        case 12:
          if (CurrTime[1] == 31) return D31;
        break;
      }
    Это сокращается до

    Код (C++):
    switch (CurrTime[2]) {
        case 1:
          if (CurrTime[1] == 1) return NY;
        break;

        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 10:
        case 11:
        break;

        case 12:
          if (CurrTime[1] == 31) return D31;
        break;
      }
    впрочем, проверить на равенство 1 и 12 в if - и то нагляднее выйдет.


    вот эту хню

    Код (C++):
          switch (data.command) {
            case IR_1:
              return 1;
            break;
            case IR_2:
              return 2;
            break;
            case IR_3:
              return 3;
            break;
            case IR_4:
              return 4;
            break;
            case IR_5:
              return 5;
            break;
            case IR_6:
              return 6;
            break;
            case IR_7:
              return 7;
            break;
            case IR_8:
              return 8;
            break;
            case IR_9:
              return 9;
            break;
            case IR_0:
              return 0;
            break;
            case IR_STAR:
              return STAR;
            break;
            case IR_GRID:
              return GRID;
            break;
            case IR_UP:
              return ARROW_UP;
            break;
            case IR_DOWN:
              return ARROW_DOWN;
            break;
            case IR_LEFT:
              return ARROW_LEFT;
            break;
            case IR_RIGHT:
              return ARROW_RIGHT;
            break;
            case IR_OK:
              return OK;
            break;
          }
        }
    абычна тоже забивают в пары ключ-значение. Нашол ключ - тупо взял из пары значение. И такого много, я поэтому в глубину и вдаваться не стал, поэтому без конструктива, как тебе показалось.
    Совет на будущее, такие приложения на раз-два пишутся через событийное программирование, укладываясь, максимум в сотню строк. :)
    И не забывать про конченые автоматы
     
    Последнее редактирование модератором: 28 янв 2020
    bichko и KindMan нравится это.
  4. KindMan

    KindMan Гуру

    Ну тут @b707 прав, код запутал я. И критика должена быть, только тогда и появляется качество. Я вот правда не совсем понял, про шаги +- конец, может приведёт примерчик. Он на самом деле помогает во многих случаях.
     
    bichko нравится это.
  5. b707

    b707 Гуру

    Я видел вашу тему, сейчас нашел ее снова - я ее помню, Но середина декабря - это был сложный период для меня на Амперке, я тогда фактически был в добровольном read-only В код заглядывал, но писать ничего не стал.
    В дополнении к тому, что вытащил DetSiimen - вот еще пример , как нормальные пацаны не пишут: :)
    Код (C++):
    case 2: // очень
          CurScreen[0] = 12;CurScreen[1] = 27;CurScreen[2] = 36;CurScreen[3] = 18;CurScreen[4] = 26;CurScreen[5] = 41;CurScreen[6] = 12;CurScreen[7] = 12;CurScreen[8] = 12;CurScreen[9] = 12;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 700;
          break;
        case 3: // рады
          CurScreen[0] = 12;CurScreen[1] = 27;CurScreen[2] = 36;CurScreen[3] = 18;CurScreen[4] = 26;CurScreen[5] = 41;CurScreen[6] = 12;CurScreen[7] = 29;CurScreen[8] = 13;CurScreen[9] = 17;CurScreen[10] = 40;CurScreen[11] = 12;
          TimerFunc = 1500;
          break;
        case 4: // вас
          CurScreen[0] = 12;CurScreen[1] = 15;CurScreen[2] = 13;CurScreen[3] = 30;CurScreen[4] = 12;CurScreen[5] = 12;CurScreen[6] = 12;CurScreen[7] = 12;CurScreen[8] = 12;CurScreen[9] = 12;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 700;
          break;
        case 5: // видеть
          CurScreen[0] = 12;CurScreen[1] = 15;CurScreen[2] = 13;CurScreen[3] = 30;CurScreen[4] = 12;CurScreen[5] = 15;CurScreen[6] = 21;CurScreen[7] = 17;CurScreen[8] = 18;CurScreen[9] = 31;CurScreen[10] = 41;CurScreen[11] = 12;
          TimerFunc = 1500;
          break;
        case 6: // но
          CurScreen[0] = 12;CurScreen[1] = 26;CurScreen[2] = 27;CurScreen[3] = 12;CurScreen[4] = 12;CurScreen[5] = 12;CurScreen[6] = 12;CurScreen[7] = 12;CurScreen[8] = 12;CurScreen[9] = 12;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 700;
          break;
        case 7: // нам
          CurScreen[0] = 12;CurScreen[1] = 26;CurScreen[2] = 27;CurScreen[3] = 12;CurScreen[4] = 26;CurScreen[5] = 13;CurScreen[6] = 25;CurScreen[7] = 12;CurScreen[8] = 12;CurScreen[9] = 12;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 700;
          break;
        case 8: // уже
          CurScreen[0] = 12;CurScreen[1] = 26;CurScreen[2] = 27;CurScreen[3] = 12;CurScreen[4] = 26;CurScreen[5] = 13;CurScreen[6] = 25;CurScreen[7] = 12;CurScreen[8] = 32;CurScreen[9] = 19;CurScreen[10] = 18;CurScreen[11] = 12;
          TimerFunc = 1500;
          break;
        case 9: // пора
          CurScreen[0] = 12;CurScreen[1] = 28;CurScreen[2] = 27;CurScreen[3] = 29;CurScreen[4] = 13;CurScreen[5] = 12;CurScreen[6] = 12;CurScreen[7] = 12;CurScreen[8] = 12;CurScreen[9] = 12;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 700;
          break;
        case 10: // идти
          CurScreen[0] = 12;CurScreen[1] = 28;CurScreen[2] = 27;CurScreen[3] = 29;CurScreen[4] = 13;CurScreen[5] = 12;CurScreen[6] = 21;CurScreen[7] = 17;CurScreen[8] = 31;CurScreen[9] = 21;CurScreen[10] = 12;CurScreen[11] = 12;
          TimerFunc = 2000;
          break;
    }
    Это же, фактически. строчки на дисплее? - ну так сохраните их заранее, как вы делаете с обычными строками - в массивах, а потом выводите одной командой...
     
    DetSimen, KindMan и bichko нравится это.
  6. parovoZZ

    parovoZZ Гуру

    Так это и есть конченый автомат)

    на массивах? Так оно в ОЗУ полезет)
     
  7. DetSimen

    DetSimen Guest

    за PROGMEM чонить знаешь?
     
  8. b707

    b707 Гуру

    конечно приведу

    Вместо такого условия
    Код (C++):
     if (volume[ch-1] != 255) {
    напишите вот такое
    Код (C++):
     if (volume[ch-1] <= (255 - VOLUME_STEP)) {
    будет работать при любом шаге и любом стартовом
     
    bichko нравится это.
  9. bichko

    bichko Нерд

    Извините, попробовал Ваше исправление, совсем не работает, канал выбирается, но управление потенциометрами отсутствует.
     
  10. b707

    b707 Гуру

    выложите код после исправления
     
    bichko нравится это.
  11. KindMan

    KindMan Гуру

    Минимум и максимум тогда отдельно придётся оформить.
     
    bichko нравится это.
  12. bichko

    bichko Нерд

    А с отредактированным Вами кодом работает замечательно, спасибо)))
     
  13. bichko

    bichko Нерд

    Выкладываю полностью рабочий код с Вашими исправлениями, прогнал потенциометры в обе стороны, все замечательно работает. Вам большое спасибо.
    Код (C++):
    #include <SPI.h>
    #include <IRremote.h>

    const int slaveSelectPin = 10;
    const int RECV_PIN = 9; //пин подключения IR приёмника

    byte channel;
    byte volume[6];
    unsigned long channelTime=0;

    #define START_VOLUME  124  // стартовое значение громкости
    #define VOLUME_STEP 5      // шаг изменения громкости
    #define VOLP   0xFFA857    //кнопки пульт
    #define VOLM   0xFFE01F    //кнопки пульт
    #define CH1    0xFF30CF    //кнопки пульт канал 1
    #define CH2    0xFF18E7    //кнопки пульт канал 1
    #define CH3    0xFF7A85    //кнопки пульт канал 1
    #define CH4    0xFF10EF    //кнопки пульт канал 1
    #define CH5    0xFF38C7    //кнопки пульт канал 1
    #define CH6    0xFF5AA5    //кнопки пульт канал 1

    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
    Serial.begin(9600);
    pinMode(slaveSelectPin, OUTPUT);
    SPI.begin();

    for (int n = 0; n < 6; n++) {
    digitalPotWrite(n, START_VOLUME);
    volume[n] = START_VOLUME;
    }

    irrecv.enableIRIn();
    }

    void digitalPotWrite(int address, int value) {
      // установить на выводе SS лог.0, чтобы выбрать чип:
      digitalWrite(slaveSelectPin, LOW);
      // отправить адрес и значение через SPI:
      SPI.transfer(address);
      SPI.transfer(value);
      // установить на выводе SS лог.1, чтобы отменить выбор чипа:
      digitalWrite(slaveSelectPin, HIGH);
    }

    void PrintVolume(byte ch){ // Выводим в монитор данные о громкости
        digitalPotWrite(ch-1, volume[ch-1]);
        Serial.print("Channel - ");
        Serial.print(ch);
        Serial.print(" ; Volume - ");
        Serial.println(volume[ch-1]);
    }

    void VolumeUp(byte ch) {
      if (!channel) return;
      if (volume[ch-1] <= (255 - VOLUME_STEP)){ // Приращение изменили на 5, поэтому проверять выход за пределы не будем
        volume[ch-1] = volume[ch-1] + VOLUME_STEP;
        PrintVolume(ch);
      }
    }

    void VolumeDown(byte ch) {
      if (!channel) return;
      if (volume[ch-1] >= (0 + VOLUME_STEP)) {
        volume[ch-1] = volume[ch-1] - VOLUME_STEP;
        PrintVolume(ch);
      }
    }

    void loop() {
    if(irrecv.decode(&results)){
      Serial.println(results.value, HEX);
      switch(results.value){
        case CH1:
            channel = 1;
            break;
        case CH2:
            channel = 2;
            break;
        case CH3:
            channel = 3;
            break;
        case CH4:
            channel = 4;
            break;
        case CH5:
            channel = 5;
            break;
        case CH6:
            channel = 6;
            break;
        case VOLP:
            VolumeUp(channel);
            break;
          case VOLM:
            VolumeDown(channel);
            break;
        }
        irrecv.resume(); // Получаем следующее значение
        // Тут уже можно запускать ваш таймер, и обнулять channel, чтобы потом не реагировать на нажатия, если хотите
         if (millis() - channelTime > 6000) channel=0;{ // Вместо 10000 подставьте нужное вам значение паузы
      channelTime = millis();
    if (!channel) return;
          if(irrecv.decode(&results)){
    if (results.value == VOLP || results.value == VOLM);
          }
         }
       }
    }
     
  14. b707

    b707 Гуру

    KindMan, если я чем обидел - прошу прощения, ни в коем случае не хотел. Я Вас глубоко уважаю и как грамотного программиста. и как спокойного здравомыслящего человека.
    А тут , сорри, не сдержался... коробит меня от таких веток. где один выкладывается, а второй только с готовностью принимает помощь и знай подкидывает новые задачки .... хотя и понимаю. что это не мое дело.
     
    bichko нравится это.
  15. b707

    b707 Гуру

    сорри, это я сначала не въехал, в какую сторону у вас условие
     
    bichko нравится это.
  16. KindMan

    KindMan Гуру

    Да вы что, никогда. Я сам там в одном предложении смешал все мысли.
    На оффтопил я тут со своей темой, может модеры перенесут.
     
  17. bichko

    bichko Нерд

    Все хорошо, главное что все умеют признавать свои ошибки. Ну и еще в по Вашим словам. Да есть люди которые ленятся даже поискать в интернете ведь на многие вещи уже есть готовые решения. Я реально не смог одолеть принцип управление всеми потенциометрами двумя кнопками, с чем мне помог уважаемый KindMan. А весь остальной код я стараюсь делать сам, пусть это может будет совсем не красиво, пусть может это будет все вперемешку и не понятно, потому что опыта реального программирования у меня 0, но я стараюсь, по примерам, по каким то готовым решениям, переделывать под себя. Как минимум это потому, что я привык что, никто не поможет, особенно в интернете. Но этот форум меня заставил усомниться в моих выводах, наверно повезло, что в ветку зашли "правильные" люди))) Еще раз всем спасибо кто откликнулся и помог и да, и критика тоже важна, это путь к совершенству. Благодаря Вам, код получился более универсальным и устойчивым.
     
    b707 нравится это.
  18. b707

    b707 Гуру

    однозначно повезло :)
     
    bichko нравится это.
  19. parovoZZ

    parovoZZ Гуру

    а если значения где-то меняются?
     
  20. DetSimen

    DetSimen Guest

    Посмотри на код и скажи, как в case...return могут меняться значения? Поэтому я и предложил конкретно для этого кода пару ключ-значение.