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

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

  1. KindMan

    KindMan Гуру

    Да, забыл добавить эту строку.
    Код (C++):
    channel[n] = START_VOLUME;
    Вам домашнее задание правильно вставить её на место. Иначе действительно, программирование это не ваше.
    Вообще мимо, я просто увлекаюсь этим, а на С++ так вообще два года назад стал пробовать.
    Часть пункта правил форума 5.4.
    Код (Text):
    5.4. .......... Если вы хотите поблагодарить участника за его сообщение, то просто нажмите на кнопку "Мне нравится".
    ;)
     
    Последнее редактирование: 27 янв 2020
    bichko нравится это.
  2. bichko

    bichko Нерд

    Видимо программирование это не мое и Вы скорее всего правы. Хотя я и не претендовал на это. Этому нужно учится и этим нужно заниматься постоянно, а не раз в 10 лет, тогда навыки остаются и хорошо откладываются в памяти. По крайней мере это мое мнение. То что Вы написали, это индекс в С++. Но так как этот оператор с "n" то как минимум эта строчка должна быть только в setup ибо то что объявлено там, там и остается и выполняется только один раз при запуске программы. Собственно и эта строчка должна быть там, но она не чисто так должна быть написана, а с чем то, чего я так и не могу понять. Вообщем, сдаюсь((( Извините уважаемый KindMan, подвел я Вас и Ваши ожидания не оправдал.
     
  3. KindMan

    KindMan Гуру

    Ну правильно же думаете
    Код (C++):
    for (int n = 0; n < 6; n++) { // вот эта самая n
      digitalPotWrite(n, START_VOLUME);
      channel[n] = START_VOLUME;
    }
     
    bichko нравится это.
  4. bichko

    bichko Нерд

    Ну туда я сразу и подумал, потому что именно там только присваивается всем каналам начальное значение, меня смутила вот эта ошибка:
     

    Вложения:

    • Error.png
      Error.png
      Размер файла:
      21,9 КБ
      Просмотров:
      298
  5. bichko

    bichko Нерд

    И это все меня ввело в ступор, вроде там, но получается не там. Начал читать и про индексы, и про объявление переменных глобальных и локальных, и так как переменная объявлена в for то там и должна быть строчка та, но ругается к сожалению, и это меня еще больше запутало(((
     
  6. KindMan

    KindMan Гуру

    Блин, это я вас затроллил. Сам перепутал переменные - volume а не channel. Извиняйте.
     
    bichko нравится это.
  7. bichko

    bichko Нерд

    Да все хорошо)))) я Вам очень благодарен за помощь, ни кто кроме Вас мне не захотел помочь, только критика и еще раз критика, хотели меня в разные места отправить)))). А Вы без всякой критики, просто по человечески помогли и все.
    Исправил, все отлично работает. Ваш код совершенен и элегантен)))
     
    KindMan нравится это.
  8. bichko

    bichko Нерд

    Обнаружил, что теперь с полным работающим кодом для записи начальных данных в setup теперь начало перескакивать после 255 в начало, а не упираться в ограничение почему то. даже не пойму почему. я думал изначально что я таймер обнуление канала нарушил нормальную работу кода, а оно оказалось что не из за моего таймера((
     
  9. 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) { // Приращение изменили на 5, поэтому проверять выход за пределы не будем
        volume[ch-1] = volume[ch-1] + VOLUME_STEP;
        PrintVolume(ch);
      }
    }

    void VolumeDown(byte ch) {
      if (!channel) return;
      if (volume[ch-1] != 0) {
        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);
          }
         }
       }
    }
     
  10. KindMan

    KindMan Гуру

    Потому что ваше начальное значение не делится на 5.
     
    bichko нравится это.
  11. b707

    b707 Гуру

    это называется не "помочь" - это "сделать за вас"
    Это не этот код нарушает работу, это граничные условия в процедурах VolumeUp VolumeDown написаны криво. Вместо верхнего условия "не равно 255" надо написать "на шаг меньше максимума", а вместо нижнего - "на шаг больше нуля". И тогда срабатывание ограничений не будет зависеть ни от начального значения, ни от шага.
     
    Последнее редактирование: 28 янв 2020
    DetSimen нравится это.
  12. b707

    b707 Гуру

    и еще...
    Ребята, кто из вас писал это?
    Код (C++):
    void VolumeDown(byte ch) {
      if (!channel) return;
      if (volume[ch-1] != 0) {
        volume[ch-1] = volume[ch-1] - VOLUME_STEP;
        PrintVolume(ch);
      }
    }
    про кривое условие я уже сказал в прошлом сообщении, но теперь о другом - обратите внимание на переменные
    В заголовке функции вы принимате номер канала в переменную ch. потом почему-то проверяете внешнюю переменную channel. , в следующих строках меняете volume канала ch-1. а печатаете на выходе - опять канала ch ...

    Я не стебусь, но по моему автор этих строк явно запутался, с чем он работает - с каналом ch или с каналом ch-1
     
  13. bichko

    bichko Нерд

    Да, когда уже лег спать, я понял это)))) , что идет переполнение из-за того что 124 как то хреновенько делится на 5.
    Но сообщение уже было написано. Только что исправил и все хорошо заработало.
     
  14. KindMan

    KindMan Гуру

    Я писал. Не путался. Можно вообще убрать передачу переменной в функцию, это просто для примера. Нумерация каналов, для удобства, 1…6, а для управления и массива, соответственно 0…5.
     
    bichko нравится это.
  15. bichko

    bichko Нерд

    Спасибо Вам за помощь и наблюдение, критика всегда приветствуется, критика она всегда нужна, это повод идти к лучшему, но автор этих строк не я, я б такое не осилил еще с моими крохотными знаниями программирования и отсутствием опыта.
     
  16. b707

    b707 Гуру

    по мне так за такое "удобство" канделябром по лбу бить надо :)
    Последняя строчка , по логике, тогда должна быть тоже PrintVolume(ch-1);нет?

    Добавка... хотя может и нет. Вообще, в таких случаях принято в программе везде пользоваться индексами от нуля, а переводить в "человеческий" формат - 1..6 только при выводе на экран
     
  17. bichko

    bichko Нерд

    Спасибо Вам для разъяснения кода, хоть немного и я стал понимать как он работает))) А то есть код, хорошо работающий, а как и что в нем, я понял только на 50% ))))
     
  18. KindMan

    KindMan Гуру

    Я же тоже обучаюсь, набираюсь опыта, и в процессе, надеюсь, будет получаться не только работающий, но и красивый, правильный код.
    Но, как и заметил автор топика, мало кто подскажет, что да как. Я вот в своей теме про часы, персонально обратился с просьбой к людям, кто умеет больше и лучше меня кодить, в том числе и к вам, но никто не дал рекомендаций. Да, не обязаны, но в то же время видно, что время то есть свободное на трёп, а на помощь в стремлении - нет.
     
    DetSimen и bichko нравится это.
  19. bichko

    bichko Нерд

    Ребят, я понимаю, совершенству нет предела, но код работает, отлично работает, человек мне помог просто так, безвозмездно, давайте не будем наезжать друг на друга, если у Вас есть лучшее предложение то просто покажите его, а не жестко критикуйте других. Человек тоже пишет для себя, для души, возможно в отличии от Вас. Вам спасибо за то что наблюдаете за веткой форума, что мы не вдвоем здесь с KindMan, может и дальше будем развивать эту ветку, проект то еще не закончен у меня))))
     
  20. bichko

    bichko Нерд

    Не могу не согласится с Вами, мало людей осталось которые готовы реально помочь, когда могут, вместо этого критика и посылание иди учись и при этом успевают облить грязью с ног до головы. Это все интернет виной, что можно анонимно здесь оставаться и тебя никто не найдет. А если б не было такого, то многие по тише бы были. Ну и видимо человечность в нас исчезает к сожалению(((