Az én VU mérőm így néz ki.
Örülnék ha más is megmutatná mit csinált.
Ahol megjegyzésben 16 szóközről van szó ott igazából annyi van a kódban csak a fórummotor megeszi a többletet.
Én most nem tettem semmit az analóg lábra, csak egy csipesszel odanyúltam. Ha hangot kötnénk rá biztos érdekesebb lenne.
Kicsit bénának érzem a VU csúcstartás megoldásomat, milyen jobb 5letetek van rá?
// VU mero
// Macsek 2012.08.15
// arduino
/////////
#include "LiquidCrystal.h" //LCD-re irjuk az eredmenyt
// beallithato parameterek
#define MEROLAB A1 // ezen az arduino porton merunk
#define LCD_RS 4
#define LCD_E 5
#define LCD_D4 6
#define LCD_D5 7
#define LCD_D6 8
#define LCD_D7 9
// konstansok
#define MAXHE 1023 // maximalis merheto hangero (10 biten 0..1023)
#define KARSZELESSEG 5 // ennyi oszlopbol all egy karakter
#define KIJELZOHOSSZ 16 // ennyi karakter fer egy sorba
#define FELBONTAS (KIJELZOHOSSZ*KARSZELESSEG) // 16 karakter * 5 oszlop
#define VU_TARTAS 5000 // ennyi millisecig tartjuk a max erteket
#define TELI_CHR 5 // inverz szokoz
#define CSIK_CHR_2 (TELI_CHR+1)
#define CSIK_CHR_3 '|'
#define CSIK_CHR_4 (TELI_CHR+2)
#define CSIK_CHR_5 0
unsigned int hangero=0;
unsigned int hangero_csucs=0;
unsigned long hangcsucs_ido;
byte torolni_kell = 0;
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
///////////////////////////////////////////////////////////////////////////////////////////////
void plot(byte y, byte x, byte uzemmod) // Y, X, uzemmod= 0:csak "pont" 1:teli vonal
{
char x_egesz;
char x_maradek;
char kiirando;
lcd.setCursor(0,y);
x_egesz = x / KARSZELESSEG;
x_maradek = x % KARSZELESSEG;
if(uzemmod != 0)
{
// meghuzzuk a vonalat
while(--x_egesz >=0)
lcd.write(TELI_CHR);
if(x_maradek > 0)
lcd.write(x_maradek);
lcd.write(' ');
}
else // futopont
{
switch(x_maradek)
{
case 0:
if(x_egesz > 0)
{
x_egesz--;
kiirando = CSIK_CHR_5;
}
else
// nincs is mit kiirni
kiirando = ' ';
break;
case 1:
// egyes vonal
kiirando = 1;
break;
case 2:
kiirando = CSIK_CHR_2;
break;
case 3:
kiirando = CSIK_CHR_3;
break;
case 4:
kiirando = CSIK_CHR_4;
break;
case 5:
kiirando = CSIK_CHR_5;
break;
}
if(x_egesz>0)
{
lcd.setCursor(x_egesz-1,y);
lcd.write(' ');
lcd.write(kiirando);
}
else
{
lcd.setCursor(x_egesz,y);
lcd.write(kiirando);
}
}
// 1234567890123456
lcd.print(" "); // gyors valtas miatt jobb letorolni, ne maradjon szemet
}
void char_oszlop_gen(byte karakterkod, byte sorertek) // definial egy sajat karaktert az LCDn
{
byte sorszam;
byte c[8];
c[7]=0; // a kozepso csik also pixele hianyzik, igy ez lesz az ipari szabvany
for(sorszam=0; sorszam<7; sorszam++) // karakter kepen belul az oszlop sorszama
c[sorszam] = sorertek;
lcd.createChar(karakterkod, c); // ELOBB kell karaktert definialni, csak utana johet a begin
}
void setup(void) /////////////////////////////////////////////////////////////////////////////////
{
byte karakterkod, sorszam;
// byte c[8];
byte hatvany2; // ketto az n-ediken
char uzemmod;
// Ugy tunik, hogy ezekre valamiért nincs is szukseg.
// pinMode(LCD_RS, OUTPUT);
// pinMode(LCD_E, OUTPUT);
// pinMode(LCD_D4, OUTPUT);
// pinMode(LCD_D5, OUTPUT);
// pinMode(LCD_D6, OUTPUT);
// pinMode(LCD_D7, OUTPUT);
// Nem sikerult hatvanyozni es amugy is sok memoriat zabalna, mert float
// igy hatvany2 lesz 2 aktualis hatvanya
hatvany2 = 16; // nem merem beleirni a forba, mert nem volt rola szo, h lehet
// ha KIJELZOHOSSZ nem 5 akkor feltehetoleg modositani kell hatvany2-t 2^(KIJELZOHOSSZ-1) -re
for(karakterkod=1; karakterkod<=KARSZELESSEG; karakterkod++) // ennyiedik karaktert babraljuk
{
// eloallitjuk a karaktert
char_oszlop_gen(karakterkod, 32 - hatvany2);
hatvany2 /= 2;
}
// meg mielott valaki kotozkodesre gondolna:
// Mar mukodott ezt is ciklussal, csak a fuggoleges vonal kiszedese bonyolult, igy konnyebben ertheto
char_oszlop_gen(CSIK_CHR_2, 8 );
char_oszlop_gen(CSIK_CHR_4, 2);
char_oszlop_gen(CSIK_CHR_5, 1);
lcd.begin(16,2);
// 1234567890123456
lcd.print("LCD kivezmero v1");
lcd.setCursor(0,1); // masodik sor
lcd.print("Macsek");
delay(500);
// csicsamicsa
#define DLY 100
for(uzemmod=1; uzemmod>=0; uzemmod--)
{
for(sorszam=0; sorszam<=FELBONTAS; sorszam++)
{
plot(1, sorszam, uzemmod); // Y, X, teli vonal/pont
delay (DLY);
}
for(sorszam=FELBONTAS; sorszam<255; sorszam--)
{
plot(1, sorszam, uzemmod); // Y, X, teli vonal/pont
delay (DLY);
}
}
}
void loop(void)
{
hangero = analogRead(MEROLAB);
hangero = hangero*FELBONTAS/MAXHE; // skalazzuk, max bemenet legyen teljes csik
plot(1, hangero, 1);
if(hangero>hangero_csucs)
{
hangero_csucs = hangero;
hangcsucs_ido = millis();
torolni_kell = 1;
}
if(hangcsucs_ido+VU_TARTAS>millis())
plot(0, hangero_csucs, 0);
else if( torolni_kell>0 )
{
lcd.setCursor(0,0);
// 1234567890123456
lcd.print(" "); // 16 db szokoz letorli azt a sort
torolni_kell = 0;
hangero_csucs = 0;
}
delay(1);
}