Pages: [1]   Go Down
Author Topic: frequency spectrum msgeq7 and LCD display 16x4  (Read 94 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I am creating a program that through the reading of the frequency from a MSGEQ7 by dell'arduino, it displays the frequency spectrum in a display LCS 16X2
The program works perfectly on 16x2 but now I want it to go on 16x4 just that I've encountered some problems
This is the program of 16x2

Code:
#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 edited the part of the creation of the characters for the bars that you see written in the program this

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

But i have this error

Quote


_16X4DSP.ino: In function 'void setup()':
_16X4DSP:36: error: no matching function for call to 'LiquidCrystal::createChar(int&, byte [8][8])'
C:\Documents and Settings\rossi\Desktop\arduino-1.0.5\libraries\LiquidCrystal/LiquidCrystal.h:80: note: candidates are: void LiquidCrystal::createChar(uint8_t, uint8_t*)
_16X4DSP:64: error: a function-definition is not allowed here before '{' token
_16X4DSP:190: error: expected `}' at end of input

Complete program that I tried to change to the 16x4 is this, how can I make it work?

Code:
#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];

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 valore_frequenza[7];

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

  lcd.begin(16, 4);      
  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);
    valore_frequenza[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]= valore_frequenza[0]/64;
      break;
    
    case 1:
      vumetros[k]= (valore_frequenza[0]/64 + valore_frequenza[1]/64)/2;
      break;

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

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

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

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

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

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

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

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

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

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

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

void funzione_vumetro(int posizione, int altezza)
{
  
    if (altezza>14)
    {
      lcd.setCursor(posizione, 3);
      lcd.write(7); //tutto acceso
      lcd.setCursor(posizione, 2);
      lcd.write(7);
      lcd.setCursor(posizione, 1);
      lcd.write(altezza-8);    //tutto spento
  
    }
  
    if (altezza>7)
    {
      lcd.setCursor(posizione, 3);
      lcd.write(7);
      lcd.setCursor(posizione, 2);
      lcd.write(altezza-8);
      lcd.setCursor(posizione, 1);
      lcd.write(32);    //tutto spento

    }
  
    else
    {
      lcd.setCursor(posizione, 3);
      lcd.write(altezza);
      lcd.setCursor(posizione, 2);
      lcd.write(32);    //tutto spento
      lcd.setCursor(posizione, 1);
      lcd.write(32);    //tutto spento
    }
        
}
Logged

Pages: [1]   Go Up
Jump to: