Автор Тема: мучения с "градусником"  (Прочитано 1610 раз)

0 Пользователей и 1 Гость просматривают эту тему.

lameralik

  • .
  • *
  • Сообщений: 150
  • Карма: +0/-0
Re: мучения с "градусником"
« Ответ #60 : 18 Май 2020, 15:44:26 »
Регулируется так тогда. 168
170
173
175
178
181
183
186
188
191
193
196
198
201
204
 Где то добавляет 3 единицы, где то 2. Хотя на слух не заметно.

lameralik

  • .
  • *
  • Сообщений: 150
  • Карма: +0/-0
Re: мучения с "градусником"
« Ответ #61 : 18 Май 2020, 16:04:13 »
В целом работает. Ну и ладно. Дочищать вылизывавть буду по возможности. Спасибо большое.

Код
#include <iarduino_IR_RX.h>                          // Подключаем библиотеку для работы с ИК-приёмником
#include "SPI.h"
#include <UTFT.h>
#include <EEPROM.h>   //Подключение библиотеки для работы с EEPROM
#include "PGA2310.h"  //Подключение библиотеки для работы с PGA2310
#include <Adafruit_GFX.h>
#include <SmartDelay.h>
UTFT myGLCD(ST7796S, 38, 39, 40, 41);
//*********************************************************************************************************//
//Шрифты
extern uint8_t SmallFont[];
// extern uint8_t SmallFont[];
//extern uint8_t BigFont[];
extern uint8_t SixteenSegment128x192Num[];
extern uint8_t DotMatrix_M_Slash[];
extern uint8_t SmallRusFont[];
extern uint8_t BigFontRus[];
extern uint8_t DotMatrix_M[];


int Vol = 0;

//**********************************************************************************************************//

#define PIN_PGA_ZCEN  2
#define PIN_PGA_CS    3
#define PIN_PGA_SCLK  21
#define PIN_PGA_SDATA 20
#define PIN_PGA_MUTE  6





#define Reset() asm("JMP 0");


#define IR_port   14  // Объявляем объект IR, с указанием вывода к которому подключён ИК-приёмник
#define Filter1  7
#define Filter2  8
#define Filter3  9
#define Filter_OFF  10
#define PHase     13

iarduino_IR_RX IR(IR_port);
PGA2310 pga = PGA2310(PIN_PGA_CS,
                      PIN_PGA_SDATA,
                      PIN_PGA_SCLK,
                      PIN_PGA_ZCEN,
                      PIN_PGA_MUTE);



uint32_t codKey1 = 0x807F20DF;   // StandBy
uint32_t codKey2 = 0x807F906F;   // Off LowPass Filters
uint32_t codKey3 = 0x807FB04F;   // 35
uint32_t codKey4 = 0x807F9867;    //45
uint32_t codKey5 = 0x807FD827;    //55
uint32_t codKey6 = 0x807F8877;   //65
uint32_t codKey7 = 0x807FA857;    //75
uint32_t codKey8 = 0x807FE817;   //85
uint32_t codKey9 = 0x807F807F;   //Memory 1
uint32_t codKey10 = 0x807F40BF;  //Phase 180
uint32_t codKey11 = 0x807F00FF;  //Phase 0
uint32_t codKey12 = 0x807F30CF;  //Memory 2
uint32_t codKey13 = 0x807F18E7;  //Memory 3
uint32_t codKey14 = 0x807FE01F;  //Memory 4
uint32_t codKey15 = 0x807F58A7;  //Vol +
uint32_t codKey16 = 0x807F708F;  // Vol -

void setup() {



  // Setup the LCD
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  myGLCD.clrScr();

  Serial.begin(9600);                                // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бит/сек
  IR.begin();                                        // Инициируем работу с ИК-приёмником
  //EEPROM//
  Vol = EEPROM.read(0);                 // Считать значение ячейки с адресом 0
  digitalWrite(Filter_OFF, EEPROM.read(2));
  digitalWrite(Filter1, EEPROM.read(3));
  digitalWrite(Filter2, EEPROM.read(4));
  digitalWrite(Filter3, EEPROM.read(5));
  digitalWrite(PHase, EEPROM.read(8));
  const uint8_t SetVol = (uint16_t)Vol * 255 / 100;




  int seg_width = 6; //ширина сегмента
  int seg_gap = 2; //ширина зазора между сегментами
  int x = 40; //координата начала "градусника"
  uint16_t seg_color;





  for (uint8_t i = 0; i < 100 / 2; i++) {
    if (i < Vol / 2) {
      if (i <= 50 / 2) seg_color = VGA_GREEN;
      else if (i >= 90 / 2) seg_color = VGA_RED;
      else seg_color = VGA_YELLOW;

    }
    else seg_color = VGA_BLACK; //цвет фона


    myGLCD.setColor(seg_color);
    myGLCD.fillRoundRect(x, 10, x + seg_width - 1, 25);
    x += (seg_width + seg_gap);


  }



  myGLCD.setColor(VGA_GREEN);
  myGLCD.setFont(DotMatrix_M);
  myGLCD.print("FASE ", 350, 60);


  if (EEPROM.read(8) == 1)
  {
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.print("180", RIGHT, 60);
  }
  else
  {
    myGLCD.setColor(VGA_BLUE);
    myGLCD.print("0 ", RIGHT, 60);
  }

  myGLCD.setColor(VGA_GREEN);
  myGLCD.setFont(SixteenSegment128x192Num);
  myGLCD.printNumI(Vol, RIGHT, 100);

  myGLCD.setColor(VGA_GREEN);
  myGLCD.setFont(DotMatrix_M_Slash);
  myGLCD.print("FILTER ", LEFT, 60);
  myGLCD.setColor(VGA_BLUE);
  myGLCD.setFont(DotMatrix_M_Slash);

  if (EEPROM.read(2) == 1)
  {

    myGLCD.print("OFF", 100, 60);


  }

  if (EEPROM.read(3) == 0 and EEPROM.read(4) == 1 and EEPROM.read(5) == 0 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 35", 100, 60);


  }


  if (EEPROM.read(3) == 1 and EEPROM.read(4) == 1 and EEPROM.read(5) == 0 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 45", 100, 60);


  }

  if (EEPROM.read(3) == 0 and EEPROM.read(4) == 0 and EEPROM.read(5) == 1 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 55", 100, 60);


  }

  if (EEPROM.read(3) == 1 and EEPROM.read(4) == 0 and EEPROM.read(5) == 1 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 65", 100, 60);


  }

  if (EEPROM.read(3) == 0 and EEPROM.read(4) == 1 and EEPROM.read(5) == 1 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 75", 100, 60);


  }


  if (EEPROM.read(3) == 1 and EEPROM.read(4) == 1 and EEPROM.read(5) == 1 and EEPROM.read(2) == 0)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.print(" 85", 100, 60);


  }

  if (EEPROM.read(10) == 1)

  {
    myGLCD.setFont(BigFontRus);
    myGLCD.setColor(VGA_YELLOW);
    myGLCD.textRus("Внимание очень громко !", 50, 30);


  }


  {
    pga.begin();    //Инициализация библиотеки для PGA2310

    pga.setVolume(SetVol);
  }


}

void loop()   //*******************************************************************************************************************************************************************//
{

  if (IR.check(true))  { // Если в буфере имеются данные, принятые с пульта (удерживается кнопка), то ...

    //    Serial.println(IR.data, HEX);                  // Выводим код нажатой кнопки
    //    Serial.println(IR.length   );                  // Выводим количество бит в коде









    if (IR.data == codKey15) {


      if (++Vol > 100) Vol = 100;

      myGLCD.setColor(VGA_GREEN);
      myGLCD.setFont(SixteenSegment128x192Num);
      myGLCD.printNumI(Vol, RIGHT, 100);

      if (Vol > 70)

      {
        myGLCD.setFont(BigFontRus);
        myGLCD.setColor(VGA_YELLOW);
        myGLCD.textRus("Внимание очень громко !", 50, 30);
        EEPROM.update(10, 1);

      }
      else
      {

        myGLCD.setFont(BigFontRus);
        myGLCD.setColor(VGA_BLACK);
        myGLCD.textRus("Внимание очень громко !", 50, 30);
        EEPROM.update(10, 0);

      }



    }

    else

      if (IR.data == codKey16) {

        if (--Vol < 0) Vol = 0;


        if (Vol < 100)

        {
          myGLCD.setColor(VGA_BLACK);
          myGLCD.setFont(SixteenSegment128x192Num);
          myGLCD.printNumI(1, 100, 100);

        }
        if (Vol < 10)

        {
          myGLCD.setColor(VGA_BLACK);
          myGLCD.setFont(SixteenSegment128x192Num);
          myGLCD.printNumI(1, 210, 100);

        }

        myGLCD.setColor(VGA_GREEN);
        myGLCD.setFont(SixteenSegment128x192Num);
        myGLCD.printNumI(Vol, RIGHT, 100);



      }



    //***************************************************************************************VOLUME CONTROL*********************************************************************************
    int seg_width = 6; //ширина сегмента
    int seg_gap = 2; //ширина зазора между сегментами
    int x = 40; //координата начала "градусника"
    uint16_t seg_color;


    const uint8_t mvol = (uint16_t)Vol * 255 / 100;

    //const uint8_t mvol = (uint16_t)Vol * (1300 / 2) / 255;

    // Serial.println( mvol);
    pga.setVolume(mvol);



    for (uint8_t i = 0; i < 100 / 2; i++) {
      if (i < Vol / 2) {
        if (i <= 50 / 2) seg_color = VGA_GREEN;
        else if (i >= 90 / 2) seg_color = VGA_RED;
        else seg_color = VGA_YELLOW;

      }
      else seg_color = VGA_BLACK; //цвет фона


      myGLCD.setColor(seg_color);
      myGLCD.fillRoundRect(x, 10, x + seg_width - 1, 25);
      x += (seg_width + seg_gap);


    }








  }

  //***************************************************************************************END VOLUME CONTROL*********************************************************************************


  switch (IR.data) {


    case 0x807F807F:

      myGLCD.setColor(VGA_YELLOW);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print("Memory 1", 190, 60);
      IR.data = 0;
      break;



    case 0x807F30CF:

      myGLCD.setColor(VGA_YELLOW);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print("Memory 2", 190, 60);
      Vol = 10;
      IR.data = 0;
      break;


    case 0x807F18E7:
      myGLCD.setColor(VGA_YELLOW);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print("Memory 3", 190, 60);
      Vol = 50;
      IR.data = 0;
      break;


    case 0x807FE01F:
      myGLCD.setColor(VGA_YELLOW);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print("Memory 4", 190, 60);
      Vol = 30;
      IR.data = 0;
      break;




    case 0x807F906F:
      digitalWrite(Filter_OFF, HIGH);
      myGLCD.setColor(VGA_BLUE);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print("OFF", 100, 60);
      EEPROM.update(2, HIGH);
      IR.data = 0;
      break;

    case 0x807FB04F:  //Filter 35
      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, LOW);
      digitalWrite(Filter2, HIGH);
      digitalWrite(Filter3, LOW);

      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 35", 100, 60);


      EEPROM.update(2, LOW);
      EEPROM.update(3, LOW);
      EEPROM.update(4, HIGH);
      EEPROM.update(5, LOW);
      IR.data = 0;
      break;

    case 0x807F9867:  //Filter 45

      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, HIGH);
      digitalWrite(Filter2, HIGH);
      digitalWrite(Filter3, LOW);
      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 45", 100, 60);

      EEPROM.update(2, LOW);
      EEPROM.update(3, HIGH);
      EEPROM.update(4, HIGH);
      EEPROM.update(5, LOW);

      IR.data = 0;
      break;



    case 0x807FD827:  //Filter 55

      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, LOW);
      digitalWrite(Filter2, LOW);
      digitalWrite(Filter3, HIGH);
      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 55", 100, 60);
      EEPROM.update(2, LOW);
      EEPROM.update(3, LOW);
      EEPROM.update(4, LOW);
      EEPROM.update(5, HIGH);
      IR.data = 0;
      break;

    case 0x807F8877:  //Filter 65

      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, HIGH);
      digitalWrite(Filter2, LOW);
      digitalWrite(Filter3, HIGH);
      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 65", 100, 60);
      EEPROM.update(2, LOW);
      EEPROM.update(3, HIGH);
      EEPROM.update(4, LOW);
      EEPROM.update(5, HIGH);
      IR.data = 0;
      break;

    case 0x807FA857:  //Filter 75
      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, LOW);
      digitalWrite(Filter2, HIGH);
      digitalWrite(Filter3, HIGH);
      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 75", 100, 60);
      EEPROM.update(2, LOW);
      EEPROM.update(3, LOW);
      EEPROM.update(4, HIGH);
      EEPROM.update(5, HIGH);
      IR.data = 0;
      break;

    case 0x807FE817:  //Filter 85
      digitalWrite(Filter_OFF, LOW);
      digitalWrite(Filter1, HIGH);
      digitalWrite(Filter2, HIGH);
      digitalWrite(Filter3, HIGH);
      myGLCD.setColor(VGA_RED);
      myGLCD.setFont(DotMatrix_M_Slash);
      myGLCD.print(" 85", 100, 60);
      EEPROM.update(2, LOW);
      EEPROM.update(3, HIGH);
      EEPROM.update(4, HIGH);
      EEPROM.update(5, HIGH);
      IR.data = 0;
      break;

    case 0x807F40BF:  //PHase 180
      digitalWrite(PHase, HIGH);
      myGLCD.setFont(DotMatrix_M);
      myGLCD.setColor(VGA_YELLOW);
      myGLCD.print("180", RIGHT, 60);
      EEPROM.update(8, HIGH);
      IR.data = 0;
      break;

    case 0x807F00FF: //PHase 0
      digitalWrite(PHase, LOW);
      myGLCD.setFont(DotMatrix_M);
      myGLCD.setColor(VGA_BLACK);
      myGLCD.print("180", RIGHT, 60);
      myGLCD.setColor(VGA_RED);
      myGLCD.print("0 ", RIGHT, 60);
      EEPROM.update(8, LOW);
      IR.data = 0;
      break;

    case 0x807F20DF:
      Reset();
      break;




    case 0x807F58A7:








      EEPROM.update(0, Vol);  // Пишем изменения громкости в EEPROM
      break;










    case 0x807F708F:



      EEPROM.update(0, Vol);  // Пишем изменения громкости в EEPROM
      break;


  }













}
//}




lameralik

  • .
  • *
  • Сообщений: 150
  • Карма: +0/-0
Re: мучения с "градусником"
« Ответ #62 : 18 Май 2020, 16:24:57 »
Заметил, если нажать изменить сообщение, то с кодировкой нет проблем, а если редактировать, то слетает кодировка.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5254
  • Карма: +6/-0
Re: мучения с "градусником"
« Ответ #63 : 18 Май 2020, 17:12:42 »
запишу на будущее всем школьникам формулу пропорциональности:

X / Xmax = Y / Ymax
X = Y * Xmax / Ymax
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5254
  • Карма: +6/-0
..
« Ответ #64 : 18 Май 2020, 18:21:47 »
кстати, эта формула ни что иное, как интерполяция или экстраполяция линейной функции, проходящей через начало координат.
F(0) = 0
F(X) = F(Xn) * X / Xn
X <= Xn интерполяция
X > Xn экстраполяция
« Последнее редактирование: 19 Май 2020, 11:51:11 от slav0n »
while(1||!1);
зберігай спокій

lameralik

  • .
  • *
  • Сообщений: 150
  • Карма: +0/-0
Re: мучения с "градусником"
« Ответ #65 : 18 Май 2020, 18:46:51 »
Того,  что я искал формула не может. Я успокоился и остановился  Невозможно привязать к 100не шкалу 255 пропорционально целыми числами без остатка. Ну никак. Пришлось тормозить с запросами.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5254
  • Карма: +6/-0
Re: мучения с "градусником"
« Ответ #66 : 19 Май 2020, 00:48:47 »
ничего страшного, максимальная погрешность менее 0.4%
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5254
  • Карма: +6/-0
Re: мучения с "градусником"
« Ответ #67 : 19 Май 2020, 01:42:21 »
если нажать изменить сообщение, то с кодировкой нет проблем, а если редактировать, то слетает кодировка.
кнопку пофиксил, все нормально
while(1||!1);
зберігай спокій

lameralik

  • .
  • *
  • Сообщений: 150
  • Карма: +0/-0
Re: мучения с "градусником"
« Ответ #68 : 19 Май 2020, 08:15:14 »
ничего страшного, максимальная погрешность менее 0.4%

Вот я этого не знал, думал будет на слух слышно, как громкость неравномерно прибавляется, и пытался добится равномерных шагов через цикл. А оказалось, что вообще ничего не заметно в железе. Усилитель тока вчера друг принес, я в железе попробовал работает. Огромное спасибо.