Ви не увійшли.
Привіт, друзі.
Виникла проблема при написанні скетчу для регулятора гучності на мікросхемі 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)
Неактивний
Перевіряли спрощений шматок коду?
if (irReciver.decode(&results) & IR_3) {
PWR = ! PWR; // При отпускании энкодера...
digitalWrite (POWER, PWR);
}
Можна спростити таким чином.
if (results.value == IR_3) {
results.value = 0;
VOL_DN = 0; // Повышается стабильность от ложных срабаываний повтора
VOL_UP = 0; // Повышается стабильность от ложных срабаываний повтора
PWR = ! PWR; // При отпускании энкодера инвертирует переменую питания и соответственно выводит сигнал на нужный пин, 1 или 0.
digitalWrite (POWER, PWR);
Взагалі, для більшої універсальності можна не відключати енкодер і не видаляти команди для нього. Одразу думав що бібліотека енкодера та ІЧ приймача не сумісні один з одним, тому планував видалити все що зв`язане з енкодером, але зараз все працює як треба.
Також, додав функцію зміни яскравості індикатора, практичної користі від цього мало, більше для підвищення навичок та розуміння алгоритму.
Лишилось остаточно розібратись з терморезистором, і викладу кінцеву ітерацію коду і схеми сюди.
Неактивний
Не зовсім розумію. Ви попросили допомогу/пораду -> я відгукнувся з пропозицією перевірки вашого коду/приладу -> ви даєте мені поради щодо вашого коду?...Успіхів у "...остаточно розібратись..."
Успіхів у "...остаточно розібратись..."
Не реагуйте так бурхливо. Я в жодному разі не принижував запропонований Вами варіант, дякую що відугкнулись.
Адже форуми існують для того щоб вести дискусії.
Неактивний