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
#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
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
_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?
#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
}
}