26

Re: VU метр

#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
byte v1[8] = {0, 0, 0, 0, 0, 0, 0, 31};
byte v2[8] = {0, 0, 0, 0, 0, 0, 31, 31};
byte v3[8] = {0, 0, 0, 0, 0, 31, 31, 31};
byte v4[8] = {0, 0, 0, 0, 31, 31, 31, 31};
byte v5[8] = {0, 0, 0, 31, 31, 31, 31, 31};
byte v6[8] = {0, 0, 31, 31, 31, 31, 31, 31};
byte v7[8] = {0, 31, 31, 31, 31, 31, 31, 31};
byte v8[8] = {31, 31, 31, 31, 31, 31, 31, 31};


void setup() {
  lcd.begin(16, 2);// LCD 16X2

  pinMode(PA6, INPUT); // A0 - аналоговый вход
  pinMode(PB0, INPUT); // A1 - аналоговый вход
}

void loop() {
  /////////////
  lcd.createChar(0, v1); lcd.createChar(1, v2); lcd.createChar(2, v3); lcd.createChar(3, v4);
  lcd.createChar(4, v5); lcd.createChar(5, v6); lcd.createChar(6, v7); lcd.createChar(7, v8);
  int posLevel = map(analogRead(PA6), 0, 1023, 0, 15);
  if (posLevel > 7) {
  lcd.setCursor(0, 0); lcd.write((uint8_t)posLevel - 7);
   lcd.setCursor(0, 1); lcd.write((uint8_t)7);
   
    ////////////////
  }
  if (posLevel <= 7) {
    lcd.setCursor(0, 0); lcd.print(" ");
    lcd.setCursor(0, 1); lcd.write((uint8_t)posLevel);
  }

// delay(1);
}

27 (2020-11-08 01:53:59 отредактировано korted)

Re: VU метр

Отлично.
Добавил второй канал.
Спасибо
Когда настраиваешь что то, то  легче следить за высотой столба чем смотреть на цифры.

Я только что обнаружил этот форум, нашел много вещей которых нет в других местах.
Жалко что не получилось с горизонтальными линиями ,

28

Re: VU метр

Можно ли в одном столбе сделать 2 канала ?

29

Re: VU метр

Нет.

30

Re: VU метр

Всё работает отлично, но разрешающая способность не очень хорошая .
Вот втарой вариант = переключене экраов .
Переключене происходит правельно но  VU не реагирует на пдаваемый сигнал, PA6 , PB0 .

#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>
///////////////////////
#define GAIN 5.5
#define STEP 10


 byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
/////////////////////
const int button = PB11;            // GPIO 8 for the button
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  pinMode(button, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
//////////////
 // urr = log(analogRead(PA6))*GAIN;
 // ull = log(analogRead(PB0))*GAIN;
 /////////////
  if (digitalRead(button) == HIGH) { // if button is pressed
    if (ledflag == 0) {           // and the status flag is LOW
      ledflag = 1;                // make status flag HIGH
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
  urr = log(analogRead(PA6))*GAIN;
  ull = log(analogRead(PB0))*GAIN;
 
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {                        // otherwise...


      ledflag = 0;                // make status flag LOW


      digitalWrite(led, LOW);
       //lcd.print("        ");// fill with blanks
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("hello2");// and turn off the LED


    }
    delay(1000);                    // wait a sec for the
  }                               // hardware to stabilize


}                                 // begin again

31

Re: VU метр

Попробуйте так:

#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>
///////////////////////
#define GAIN 5.5
#define STEP 10


 byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
/////////////////////
const int button = PB11;            // GPIO 8 for the button
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  pinMode(button, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
//////////////
 // urr = log(analogRead(PA6))*GAIN;
 // ull = log(analogRead(PB0))*GAIN;
 /////////////
  if (digitalRead(button) == HIGH && ledflag == 0) { ledflag = 1;  delay(200);}
  if (digitalRead(button) == HIGH && ledflag == 1) { ledflag = 0;  delay(200);}
    if (ledflag == 1) {          
                   
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
  urr = log(analogRead(PA6))*GAIN;
  ull = log(analogRead(PB0))*GAIN;
 
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {                        // otherwise...


      ledflag = 0;                // make status flag LOW


      digitalWrite(led, LOW);
       //lcd.print("        ");// fill with blanks
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("hello2");// and turn off the LED


    }
  


}                                 // begin again

32 (2020-11-10 00:55:26 отредактировано korted)

Re: VU метр

вот ошибка - stray '#' in program

**********************************************************8
Arduino: 1.8.9 (Mac OS X), Board: "Generic STM32F103C series, STM32F103C8 (20k RAM. 64k Flash), STLink, 72Mhz (Normal), Smallest (default)"


The sketch name had to be modified.
Sketch names must start with a letter or number, followed by letters,
numbers, dashes, dots and underscores. Maximum length is 63 characters.
LCD_switch_5:92:16: error: stray '#' in program
}              #include <LiquidCrystal.h>
                ^
LCD_switch_5:92:17: error: 'include' does not name a type
}              #include <LiquidCrystal.h>
                 ^~~~~~~
LCD_switch_5:101:11: error: redefinition of 'byte a1 [8]'
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
           ^
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:10:7: note: 'byte a1 [8]' previously defined here
  byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
       ^~
LCD_switch_5:102:12: error: redefinition of 'byte a2 [8]'
   byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
            ^
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:11:8: note: 'byte a2 [8]' previously defined here
   byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
        ^~
LCD_switch_5:103:12: error: redefinition of 'byte a3 [8]'
   byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
            ^
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:12:8: note: 'byte a3 [8]' previously defined here
   byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
        ^~
LCD_switch_5:104:8: error: redefinition of 'byte z'
   byte z,z0,z1;
        ^
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:13:8: note: 'byte z' previously declared here
   byte z,z0,z1;
        ^
LCD_switch_5:104:10: error: redefinition of 'byte z0'
   byte z,z0,z1;
          ^~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:13:10: note: 'byte z0' previously declared here
   byte z,z0,z1;
          ^~
LCD_switch_5:104:13: error: redefinition of 'byte z1'
   byte z,z0,z1;
             ^~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:13:13: note: 'byte z1' previously declared here
   byte z,z0,z1;
             ^~
LCD_switch_5:105:7: error: redefinition of 'int ur'
   int ur,ul,urr,ull;
       ^~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:14:7: note: 'int ur' previously declared here
   int ur,ul,urr,ull;
       ^~
LCD_switch_5:105:10: error: redefinition of 'int ul'
   int ur,ul,urr,ull;
          ^~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:14:10: note: 'int ul' previously declared here
   int ur,ul,urr,ull;
          ^~
LCD_switch_5:105:13: error: redefinition of 'int urr'
   int ur,ul,urr,ull;
             ^~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:14:13: note: 'int urr' previously declared here
   int ur,ul,urr,ull;
             ^~~
LCD_switch_5:105:17: error: redefinition of 'int ull'
   int ur,ul,urr,ull;
                 ^~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:14:17: note: 'int ull' previously declared here
   int ur,ul,urr,ull;
                 ^~~
LCD_switch_5:107:11: error: redefinition of 'const int button'
const int button = PB11;            // GPIO 8 for the button
           ^~~~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:16:11: note: 'const int button' previously defined here
const int button = PB11;            // GPIO 8 for the button
           ^~~~~~
LCD_switch_5:108:11: error: redefinition of 'const int led'
const int led = PC13;               // GPIO 7 for the LED
           ^~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:17:11: note: 'const int led' previously defined here
const int led = PC13;               // GPIO 7 for the LED
           ^~~
LCD_switch_5:109:5: error: redefinition of 'int ledflag'
int ledflag = 0;                 // LED status flag
     ^~~~~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:18:5: note: 'int ledflag' previously defined here
int ledflag = 0;                 // LED status flag
     ^~~~~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino: In function 'void setup()':
LCD_switch_5:112:6: error: redefinition of 'void setup()'
void setup() {
      ^~~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:21:6: note: 'void setup()' previously defined here
void setup() {
      ^~~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino: In function 'void loop()':
LCD_switch_5:127:6: error: redefinition of 'void loop()'
void loop() {
      ^~~~
/Users/tedkor/Documents/Arduino/LCD_switch_5/LCD_switch_5.ino:36:6: note: 'void loop()' previously defined here
void loop() {
      ^~~~
Multiple libraries were found for "LiquidCrystal.h"
Used: /Users/tedkor/Documents/Arduino/hardware/Arduino_STM32-master-3/STM32F1/libraries/LiquidCrystal
Not used: /Users/tedkor/Desktop/Arduino.app/Contents/Java/libraries/LiquidCrystal
exit status 1
stray '#' in program


This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

33

Re: VU метр

У меня компиляция проходит без ошибок:

Скетч использует 19668 байт (30%) памяти устройства. Всего доступно 65536 байт.
Глобальные переменные используют 3176 байт (15%) динамической памяти, оставляя 17304 байт для локальных переменных. Максимум: 20480 байт.

#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>
///////////////////////
#define GAIN 5.5
#define STEP 10


byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
/////////////////////
const int button = PB11;            // GPIO 8 for the button
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  pinMode(button, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
//////////////
// urr = log(analogRead(PA6))*GAIN;
// ull = log(analogRead(PB0))*GAIN;
/////////////
  if (digitalRead(button) == HIGH && ledflag == 0) { ledflag = 1;  delay(200);}
  if (digitalRead(button) == HIGH && ledflag == 1) { ledflag = 0;  delay(200);}
    if (ledflag == 1) {         
                   
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
  urr = log(analogRead(PA6))*GAIN;
  ull = log(analogRead(PB0))*GAIN;

  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {                        // otherwise...


      ledflag = 0;                // make status flag LOW


      digitalWrite(led, LOW);
       //lcd.print("        ");// fill with blanks
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("hello2");// and turn off the LED


    }
 


}                                 // begin again

34

Re: VU метр

Спасибо
Да сейчас УВ метр работает как надо , появилась проблема с - hellow 2 - он очень моргал , добавил в конце лооп delay(10); = 10 мс и hello2 почти не мигает, в место его будет измеритель переменного напряжения с частотой 10 кГц = 0.1мс = 100 меньше.
Посмотрим как измеритель будет вести себя.

35

Re: VU метр

Вот добавил измеритель переменного напряжения

//switching ok with delay (10);
// lcd.clear();
 //     lcd.setCursor(0, 1);//R
 //    lcd.print (urr);
 //      lcd.setCursor(0, 0);//L
 //    lcd.print (ull);
 /////////////////////////////////////////////////////////////
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>
///////////////////////
const int sensorIn = PA7;
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;
double maxValue = 0;


const int numReadings = 25;
const int ResetPin = PB11;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;
int currentaverage = average;
int previousaverage = 0;


float Vo;
/////////////////////
#define GAIN 5.5
#define STEP 10


byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
/////////////////////
const int button = PB11;            // GPIO 8 for the button
//const int button = PB3;
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  ////////////////////////
  Serial.begin(115200);
 pinMode(LED_BUILTIN, OUTPUT);
 pinMode(ResetPin , INPUT_PULLDOWN);
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  //////////////////////
  pinMode(button, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
  /////////////////
    {
    Vo = currentaverage;
  }


  previousaverage = currentaverage;
  currentaverage = average;
  //*******************************************************************************
  if (abs(currentaverage -  previousaverage) <  previousaverage / 70 ) // 100 = 1%
    //********************************************************************************
  {
    currentaverage = previousaverage;
  }


  total = total - readings[readIndex];
  readings[readIndex] = AmpsRMS;
  total = total + readings[readIndex];
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  average = total / numReadings;


  Voltage = getVPP();
  VRMS = (Voltage / 2.0) * 0.707; //root 2 is 0.707
  // AmpsRMS = (VRMS * 1000)/mVperAmp;
  AmpsRMS = (VRMS * 1000);
  /////
  Serial.print(AmpsRMS);// blue
  // Serial.println(" ");
  Serial.print("\t");
  Serial.print( currentaverage + 8);//red
  Serial.print("\t");
  Serial.println(average + 10);// green
  //******************************************************
  if (abs(Vo -  currentaverage) > 3) // generator 1% changes = 12
    //********************************************************
  {
    //  digitalWrite(PB14, HIGH);
    // LED = 1;
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else
  {
    // digitalWrite(PB14, LOW);
    //LED = 0;
    digitalWrite(LED_BUILTIN, LOW);
  }
/*
  lcd.setCursor(0, 1);
  lcd.print("V");
  lcd.setCursor(1, 1);
  lcd.print(AmpsRMS);
  lcd.setCursor(11, 1);
  //lcd.print(average);
  lcd.print(Vo);// red line
*/
/*
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);// red line
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 2);
  */
//////////////
urr = log(analogRead(PA6))*GAIN;
 ull = log(analogRead(PB0))*GAIN;
/////////////
  if (digitalRead(button) == HIGH && ledflag == 0) { ledflag = 1;  delay(200);}
  if (digitalRead(button) == HIGH && ledflag == 1) { ledflag = 0;  delay(200);}
    if (ledflag == 1) {          
                   
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
 // urr = log(analogRead(PA6))*GAIN;
// ull = log(analogRead(PB0))*GAIN;
   lcd.print("        ");// fill with blanks
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {                        // otherwise...


      ledflag = 0;                // make status flag LOW


      digitalWrite(led, LOW);
/*
 // case #1 , DC1, DC2     
/////////////////////
       //lcd.print("        ");// fill with blanks
      lcd.clear();
      lcd.setCursor(0, 1);//R
     lcd.print (urr);
       lcd.setCursor(0, 0);//L
     lcd.print (ull);
    // lcd.print("hello2");// and turn off the LED
////////////////
*/
//case #2 , AC
   lcd.print("        ");// fill with blanks
     // lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);// red line
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 0);


////////////////
    }
 
    delay(10);
} 
//********************************
float getVPP()
{
  float result;
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here


  uint32_t start_time = millis();
  // while((millis()-start_time) < 1000) //sample for 1 Sec
  //***************************************************************
  while ((millis() - start_time) < 20) // speed
    //****************************************************************
  {
    readValue = analogRead(sensorIn);
    // see if you have a new maxValue
    if (readValue > maxValue)
    {
      maxValue = readValue;
    }
    if (readValue < minValue)
    {
      minValue = readValue;
    }
  }
  result = ((maxValue - minValue) * 5.0) / 1024.0;
  return result;
}
 

36

Re: VU метр

Результаты
1 = после загружения программы = ок
2 = один раз нажал кнопку  = ок
3 = второй раз нажал кнопку  = плохо
http://forum.rcl-radio.ru/uploads/images/2020/11/f4e1552b36d5c858c79639b400fcd729.jpg
http://forum.rcl-radio.ru/uploads/images/2020/11/1440f06da96caca3e50da2c29084bcc0.jpg
http://forum.rcl-radio.ru/uploads/images/2020/11/01f6db99ae63209d3732ea5aa0532f71.jpg

37

Re: VU метр

/////////////////////////////////////////////////////////////
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>
///////////////////////
const int sensorIn = PA7;
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;
double maxValue = 0;


const int numReadings = 25;
const int ResetPin = PB11;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;
int currentaverage = average;
int previousaverage = 0;


float Vo;
/////////////////////
#define GAIN 5.5
#define STEP 10


byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
/////////////////////
const int button = PB11;            // GPIO 8 for the button
//const int button = PB3;
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  ////////////////////////
  Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ResetPin , INPUT_PULLDOWN);
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  //////////////////////
  pinMode(button, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
  /////////////////
    {
    Vo = currentaverage;
  }


  previousaverage = currentaverage;
  currentaverage = average;
  //*******************************************************************************
  if (abs(currentaverage -  previousaverage) <  previousaverage / 70 ) // 100 = 1%
    //********************************************************************************
  {
    currentaverage = previousaverage;
  }


  total = total - readings[readIndex];
  readings[readIndex] = AmpsRMS;
  total = total + readings[readIndex];
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  average = total / numReadings;


  Voltage = getVPP();
  VRMS = (Voltage / 2.0) * 0.707; //root 2 is 0.707
  // AmpsRMS = (VRMS * 1000)/mVperAmp;
  AmpsRMS = (VRMS * 1000);
  /////
  Serial.print(AmpsRMS);// blue
  // Serial.println(" ");
  Serial.print("\t");
  Serial.print( currentaverage + 8);//red
  Serial.print("\t");
  Serial.println(average + 10);// green
  //******************************************************
  if (abs(Vo -  currentaverage) > 3) // generator 1% changes = 12
    //********************************************************
  {
    //  digitalWrite(PB14, HIGH);
    // LED = 1;
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else
  {
    // digitalWrite(PB14, LOW);
    //LED = 0;
    digitalWrite(LED_BUILTIN, LOW);
  }
/*
  lcd.setCursor(0, 1);
  lcd.print("V");
  lcd.setCursor(1, 1);
  lcd.print(AmpsRMS);
  lcd.setCursor(11, 1);
  //lcd.print(average);
  lcd.print(Vo);// red line
*/
/*
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);// red line
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 2);
  */
//////////////
urr = log(analogRead(PA6))*GAIN;
ull = log(analogRead(PB0))*GAIN;
/////////////
  if (digitalRead(button) == HIGH && ledflag == 0) { ledflag = 1; lcd.clear(); delay(200);}
  if (digitalRead(button) == HIGH && ledflag == 1) { ledflag = 0; lcd.clear(); delay(200);}
    if (ledflag == 1) {         
                   
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
// urr = log(analogRead(PA6))*GAIN;
// ull = log(analogRead(PB0))*GAIN;
   lcd.print("        ");// fill with blanks
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {
      lcd.clear();
      ledflag = 0;               
      digitalWrite(led, LOW);
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 0);


////////////////
    }

    delay(10);
}
//********************************
float getVPP()
{
  float result;
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here


  uint32_t start_time = millis();
  // while((millis()-start_time) < 1000) //sample for 1 Sec
  //***************************************************************
  while ((millis() - start_time) < 20) // speed
    //****************************************************************
  {
    readValue = analogRead(sensorIn);
    // see if you have a new maxValue
    if (readValue > maxValue)
    {
      maxValue = readValue;
    }
    if (readValue < minValue)
    {
      minValue = readValue;
    }
  }
  result = ((maxValue - minValue) * 5.0) / 1024.0; /// обратите внимание что STM32 12 бит вход - это 4095 уровней на 3,3 В, у Вас это для nano 5В 1024 уровня 10 бит
  return result;
}

38 (2020-11-11 07:23:05 отредактировано korted)

Re: VU метр

Спасибо
Вроде всё работает, хотел добавить показания урр и улл в режиме измерения перемного напряжения но тогда  на экране  в верхной строке только два нуля каторые не рагируют на подаваемое напряжение.

Калибровку для stm32 уже сделал. 

#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <stdio.h>
#include <stdlib.h>


const int sensorIn = PA7;
int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module


double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;
double maxValue = 0;


const int numReadings = 25;
//const int Vobutton = PB11;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;
int currentaverage = average;
int previousaverage = 0;


float Vo;
/////////////////////
#define GAIN 5.5
#define STEP 10


byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
  
const int Vobutton = PB11;            // GPIO 8 for the button
const int Swbutton = PB5;
const int led = PC13;               // GPIO 7 for the LED
int ledflag = 0;                 // LED status flag


void setup() {
  lcd.begin(16, 2);
  ////////////////////////
  Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(Vobutton , INPUT_PULLDOWN);
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  //////////////////////
  pinMode(Swbutton, INPUT_PULLDOWN);         // define button as an
  pinMode(led, OUTPUT);          // define LED as an output
  digitalWrite(led, LOW);        // turn output off just in case
  ///////////////////
lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);


  pinMode(PA6,INPUT);// A0 - аналоговый вход
  pinMode(PB0,INPUT);// A1 - аналоговый вход
  /////////////
}


void loop() {
if (digitalRead(Vobutton) == HIGH)
  /////////////////
    {
    Vo = currentaverage;
  }


  previousaverage = currentaverage;
  currentaverage = average;
  //*******************************************************************************
  if (abs(currentaverage -  previousaverage) <  previousaverage / 70 ) // 100 = 1%
    //********************************************************************************
  {
    currentaverage = previousaverage;
  }


  total = total - readings[readIndex];
  readings[readIndex] = AmpsRMS;
  total = total + readings[readIndex];
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  average = total / numReadings;


  Voltage = getVPP();
  VRMS = (Voltage / 2.0) * 0.707; //root 2 is 0.707
  // AmpsRMS = (VRMS * 1000)/mVperAmp;
  AmpsRMS = (VRMS * 1000);
  /////
  Serial.print(AmpsRMS);// blue
  // Serial.println(" ");
  Serial.print("\t");
  Serial.print( currentaverage + 8);//red
  Serial.print("\t");
  Serial.println(average + 10);// green
  //******************************************************
  if (abs(Vo -  currentaverage) > 3) // generator 1% changes = 12
    //********************************************************
  {
    //  digitalWrite(PB14, HIGH);
    // LED = 1;
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else
  {
    // digitalWrite(PB14, LOW);
    //LED = 0;
    digitalWrite(LED_BUILTIN, LOW);
  }
/*
  lcd.setCursor(0, 1);
  lcd.print("V");
  lcd.setCursor(1, 1);
  lcd.print(AmpsRMS);
  lcd.setCursor(11, 1);
  //lcd.print(average);
  lcd.print(Vo);// red line
*/
/*
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);// red line
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 2);
  */
//////////////
urr = log(analogRead(PA6))*GAIN;
ull = log(analogRead(PB0))*GAIN;
/////////////
  if (digitalRead(Swbutton) == HIGH && ledflag == 0) { ledflag = 1; lcd.clear(); delay(200);}
  if (digitalRead(Swbutton) == HIGH && ledflag == 1) { ledflag = 0; lcd.clear(); delay(200);}
    if (ledflag == 1) {          
                   
      digitalWrite(led, HIGH);
   
      /*
        lcd.clear();
      // lcd.print("        ");// fill with blanks
      lcd.setCursor(0, 0);
      lcd.print("hello  1");// and turn on the LED
      */
// urr = log(analogRead(PA6))*GAIN;
// ull = log(analogRead(PB0))*GAIN;
  lcd.print("        ");// fill with blanks
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(0,0);lcd.print("L");
   // lcd.clear();
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,1);lcd.write((uint8_t)0);lcd.setCursor(z0+2,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,1);lcd.write((uint8_t)2);}


   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0+1,0);lcd.write((uint8_t)0);lcd.setCursor(z0+2,0);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0+1,0);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0+1,0);lcd.write((uint8_t)2);}
      /////////////////////
    }


    else {
      lcd.clear(); 
      ledflag = 0;                
      digitalWrite(led, LOW);
  lcd.setCursor(0, 0);
  lcd.print( currentaverage);
  lcd.setCursor(5, 0);
  lcd.print((Vo - currentaverage), 0);
/////////////////////////////////////////////////////////////////////////
  lcd.setCursor(0, 1);
 // lcd.print( urr);
  lcd.setCursor(5, 1);
  //lcd.print((ull), 0);
///////////////////////////////////////////////////////////////////////


    }
   // delay(10);
} 
//*******
float getVPP()
{
  float result;
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here


  uint32_t start_time = millis();
  // while((millis()-start_time) < 1000) //sample for 1 Sec
  //***************************************************************
  while ((millis() - start_time) < 20) // speed
    //****************************************************************
  {
    readValue = analogRead(sensorIn);
    // see if you have a new maxValue
    if (readValue > maxValue)
    {
      maxValue = readValue;
    }
    if (readValue < minValue)
    {
      minValue = readValue;
    }
  }
  result = ((maxValue - minValue) * 5.0) / 1024.0; /// обратите внимание что STM32 12 бит вход - это 4095 уровней на 3,3 В, у Вас это для nano 5В 1024 уровня 10 бит
  return result;
}

это добавил

/////////////////////////////////////////////////////////////////////////
  lcd.setCursor(0, 1);
 // lcd.print( urr);
  lcd.setCursor(5, 1);
  //lcd.print((ull), 0);
///////////////////////////////////////////////////////////////////////

39 (2020-11-11 12:22:52 отредактировано korted)

Re: VU метр

ошибку нашел = lcd.print(ull);
сейчас надо добавить третий канал VU для currentaverage

/////////////////////////////////////////////////////////////////////////
  lcd.setCursor(0, 1);
  lcd.print( 'currentaverage '); // третий канал VU
  lcd.setCursor(5, 1);
  //lcd.print((ull), 0);
///////////////////////////////////////////////////////////////////////

40

Re: VU метр

Вопрос несколько не в тему. Можно ли изменить концепцию устройства применив два индикатора 1602 , а ещё лучше 1601 ( однострочный) для вывода на каждый из них отдельно каждого канала?

41

Re: VU метр

derdemons пишет:

Вопрос несколько не в тему. Можно ли изменить концепцию устройства применив два индикатора 1602 , а ещё лучше 1601 ( однострочный) для вывода на каждый из них отдельно каждого канала?

Я думаю, что проблем с этим не возникнет:

LiquidCrystal lcd0(0,1,2,  3,4,5,6);// RS,E,D4,D5,D6,D7
LiquidCrystal lcd1(7,8,  9,10,11,12);// RS,E,D4,D5,D6,D7

lcd0.begin(16, 2);
lcd1.begin(16, 2);

lcd0setCursor(z0,1);lcd0.write((uint8_t)2);
lcd0.setCursor(z0,1);lcd1.write((uint8_t)2);

42

Re: VU метр

Линии данных можно использовать одни и те же для обоих дисплеев, в итоге можно получить еще свободных четыре вывода контролёра (энкодер,I2C + аудиопрцессор)
http://forum.rcl-radio.ru/uploads/images/2020/11/5ee9606da6a22f5bf8311a8e5a2f922c.jpg

http://digitrode.ru/computing-devices/mcu_cpu/1250-kak-podklyuchit-neskolko-displeev-k-arduino-s-pomoschyu-multipleksirovaniya.html

43

Re: VU метр

А можно тоже самое сделать для стрелочных индикаторов?

44

Re: VU метр

Попробовал подключить два индикатора LCD1601
Библиотеку  для индикаторов использовал другую поскольку с LiquidCrystal эти индикаторы парой работать не захотели. Ссылка на библиотеку в скетче.   

#define GAIN 15
#define STEP 8
/*
 
 
https://github.com/mk90/LiquidCrystalRus

 */

// include the library code:
#include <LiquidCrystalRus.h>

// initialize the library with the numbers of the interface pins
LiquidCrystalRus lcd0(12, 10, 11, 5, 4, 3, 2);// RS,RW,E,D4,D5,D6,D7
LiquidCrystalRus lcd1(7, 8, 9, 5, 4, 3, 2);// RS,RW,E,D4,D5,D6,D7
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
 
  
void setup() {
  // set up the LCD's number of rows and columns: 
  lcd0.begin(16,1);
  lcd1.begin(16,1);
  lcd0.createChar(0,a1);lcd0.createChar(1,a2);lcd0.createChar(2,a3);
  lcd1.createChar(0,a1);lcd1.createChar(1,a2);lcd1.createChar(2,a3);
 // analogReference(INTERNAL);
  pinMode(A0,INPUT);// A0 - аналоговый вход
  pinMode(A1,INPUT);// A1 - аналоговый вход
}

void loop() {
  urr = log(analogRead(0))*GAIN;
  ull = log(analogRead(1))*GAIN;
 
  lcd0.setCursor(0,0);lcd0.print("R");
  lcd1.setCursor(0,0);lcd1.print("L");
  
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)0);lcd0.setCursor(z0+2,0);lcd0.print(" ");}}
   if(z1==3){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)1);}
   if(z1==2){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)2);}

   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)0);lcd1.setCursor(z0+2,0);lcd1.print(" ");}}
   if(z1==3){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)1);}
   if(z1==2){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)2);}
   
  delay(1);
}

К сожалению не всё работает как надо на LCD 1601 , работает только одна половина этого индикатора.Если вместо  LCD 1601 ставлю 1602 то всё работает как и должно.
Здесь http://mk90.blogspot.com/2010/05/lcd.html как раз и рассматривается эта проблема, но если с выводом строк понятно и всё работает в примерах то вот как вывести уровень сигнала на  LCD 1601 понять не могу.http://forum.rcl-radio.ru/uploads/images/2020/11/62d45e9f82c101a19e20e3036bad065f.jpg

45

Re: VU метр

судя по примеру должно быть так

lcd.begin(16, 2);
lcd.setDRAMModel(LCD_DRAM_WH1601);

46 (2020-11-26 23:33:08 отредактировано derdemons)

Re: VU метр

Заработало Спасибо!
рабочий скетч:

#define GAIN 15
#define STEP 8
/*
 
 
https://github.com/mk90/LiquidCrystalRus

 */

// include the library code:
#include <LiquidCrystalRus.h>

// initialize the library with the numbers of the interface pins
LiquidCrystalRus lcd0(12, 10, 11, 5, 4, 3, 2);// RS,RW,E,D4,D5,D6,D7
LiquidCrystalRus lcd1(7, 8, 9, 5, 4, 3, 2);// RS,RW,E,D4,D5,D6,D7
byte a1[8] = {0b00000,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
  byte a2[8] = {0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
  byte a3[8] = {0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
  byte z,z0,z1;
  int ur,ul,urr,ull;
 
  
void setup() {
  // set up the LCD's number of rows and columns: 
  lcd0.begin(16,2);
  lcd0.setDRAMModel(LCD_DRAM_WH1601);
  lcd1.begin(16,2);
  lcd1.setDRAMModel(LCD_DRAM_WH1601);
  lcd0.createChar(0,a1);lcd0.createChar(1,a2);lcd0.createChar(2,a3);
  lcd1.createChar(0,a1);lcd1.createChar(1,a2);lcd1.createChar(2,a3);
 // analogReference(INTERNAL);
  pinMode(A0,INPUT);// A0 - аналоговый вход
  pinMode(A1,INPUT);// A1 - аналоговый вход
}

void loop() {
  urr = log(analogRead(0))*GAIN;
  ull = log(analogRead(1))*GAIN;
 
  lcd0.setCursor(0,0);lcd0.print("R");
  lcd1.setCursor(0,0);lcd1.print("L");
  
   if(urr<ur){ur=ur-1;delay(STEP);}else{ur = urr;}
  for(z=0,z0=0,z1=0;z<=ur;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)0);lcd0.setCursor(z0+2,0);lcd0.print(" ");}}
   if(z1==3){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)1);}
   if(z1==2){lcd0.setCursor(z0+1,0);lcd0.write((uint8_t)2);}

   if(ull<ul){ul=ul-1;delay(STEP);}else{ul = ull;}
  for(z=0,z0=0,z1=0;z<=ul;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)0);lcd1.setCursor(z0+2,0);lcd1.print(" ");}}
   if(z1==3){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)1);}
   if(z1==2){lcd1.setCursor(z0+1,0);lcd1.write((uint8_t)2);}
   
  delay(1);
}

47

Re: VU метр

подключил 2002, все отлично, минимальные правки. так же попробовал на двух 1601, тоже все отлично
http://forum.rcl-radio.ru/uploads/images/2021/01/d70da1bece8be7949c3356742ad1a6cf.jpg

48

Re: VU метр

скетч скиньте может кому пригодится

49

Re: VU метр

в общем то это авторский скетч, самый первый в статье, без пикового индикатора, поправил только в одной строчке
lcd.begin(20, 2);

не получается вставить скетч в сообщение, что то не так делаю. извиняюсь.

50

Re: VU метр

ЗДРАВСТВУЙТЕ!!!Liman324 скажите можно ли совместить сxему   http://rcl-radio.ru/?p=76005   с этим анализатором сигнала как то добавить скетчь переделать ?   Xотелось бы два в одном