16x4 audio equalizator

Hi I've tried to programming a LCD display 16x4 with Arduino MEGA 2560 but i have a problem with the program I want to reproduce this project http://fritzing.org/projects/msgeq7-audio-equalizer The display used is a 16x2 but i want to use a 16x4 display I have tried to modify the project like this https://www.dropbox.com/s/om2e6vfzl73g8vl/vumeter.ino but i have this truble

vumeter.ino: In function 'void setup()': vumeter:44: error: no matching function for call to 'LiquidCrystal::createChar(int&, byte [8][8][8])' C:\Arduino\libraries\LiquidCrystal/LiquidCrystal.h:80: note: candidates are: void LiquidCrystal::createChar(uint8_t, uint8_t*) vumeter:71: error: a function-definition is not allowed here before '{' token vumeter:208: error: expected }' at end of input vumeter:208: error: expected}' at end of input

What can i solve it? Thansk for help

There used to be a library that allowed you to do just that, however I can't remember the name and I can't seem to find any library that fits the description. I think it was made by user SurferTim / Tim Eckel.

I remembered the name! LCDBitmap there is also a video on YouTube, just do a search.

I have not looked at your program. Why not post it or attach it here ?

However, the error message

vumeter:44: error: no matching function for call to 'LiquidCrystal::createChar(int&, byte [8][8][8])' C:\Arduino\libraries\LiquidCrystal/LiquidCrystal.h:80: note: candidates are: void LiquidCrystal::createChar(uint8_t, uint8_t*)

would seem to indicate that the createChar function is being called with the wrong number and type of parameters.

I have tried to modify the project like this https://www.dropbox.com/s/om2e6vfzl73g8vl/vumeter.ino but i have this truble

Who knows what you have done to this code, if you don't post it we can't tell.

This is the code’s program

#include <LiquidCrystal.h>

// The LCD is conected to pins 13,12,11,10,9,8

LiquidCrystal lcd(12, 11, 7, 6, 3, 2);

byte vumetro[8][8][8][8];

float vumetros[32];

// The analog pin 0 is used to read value.
int valor_analogico = 0; 
// The 6 & 7 pins are used for control the integrated.
int strobe = 4; 
int reset = 5; 
int valores_frecuencias[7]; 

void setup() {
  // Built the characters for bars.
  for (int j=0; j<=7; j++)  
  {
    for (int i=0; i<=7; i++)
    {
      for (int h=0; h<=7; h++)
      {
        for (int z=0; z<=7; z++)
        {
          if (i<=j)
          {  
            if (h<=i)
            { 
              if (z<=h)
              { vumetro[j][i][h][7-z] = B01110;}
            }
          }
//      { vumetro[j][7-i] = B01010;}  Uncomment this lines for getting other variants for bars.
//      { vumetro[j][7-i] = B11111;}      
      else
      { vumetro[j][i][h][7-z] = 0;}
    }
  }  
  for (int i=0; i<=28;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

  lcd.begin(16, 2);      
  for (int j=0; j<=7;j++)
  {
    lcd.setCursor(j, 0);
    lcd.write(j);
    lcd.setCursor(j, 1);
    lcd.write(j);
    lcd.setCursor(j, 2);
    lcd.write(j);
    lcd.setCursor(j, 3);
    lcd.write(7);    
    
  pinMode(valor_analogico, INPUT);
  pinMode(strobe, OUTPUT);
  pinMode(reset, OUTPUT);
  analogReference(DEFAULT);

  digitalWrite(reset, LOW);
  digitalWrite(strobe, HIGH);
    
  }  
 
}

void loop() {
  
  digitalWrite(reset, HIGH);
  digitalWrite(reset, LOW);

  // The read of integrated is done by multiplexing.
  for (int i = 0; i < 7; i++)
  {
    digitalWrite(strobe, LOW);
    delayMicroseconds(5); 
    valores_frecuencias[i] = analogRead(valor_analogico);
    digitalWrite(strobe, HIGH);
  }

// It's necesary to interpolate for calculating 16 bars having only 7 values read.
for (int k=0; k<=15; k++)
  {
  switch (k) 
  {
    case 0:
      vumetros[k]= valores_frecuencias[0]/64;
      break;
    
    case 1:
      vumetros[k]= (valores_frecuencias[0]/64 + valores_frecuencias[1]/64)/2;
      break;

    case 2:
      vumetros[k]= valores_frecuencias[1]/64;
      break;
   
    case 3:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64)/2;
      break;
 
    case 4:
      vumetros[k]= valores_frecuencias[2]/64;
      break;
    
    case 5:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64 + valores_frecuencias[3]/64)/3;
      break;
        
    case 6:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 7:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;
      

    case 8:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;

    case 9:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 10:
      vumetros[k]= (valores_frecuencias[3]/64 + valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/3;
      break;

    case 11:
      vumetros[k]= valores_frecuencias[4]/64;
      break;

    case 12:
      vumetros[k]= (valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/2;
      break;

    case 13:
      vumetros[k]= valores_frecuencias[5]/64;
      break;

    case 14:
      vumetros[k]= (valores_frecuencias[5]/64 + valores_frecuencias[6]/64)/2;
      break;

    case 15:
      vumetros[k]= valores_frecuencias[6]/64;
      break;
  }

  Dibuja_vumetro(k, vumetros[k]);
  delay(2);
  }
  
}

void Dibuja_vumetro(int posicion, int altura)
{
  if (altura>7)
  {
    if (altura>14)
    {
      if (altura>21)
      {
        lcd.setCursor(posicion, 3);
        lcd.write(7);
        lcd.setCursor(posicion, 2);
        lcd.write(7);
        lcd.setCursor(posicion, 1);
        lcd.write(7);
        lcd.setCursor(posicion, 0);
        lcd.write(altura-8);
      }
      lcd.setCursor(posicion, 3);
      lcd.write(7);
      lcd.setCursor(posicion, 2);
      lcd.write(7);
      lcd.setCursor(posicion, 1);
      lcd.write(altura-8);
      lcd.setCursor(posicion, 0);
      lcd.write(32);
   }
    lcd.setCursor(posicion, 3);
    lcd.write(7);  //tutto acceso
    lcd.setCursor(posicion, 2);
    lcd.write(altura-8);
    lcd.setCursor(posicion, 1);
    lcd.write(32);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
  else
  {
    lcd.setCursor(posicion, 3);
    lcd.write(altura);
    lcd.setCursor(posicion, 2);
    lcd.write(32);   //tutto spento
    lcd.setCursor(posicion, 1);
    lcd.write(32);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
}

The code will not even Auto Format (too many left curly braces) let alone compile

  for (int i=0; i<=28;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

Can you actually create 29 custom characters ?

I don’t understand what do you mean
I have fixed all the brace

The original program for 16x2 display is this

#include <LiquidCrystal.h>

// The LCD is conected to pins 13,12,11,10,9,8

LiquidCrystal lcd(12, 11, 7, 6, 3, 2);

byte vumetro[8][8];

float vumetros[16];

// The analog pin 0 is used to read value.
int valor_analogico = 0; 
// The 6 & 7 pins are used for control the integrated.
int strobe = 4; 
int reset = 5; 
int valores_frecuencias[7]; 

void setup() {
  // Built the characters for bars.
  for (int j=0; j<=7; j++)  
  {
    for (int i=0; i<=7; i++)
    {
      if (i<=j)
      { vumetro[j][7-i] = B01110;}
//      { vumetro[j][7-i] = B01010;}  Uncomment this lines for getting other variants for bars.
//      { vumetro[j][7-i] = B11111;}      
      else
      { vumetro[j][7-i] = 0;}
    }
  }  
  for (int i=0; i<=7;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

  lcd.begin(16, 2);      
  for (int j=0; j<=7;j++)
  {
    lcd.setCursor(j, 0);
    lcd.write(j);
    lcd.setCursor(j, 1);
    lcd.write(7);    
    
  pinMode(valor_analogico, INPUT);
  pinMode(strobe, OUTPUT);
  pinMode(reset, OUTPUT);
  analogReference(DEFAULT);

  digitalWrite(reset, LOW);
  digitalWrite(strobe, HIGH);
    
  }  
 
}

void loop() {
  
  digitalWrite(reset, HIGH);
  digitalWrite(reset, LOW);

  // The read of integrated is done by multiplexing.
  for (int i = 0; i < 7; i++)
  {
    digitalWrite(strobe, LOW);
    delayMicroseconds(5); 
    valores_frecuencias[i] = analogRead(valor_analogico);
    digitalWrite(strobe, HIGH);
  }

// It's necesary to interpolate for calculating 16 bars having only 7 values read.
for (int k=0; k<=15; k++)
  {
  switch (k) 
  {
    case 0:
      vumetros[k]= valores_frecuencias[0]/64;
      break;
    
    case 1:
      vumetros[k]= (valores_frecuencias[0]/64 + valores_frecuencias[1]/64)/2;
      break;

    case 2:
      vumetros[k]= valores_frecuencias[1]/64;
      break;
   
    case 3:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64)/2;
      break;
 
    case 4:
      vumetros[k]= valores_frecuencias[2]/64;
      break;
    
    case 5:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64 + valores_frecuencias[3]/64)/3;
      break;
        
    case 6:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 7:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;
      

    case 8:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;

    case 9:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 10:
      vumetros[k]= (valores_frecuencias[3]/64 + valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/3;
      break;

    case 11:
      vumetros[k]= valores_frecuencias[4]/64;
      break;

    case 12:
      vumetros[k]= (valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/2;
      break;

    case 13:
      vumetros[k]= valores_frecuencias[5]/64;
      break;

    case 14:
      vumetros[k]= (valores_frecuencias[5]/64 + valores_frecuencias[6]/64)/2;
      break;

    case 15:
      vumetros[k]= valores_frecuencias[6]/64;
      break;
  }

  Dibuja_vumetro(k, vumetros[k]);
  delay(2);
  }
  
}

void Dibuja_vumetro(int posicion, int altura)
{
  if (altura>7)
  {
    lcd.setCursor(posicion, 1);
    lcd.write(7);
    lcd.setCursor(posicion, 0);
    lcd.write(altura-8);    
  }
  else
  {
    lcd.setCursor(posicion, 1);
    lcd.write(altura);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
}

I have try to modify as you have seen but there is always this error

Original program

  for (int i=0; i<=7;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

Your program

  for (int i=0; i<=28;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

Spot the difference.

Thanks I try to modify The last part of the program, where there is the function to command the vumeter on the display is It right?

Changing the program i have this error

sketch_jan30a.ino: In function 'void setup()': sketch_jan30a:44: error: no matching function for call to 'LiquidCrystal::createChar(int&, byte [8][8][8])' C:\Program Files (x86)\Arduino\libraries\LiquidCrystal/LiquidCrystal.h:80: note: candidates are: void LiquidCrystal::createChar(uint8_t, uint8_t*) sketch_jan30a:71: error: a function-definition is not allowed here before '{' token sketch_jan30a:208: error: expected }' at end of input sketch_jan30a:208: error: expected}' at end of input

Are you going to share the changed program with us ?

#include <LiquidCrystal.h>

// The LCD is conected to pins 13,12,11,10,9,8

LiquidCrystal lcd(12, 11, 7, 6, 3, 2);

byte vumetro[8][8][8][8];

float vumetros[32];

// The analog pin 0 is used to read value.
int valor_analogico = 0; 
// The 6 & 7 pins are used for control the integrated.
int strobe = 4; 
int reset = 5; 
int valores_frecuencias[7]; 

void setup() {
  // Built the characters for bars.
  for (int j=0; j<=7; j++)  
  {
    for (int i=0; i<=7; i++)
    {
      for (int h=0; h<=7; h++)
      {
        for (int z=0; z<=7; z++)
        {
          if (i<=j)
          {  
            if (h<=i)
            { 
              if (z<=h)
              { vumetro[j][i][h][7-z] = B01110;}
            }
          }
//      { vumetro[j][7-i] = B01010;}  Uncomment this lines for getting other variants for bars.
//      { vumetro[j][7-i] = B11111;}      
      else
      { vumetro[j][i][h][7-z] = 0;}
    }
  }  
  for (int i=0; i<=7;i++)
  {
    lcd.createChar(i, vumetro[i]);
  }

  lcd.begin(16, 2);      
  for (int j=0; j<=7;j++)
  {
    lcd.setCursor(j, 0);
    lcd.write(j);
    lcd.setCursor(j, 1);
    lcd.write(j);
    lcd.setCursor(j, 2);
    lcd.write(j);
    lcd.setCursor(j, 3);
    lcd.write(7);    
    
  pinMode(valor_analogico, INPUT);
  pinMode(strobe, OUTPUT);
  pinMode(reset, OUTPUT);
  analogReference(DEFAULT);

  digitalWrite(reset, LOW);
  digitalWrite(strobe, HIGH);
    
  }  
 
}

void loop() {
  
  digitalWrite(reset, HIGH);
  digitalWrite(reset, LOW);

  // The read of integrated is done by multiplexing.
  for (int i = 0; i < 7; i++)
  {
    digitalWrite(strobe, LOW);
    delayMicroseconds(5); 
    valores_frecuencias[i] = analogRead(valor_analogico);
    digitalWrite(strobe, HIGH);
  }

// It's necesary to interpolate for calculating 16 bars having only 7 values read.
for (int k=0; k<=15; k++)
  {
  switch (k) 
  {
    case 0:
      vumetros[k]= valores_frecuencias[0]/64;
      break;
    
    case 1:
      vumetros[k]= (valores_frecuencias[0]/64 + valores_frecuencias[1]/64)/2;
      break;

    case 2:
      vumetros[k]= valores_frecuencias[1]/64;
      break;
   
    case 3:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64)/2;
      break;
 
    case 4:
      vumetros[k]= valores_frecuencias[2]/64;
      break;
    
    case 5:
      vumetros[k]= (valores_frecuencias[1]/64 + valores_frecuencias[2]/64 + valores_frecuencias[3]/64)/3;
      break;
        
    case 6:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 7:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;
      

    case 8:
      vumetros[k]= random(2)+valores_frecuencias[3]/64;
      break;

    case 9:
      vumetros[k]= (valores_frecuencias[2]/64 + valores_frecuencias[3]/64 + valores_frecuencias[4]/64)/3;
      break;

    case 10:
      vumetros[k]= (valores_frecuencias[3]/64 + valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/3;
      break;

    case 11:
      vumetros[k]= valores_frecuencias[4]/64;
      break;

    case 12:
      vumetros[k]= (valores_frecuencias[4]/64 + valores_frecuencias[5]/64)/2;
      break;

    case 13:
      vumetros[k]= valores_frecuencias[5]/64;
      break;

    case 14:
      vumetros[k]= (valores_frecuencias[5]/64 + valores_frecuencias[6]/64)/2;
      break;

    case 15:
      vumetros[k]= valores_frecuencias[6]/64;
      break;
  }

  Dibuja_vumetro(k, vumetros[k]);
  delay(2);
  }
  
}

void Dibuja_vumetro(int posicion, int altura)
{
  if (altura>7)
  {
    if (altura>14)
    {
      if (altura>21)
      {
        lcd.setCursor(posicion, 3);
        lcd.write(7);
        lcd.setCursor(posicion, 2);
        lcd.write(7);
        lcd.setCursor(posicion, 1);
        lcd.write(7);
        lcd.setCursor(posicion, 0);
        lcd.write(altura-8);
      }
      lcd.setCursor(posicion, 3);
      lcd.write(7);
      lcd.setCursor(posicion, 2);
      lcd.write(7);
      lcd.setCursor(posicion, 1);
      lcd.write(altura-8);
      lcd.setCursor(posicion, 0);
      lcd.write(32);
   }
    lcd.setCursor(posicion, 3);
    lcd.write(7);  //tutto acceso
    lcd.setCursor(posicion, 2);
    lcd.write(altura-8);
    lcd.setCursor(posicion, 1);
    lcd.write(32);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
  else
  {
    lcd.setCursor(posicion, 3);
    lcd.write(altura);
    lcd.setCursor(posicion, 2);
    lcd.write(32);   //tutto spento
    lcd.setCursor(posicion, 1);
    lcd.write(32);
    lcd.setCursor(posicion, 0);
    lcd.write(32);    
  }
}

nobody can help me?