#1 2022-07-10 12:45:59

Собачкин
Учасник
Зареєстрований: 2015-11-13
Повідомлень: 4

Регулятор гучності PT2257. Потрібна допомога.

Привіт, друзі.

Виникла проблема при написанні скетчу для регулятора гучності на мікросхемі PT2257.
Сам скетч зібрано з різних прикладів знайдених в інтернеті
На даному етапі, логіка скетчу працює, пристрій вмикаєтся натисненням на кнопку енкодера і гручність регулюєтся поворотом енкодера. Це тільки логіка, саму мікросхему поки не підключав.

Проблема в тому, що не можу подружити цей код з пультом.

Рядок 96, по ідеї, має включати живлення при натисканні на кнопку або отриманні відповідної команди по ІЧ, але реально працює тільки кнопка. Не можу розібратись чому.

В серійний порт виводить дані зчитані з пульта, функція в рядку 89-93.

Допоможіть будь ласка розібратись з пультом.
По суті, управління енкодером мені не порібно, в приорітеті ІЧ.

P.S. В планах додати аналоговий термометр, і через PWM вмикати вентилятор, як реалізувати розумію, але поки не приїхали терморезистори.


#include "GyverTM1637.h"       //Библиотека для zдисплея
#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.println( results.value, HEX ); // выводим данные
    irReciver.resume(); // принимаем следующую команду
  }

  //отпускание кнопки энкодера выключение
  if (enc1.isRelease() || irReciver.decode(&results) == 0xFF38C7 ) {
    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);
    }
  }
}

Остання редакція Собачкин (2022-07-10 12:55:17)

Неактивний

#2 2022-07-10 13:54:39

г0сть
Учасник
Зареєстрований: 2022-06-09
Повідомлень: 45

Re: Регулятор гучності PT2257. Потрібна допомога.

https://wokwi.com/projects/336793704873329234

Неактивний

#3 2022-07-10 14:35:09

Собачкин
Учасник
Зареєстрований: 2015-11-13
Повідомлень: 4

Re: Регулятор гучності PT2257. Потрібна допомога.

Дякую!
Логіка працює як слід.

Окремо дякую за такий симулятор.

Неактивний

#4 2022-07-10 15:24:09

akapulko
Гість

Re: Регулятор гучності PT2257. Потрібна допомога.

Перевіряли спрощений шматок коду?

if (irReciver.decode(&results) & IR_3) {
    PWR = ! PWR; // При отпускании энкодера...
    digitalWrite (POWER, PWR);
}

#5 2022-07-10 17:14:16

Собачкин
Учасник
Зареєстрований: 2015-11-13
Повідомлень: 4

Re: Регулятор гучності PT2257. Потрібна допомога.

Можна спростити таким чином.

  if (results.value == IR_3) {
    results.value = 0;
    VOL_DN = 0;         // Повышается стабильность от ложных срабаываний повтора
    VOL_UP = 0;         // Повышается стабильность от ложных срабаываний повтора
    PWR = ! PWR; // При отпускании энкодера инвертирует переменую питания и соответственно выводит сигнал на нужный пин, 1 или 0.
    digitalWrite (POWER, PWR);

Взагалі, для більшої універсальності можна не відключати енкодер і не видаляти команди для нього. Одразу думав що бібліотека енкодера та ІЧ приймача не сумісні один з одним, тому планував видалити все що зв`язане з енкодером, але зараз все працює як треба.

Також, додав функцію зміни яскравості індикатора, практичної користі від цього мало, більше для підвищення навичок та розуміння алгоритму.

Лишилось остаточно розібратись з терморезистором, і викладу кінцеву ітерацію коду і схеми сюди.

Неактивний

#6 2022-07-10 17:59:09

akapulko
Гість

Re: Регулятор гучності PT2257. Потрібна допомога.

Не зовсім розумію. Ви попросили допомогу/пораду -> я відгукнувся з пропозицією перевірки вашого коду/приладу -> ви даєте мені поради щодо вашого коду?...Успіхів у "...остаточно розібратись..."

#7 2022-07-10 19:36:30

Собачкин
Учасник
Зареєстрований: 2015-11-13
Повідомлень: 4

Re: Регулятор гучності PT2257. Потрібна допомога.

akapulko пише:

Успіхів у "...остаточно розібратись..."

Не реагуйте так бурхливо. Я в жодному разі не принижував запропонований Вами варіант, дякую що відугкнулись.
Адже форуми існують для того щоб вести дискусії.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму