Регулятор громкости PT2257. Нужна помощь.
- Войдите на сайт для отправки комментариев
Вс, 10/07/2022 - 14:00
Привет друзья.
Возникла проблема при написании скетча для регулятора громкости на микросхеме 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); } } }
-> к гайверу
Что касается ИК управления в этом скетче, то на мой взгляд здесь лишний блок в строках 89-93. Команду получили, обработали, в порт вывели и забыли - ждём следующую. Если Вы держите нажатой нужную кнопку, то в 96 строке будет получен не код кнопки, а код повторения. А несколько раз подряд нажимать-отпускать, то тоже не факт, что до второго приёма успеете.
Так что получать код нужно один раз. И либо 89-93 выкинуть, либо в строке 96 не получать значение ещё раз, а использовать уже полученное.