#1 Re: Програмування Arduino » Регулятор гучності PT2257. Потрібна допомога. » 2022-07-10 19:36:30

akapulko пише:

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

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

#2 Re: Програмування Arduino » Регулятор гучності PT2257. Потрібна допомога. » 2022-07-10 17:14:16

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

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

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

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

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

#4 Програмування Arduino » Регулятор гучності PT2257. Потрібна допомога. » 2022-07-10 12:45:59

Собачкин
відповідей: 6

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

Виникла проблема при написанні скетчу для регулятора гучності на мікросхемі 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);
    }
  }
}

#5 Re: Програмування Arduino » Помогите с прошивкой » 2015-11-14 13:48:47

Дело в том что не ищу исполнителя, а спрашиваю совета :-) Написан код с if ..else, скомпилирован, вроде как без ошибок и скоро будет проверен в железе. ИК управление сразу отметаем потому что нрвую начинку надо вставить в старый корпус и плата под него уже разведена, по мотивам старой. Тормозит то, что я не могу придумать как сделать так, что-бы пока не включишь прибор по pin13, он не реагировал на нажатия остальных кнопок, может кто направит в нужную сторону?

#6 Програмування Arduino » Помогите с прошивкой » 2015-11-13 21:16:35

Собачкин
відповідей: 4

Ребята, нужна небольшая помощь в написании прошивки для блока управления отоплением. Будут включаться обогреватели в разных помещениях через симисторы. На али заказана Pro Mini и разведена плата под нее.

При нажатии PIN13 Включаем PIN5,6
При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
При нажатии PIN10 Включаем PIN7
При повторном нажатии PIN10, выключаем PIN7
При нажатии PIN11 Включаем PIN8
При повторном нажатии PIN11, выключаем PIN8
При нажатии PIN12 Включаем PIN9
При повторном нажатии PIN12, выключаем PIN9

Какими функциями это можно реализовать? Что-то ничего не приходит в голову кроме if. Може у кого-то есть рабочий пример который можно переделать?

Набросал из примеров код, скажите, будет работать? Плата приедет примерно через 2 недели, хотелось бы к тому времени иметь рабочий код. Теперь главное, как заставить контроллер реагировать только на PIN13, при выключеных PIN5,6

Грубо говоря включать эту "систему" только одной кнопкой, надеюсь обьяснил понятно smile

Заранее спасибо!

/* 
    При нажатии PIN13 Включаем PIN5,6 (int=POW1;)
    При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
    При нажатии PIN10 Включаем PIN7 (int=POW2;)
    При повторном нажатии PIN10, выключаем PIN7
    При нажатии PIN11 Включаем PIN8 (int=POW3;)
    При повторном нажатии PIN11, выключаем PIN8
    При нажатии PIN12 Включаем PIN9 (int=POW4;)
    При повторном нажатии PIN12, выключаем PIN9

*/


int POW1 = 0;
int POW2 = 0;
int POW3 = 0;
int POW4 = 0;
int LED = 3;           // вывод 3
int brightness = 0;    // начальная яркость светодиода
int fadeAmount = 5;    // величина изменения яркости светодиода

void setup()
{
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);

  digitalWrite(5, 0);
  digitalWrite(6, 0);
  digitalWrite(7, 0);
  digitalWrite(8, 0);
  digitalWrite(9, 0);
}

void loop()
{
  if (digitalRead(13) == HIGH && POW1 == 0) //если кнопка нажата
    // и перемення POW1 равна 0 , то ...
  {

    digitalWrite(5, !digitalRead(5));
    digitalWrite(6, !digitalRead(5));
    POW1 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%
    // устанавливаем яркость у светодиода у вывода 10
    analogWrite(LED, brightness);

    // изменяем яркость в цикле, прибавляя заданную величину
    brightness = brightness + fadeAmount;

    // меняем порядок затухания на обратный при достижении минимальной или максимальной яркости
    if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
    }
    // делаем небольшую паузу для лучшего эффекта
    delay(30);
  }

  if (digitalRead(13) == LOW && POW1 == 1) //если кнопка НЕ нажата
    //и переменная POW равна - 1 ,то ...
  {

    POW1 = 0; //обнуляем переменную POW1
  }


  if (digitalRead(10) == HIGH && POW1 == 0) //если кнопка нажата
    // и перемення POW2 равна 0 , то ...
  {

    digitalWrite(7, !digitalRead(7));
    POW2 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(10) == LOW && POW2 == 1) //если кнопка НЕ нажата
    //и переменная POW2 равна - 1 ,то ...
  {

    POW2 = 0; //обнуляем переменную POW2
  }


  if (digitalRead(11) == HIGH && POW3 == 0) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW3 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(11) == LOW && POW3 == 1) //если кнопка НЕ нажата
    //и переменная POW32 равна - 1 ,то ...
  {

    POW3 = 0; //обнуляем переменную POW3
  }

  if (digitalRead(12) == HIGH && POW4 == 0) //если кнопка нажата
    // и перемення POW3 равна 0 , то ...
  {

    digitalWrite(8, !digitalRead(8));
    POW4 = 1;
    //это нужно для того что бы с каждым нажатием кнопки
    //происходило только одно действие
    // плюс защита от "дребезга"  100%

  }

  if (digitalRead(12) == LOW && POW4 == 1) //если кнопка НЕ нажата
    //и переменная POW4 равна - 1 ,то ...
  {

    POW4 = 0; //обнуляем переменную POW4
  }

}

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