Saturday, January 18, 2020

ARDUINO UNO EXPERIMENT PROJECT STEREO VU METER



 hi there i have a video from my youtube channel about arduino uno experiment project stereo vu meter if you want the code i am giving to you.

you can modify or edit the code what ever you want heres the code following...





/*

* Simple 2-channel VU-meter with peak detect - by mira308sw - 2013

* a crazy sketch for 16x2 lcd display

*/



#include <LiquidCrystal.h>



/* Modify the pin number below to meet your board

*/

#define IN_LEFT    4  // analog input for left channel

#define IN_RIGHT   5  // analog input for right channel



LiquidCrystal lcd( 8,  // RS

                   9,  // E

                   4,  // DB4

                   5,  // DB5

                   6,  // DB6

                   7   // DB7

                   );



/* Other minor configurable value

*/

#define T_REFRESH    100            // msec bar refresh rate

#define T_PEAKHOLD   3*T_REFRESH    // msec peak hold time before return



/* local variable

*/

byte  fill[6]={ 0x20,0x00,0x01,0x02,0x03,0xFF };      // character used to fill (0=empty  5=full)

byte  peak[7]={ 0x20,0x00,0x04,0x05,0x06,0x07,0x20 }; // character used to peak indicator

int   lmax[2];                                        // level max memory

int   dly[2];                                         // delay & speed for peak return



void  bar  ( int row,int lev )

{

  lcd.setCursor( 0,row );

  lcd.write( row ? 'R' : 'L' );

  for( int i=1 ; i<16 ; i++ )

  {

    int f=constrain( lev      -i*5,0,5 );

    int p=constrain( lmax[row]-i*5,0,6 );

    if( f )

      lcd.write( fill[ f ] );

    else

      lcd.write( peak[ p ] );

  }

  if( lev>lmax[row] )

  {

    lmax[row] = lev;

    dly[row]  = -(T_PEAKHOLD)/T_REFRESH;                // Starting delay value. Negative=peak don't move

  }

  else

  {

    if( dly[row]>0 )

      lmax[row] -= dly[row];



    if( lmax[row]<0 )

      lmax[row]=0;

    else

      dly[row]++;

  }

}



byte block[8][8]=

{

  { 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 },  // define character for fill the bar

  { 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18 },

  { 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C },

  { 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E },



  { 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08 },  // define character for peak level

  { 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04 },

  { 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02 },

  { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 },

};



void  setup  ( void )

{

  lcd.begin( 16,2 );

  for( int i=0 ; i<8 ; i++ )

    lcd.createChar( i,block[i] );

}



long  lastT=0;



void  loop  ( void )

{

  if( millis()<lastT )

    return;

  lastT += T_REFRESH;   

  int anL = map( sqrt( analogRead( IN_LEFT  )*16 ),0,128,0,80 );  // sqrt to have non linear scale (better was log)

  int anR = map( sqrt( analogRead( IN_RIGHT )*16 ),0,128,0,80 );

  bar( 0,anL );

  bar( 1,anR );

}

 

No comments: