Регулятор громкости PT2257. Нужна помощь.

Собачкин
Offline
Зарегистрирован: 26.10.2015
Привет друзья.
 
Возникла проблема при написании скетча для регулятора громкости на микросхеме PT2257.
Сам скетч собран из разных примеров найденных в интернете
 
На данном этапе, логика скетча работает, устройство включается нажатием на кнопку энкодера и упругость регулируется поворотом энкодера. Это только логика, саму микросхему пока не подключал.
 
Проблема в том, что я не могу подружить этот код с пультом.
 
Строка 96, по идее, должна включать питание при нажатии на кнопку или получении соответствующей команды по ИК, но реально работает только кнопка. Не могу разобраться почему.
 
В серийный порт выводит данные с пульта, функция в строке 89-93.
 
Помогите разобраться с пультом.
По сути, управление энкодером мне не нужно, в приоритете ИК.
 
P.S. В планах добавить аналоговый термометр, и через PWM включать вентилятор, как реализовать понимаю, но пока не приехали терморезисторы.
#include "GyverTM1637.h"       //Библиотека для дисплея
#include "GyverEncoder.h"      //Библиотека энкодера
#include "Wire.h"              // Входит в состав Arduino IDE
#include "EEPROM.h"            // Входит в состав Arduino IDE
#include "IRremote.h"          // Библиотека ИК

//Дисплей
#define CLKK 6
#define DIO 5

//Энкодер
#define CLK 7
#define DT 8
#define SW 9

//Переключение питания
#define POWER 13

//Кнопки пульта
#define IR_1 0xFF18E7           // Кнопка вверх
#define IR_2 0xFF4AB5           // Кнопка вниз
#define IR_3 0xFF38C7           // Кнопка STANDBY (POWER)
#define IR_4 0xFFFFFFFF         // повтор

//Инициализируем подключение периферии
GyverTM1637 disp(CLKK, DIO);        //Дисплей
Encoder enc1(CLK, DT, SW, TYPE2);   //Энкодер

int Volume;                         //Переменные громкости
int fadeAmount = 1;                 // шаг изменения громкости
unsigned long currentTime;
unsigned long loopTime;

int irPin = 2;

int showVol = -79;                  //Переменная для индикации громкости, задаем ее -79,а потом плюсуем с уровнем громкости и показываем.
bool mute = 0;                      // Переменная мьют, 0=нету, 1=есть.
bool PWR;                           // Повер = 0 выкл, 1 вкл.
bool VOL_UP;                        // Флаги для регулятора громкости. Поднимаем его когда пришел сигнал увеличения громкости, а потом при приеме с пульта сигнала повтора делаем сравние что-то типа PWR==1 && VOL_UP==1 и дальше увеличиваем громкость.Удержание кнопки.
bool VOL_DN;

//Отправка данных в микросхему по I2C
int i2c_write(int Az) { // функция записи данных в pt2257 121 - MUTE ON, 120 -MUTE OFF, 0 - Volume
  Wire.beginTransmission(0x44);  // i2c адрес pt2257
  if (Az == 0)   {
    Wire.write(Volume / 10 + 224); // Отправляем десятки громкости в pt2257 значение 224-231(00-70)
    Wire.write(Volume % 10 + 208); // Отправляем единицы громкости в pt2257 значение 208-217(0-9)
    EEPROM.write(0, Volume);
  }  // Сохраняем значение громкости во встроенную память EEPROM
  else Wire.write(Az);
  Wire.endTransmission();
}

IRrecv irReciver(irPin); // указываем вывод, к которому подключён приёмник
decode_results results;

void setup() {
  Serial.begin(9600);
  Serial.println("Версия прошивки 1.0");
  pinMode(SW, INPUT_PULLUP);             // Кнопка, подтяжка к +5В внутренними резисторами.
  pinMode(POWER, OUTPUT);                // Реле PWR
  digitalWrite(POWER, LOW);              // Выключаем реле PWR
  disp.clear();                          // Очистка дислея
  disp.brightness(5);                    // Яркость дисплея от 1 до 7.
  PWR = 0;                               // При первом включении питание выключено

  //Бегущая строка при включении устройства.
  byte welcome_banner[] = {
    _1, _6, _1,
  };
  disp.runningString(welcome_banner, sizeof(welcome_banner), 250);  //Время бегущей строки в миллисекундах!
  disp.clear();
  disp.displayByte (_empty, _empty, _empty, 0x63);                  // Питание выключено, значит показываем это

  enc1.setTickMode(AUTO);                                           //Функция опроса энкодера

  Wire.begin();
  currentTime = millis();
  loopTime = currentTime;
  Volume = EEPROM.read(0);
  if (Volume == 255) Volume = 40;                                    //Если считано значение 255, то установить громкость 50%
  i2c_write(120);                                                    // "Mute" при включении отключен
  i2c_write(0);                                                      // Задаем громкость при включении

  irReciver.enableIRIn();                                            // запускаем приём
}

void loop() {
// Показываем считанный с пульта сигнал в серийный порт  
  if (irReciver.decode(&results)) { // если данные пришли
  Serial.print ("0X");  Serial.println( results.value, HEX ); // выводим данные
    irReciver.resume(); // принимаем следующую команду
  }

  //отпускание кнопки энкодера выключение
  if (enc1.isRelease() || irReciver.decode(&results) == 0xFF38C7 ) {
    irReciver.resume();
    PWR = ! PWR; // При отпускании энкодера инвертирует переменую питания и соответственно выводит сигнал на нужный пин, 1 или 0.
    digitalWrite (POWER, PWR);
    //Кусок кода который показывает включены мы или нет.
    switch (PWR) {
      case 0:
        // выключено
        disp.clear();
        disp.displayByte (_empty, _empty, _empty, 0x63);
        Serial.println("OFF");
        break;
      case 1:
        // включено
        disp.clear();
        disp.displayInt(showVol + Volume);
        Serial.println("ON");
        break;
    }
  }

  //Уменьшение громкости при повороте налево
  if (enc1.isLeft() && PWR == 1) {
    Serial.println("vol-");
    if (Volume - fadeAmount >= 0) {
      //      mute = 0;                               // это проверить в работе, не будет ли щелчков
      Volume -= fadeAmount;
      Serial.println(Volume);
      i2c_write(0);
      disp.clear ();
      disp.displayInt(showVol + Volume);
    }
  }

  //Увеличение громкости при повороте направо
  if (enc1.isRight() && PWR == 1)  {
    Serial.println("vol+");
    if (Volume + fadeAmount <= 79) {
      //      mute = 0;                               // это проверить в работе, не будет ли щелчков
      Volume += fadeAmount;
      Serial.println(Volume);
      i2c_write(0);
      disp.clear ();
      disp.displayInt(showVol + Volume);
    }
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

  -> к гайверу

kalapanga
Offline
Зарегистрирован: 23.10.2016

Что касается ИК управления в этом скетче, то на мой взгляд здесь лишний блок в строках 89-93. Команду получили, обработали, в порт вывели и забыли - ждём следующую. Если Вы держите нажатой нужную кнопку, то в 96 строке будет получен не код кнопки, а код повторения. А несколько раз подряд нажимать-отпускать, то тоже не факт, что до второго приёма успеете.

Так что получать код нужно один раз. И либо 89-93 выкинуть, либо в строке 96 не получать значение ещё раз, а использовать уже полученное.