Hola a todos.
He leido este enlace y he intentado modificar el código para obtener en un LCD 20x4 en toda su pantalla el analizador sin exito.
El montaje usa un integrado filtrador de audio MSGEQ7, es cual en el código veo que lo han interpolado y de 7 bandas de filtro se expone en el LCD a 16, en el que pretendo lo he hecho funcionar a 20 columnas y esto no es problema.
El código original esta escrito para un LCD 16x2 el cual he usado uno por BUS I2C y funciona, pero solamente en estas dimensiones de 16x2 enlace código original,
Para el LCD uso la librería de Malpartida
Pictures;
He modificado ligeramente el código del primer enlace y obviamente no funciona. Este es;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x3f // <<----- Add your address here. Find it from I2C Scanner
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
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() {
lcd.begin(20, 4);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
// 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)
{ vumetro[j][7-i] = B11111;} // B01110
// { vumetro[j][i][h][7-z] = B11111;}
// { 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;}
// { vumetro[j][i][h][7-z] = 0;}
}
}
}
for (int i=0; i<=7;i++)
{
lcd.createChar(i, vumetro[i]);
}
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);
}
}
He visto por la red infinidad de vídeos he incluso usuarios que lograron hacer funcionar con este tipo de LCD (20x4) pero o bien ofrecen el HEX (el cual es diferente LCD, no dan información del conexionado, etc...) o bien simplemente no dan información del código fuente. Respeto totalmente la decisión faltaría mas.
He estado analizando el código de como componer las dos lineas (filas) para que lo represente a toda pantalla pero me he quedado estancado. Pido un poco de ayuda aunque sea alguna pista de como realizar que aumente una fila. si esto es posible, espero sus amables respuestas.
Un saludo