// https://www.hackster.io/mircemk/diy-arduino-vfd-display-20x2-vu-volume-unit-meter-37898f // #include #include // Выходы для управления реле (вкл.вкл ЦАП/Блютуз) #define RELAY_DAC 6 #define RELAY_BT 7 // LiquidCrystal lcdVuMeterVuMeter(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7 LiquidCrystal_I2C lcdVuMeter(0x26, 16, 2); LiquidCrystal_I2C lcdInfo(0x27, 16, 2); byte a1[8]={ 0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011}; byte a2[8]={ 0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000}; byte a3[8]={ 0b00000,0b00011,0b00011,0b00011,0b00011,0b00011,0b00011,0b00011}; byte znak_r[8]={ // R B00000, B11100, B10010, B10010, B11100, B11000, B10100, B10010}; byte znak_l[8]={ // L B00000, B10000, B10000, B10000, B10000, B10000, B10000, B11110}; int u_r,u_l,i=1,x,u_maxr,u_maxl,z,z1,u_r0[15],u_l0[15]; unsigned long time1; long decayTime = 0; void setup(){ analogReference(INTERNAL); lcdVuMeter.init(); lcdVuMeter.backlight(); lcdVuMeter.clear(); lcdVuMeter.setCursor(0, 0); // lcdVuMeter.begin(16, 2);// lcdVuMeter 16X2 lcdVuMeter.createChar(0,a1); lcdVuMeter.createChar(1,a2); lcdVuMeter.createChar(2,znak_r); lcdVuMeter.createChar(3,znak_l); lcdVuMeter.createChar(4,a3); lcdInfo.init(); lcdInfo.backlight(); lcdInfo.clear(); lcdInfo.setCursor(0, 0); lcdInfo.print("DAC"); // Вход аудио-сигнала pinMode(A0,INPUT); pinMode(A1,INPUT); // Кнопка управления (переключения) pinMode(3, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(10, INPUT_PULLUP); // Выходы для управления реле (вкл.вкл ЦАП/Блютуз) pinMode(RELAY_DAC, OUTPUT); pinMode(RELAY_BT, OUTPUT); digitalWrite(RELAY_DAC, HIGH); lcdVuMeter.clear(); // lcdVuMeter.setCursor(5, 0); // lcdVuMeter.print("Loading..."); // for (int i = 0; i < 20; i++) // { // lcdVuMeter.setCursor(i, 1); // lcdVuMeter.write(1); // // delay(100); // } delay(5); lcdVuMeter.clear(); decayTime = millis(); } bool usb = true; bool blueTooth = false; uint32_t btnTimer = 0; void loop(){ lcdVuMeter.setCursor(0,0);// R lcdVuMeter.write((uint8_t)2); lcdVuMeter.setCursor(0,1); lcdVuMeter.write((uint8_t)3);// L u_r = analogRead(A0); // измерение R u_l = analogRead(A2); // измерение L for(int z=1,z1=0,z2=30;z<=15;z++,z1=z1+30,z2=z2+30){ // l+r if(u_l>z1){ lcdVuMeter.setCursor(z,1); lcdVuMeter.write((uint8_t)1); } if(u_r>z1){ lcdVuMeter.setCursor(z,0); lcdVuMeter.write((uint8_t)1); } if(u_l>z2){ lcdVuMeter.setCursor(z,1); lcdVuMeter.write((uint8_t)0); } if(u_r>z2){ lcdVuMeter.setCursor(z,0); lcdVuMeter.write((uint8_t)0); } } i++; if(i<=15){ u_l0[i]=u_l; u_r0[i]=u_r; } else{ i=1; } if(i==15){ u_maxr=0; u_maxl=0; for(x=1;x<=15;x++){ u_maxl=max(u_maxl,u_l0[x]); u_maxr=max(u_maxr,u_r0[x]); } } if(u_maxl<=u_l){ u_maxl=u_l; } if(u_maxr<=u_r){ u_maxr=u_r; } // // for(z=1,z1=0;z<=15;z++,z1=z1+30){ // if(u_maxl > z1 && u_maxl <= z1+15){ // lcdVuMeter.setCursor(z,1); // lcdVuMeter.write((uint8_t)1); // } // if(u_maxl > z1+15 && u_maxl <= z1+30){ // lcdVuMeter.setCursor(z,1); // lcdVuMeter.write((uint8_t)4); // } // // if(u_maxr > z1 && u_maxr <= z1+15){ // lcdVuMeter.setCursor(z,0); // lcdVuMeter.write((uint8_t)1); // } // if(u_maxr > z1+15 && u_maxr <= z1+30){ // lcdVuMeter.setCursor(z,0); // lcdVuMeter.write((uint8_t)4); // } // } delay(30); lcdVuMeter.clear(); // читаем инвертированное значение для удобства bool btnState = digitalRead(3); if (btnState&& millis() - btnTimer > 100) { // обработчик нажатия lcdInfo.clear(); if (!usb && blueTooth) { usb = true; blueTooth = false; btnTimer = millis(); lcdInfo.setCursor(0,0); lcdInfo.print("DAC"); delay(1000); digitalWrite(RELAY_BT, LOW); digitalWrite(RELAY_DAC, HIGH); } else if (usb && !blueTooth&& millis() - btnTimer > 100) { usb = false; blueTooth = true; btnTimer = millis(); lcdInfo.setCursor(0,0); lcdInfo.print("Bluetooth"); delay(1000); digitalWrite(RELAY_DAC, LOW); digitalWrite(RELAY_BT, HIGH); } lcdInfo.setCursor(0,1); // lcdInfo.print(btnState); } if (digitalRead(8) && usb) { lcdInfo.setCursor(0,1); lcdInfo.print("Coaxial"); } else if (digitalRead(9) && usb) { lcdInfo.setCursor(0,1); lcdInfo.print("Optical"); } else if (digitalRead(10) && usb) { lcdInfo.setCursor(0,1); lcdInfo.print("Audio "); } else { lcdInfo.setCursor(0,1); lcdInfo.print(" "); } lcdInfo.setCursor(11,1); lcdInfo.print(digitalRead(8), digitalRead(9)); // if (!btnState) { // обработчик отпускания // lcdInfo.clear(); // lcdInfo.setCursor(0,1); // lcdInfo.print(btnState); // //Serial.println("release"); // } }