Hur man skapar en öl flaska LED VU-Meter (13 / 17 steg)
Steg 13: Att göra en 10 steg Animation
Först måste vi räkna ut vad lysdioder vi vill på och vad lysdioderna vill bort vid varje steg. Om jag ska göra ett enkelt stapeldiagram vill jag LED7, LED8 och LED9 att sätta på när ljudet är på nivå 1 (den understa raden i blå lysdioder). När ljudet är på nivå 2 jag vill LED7, LED8, LED9, LED12, stänga LED13 och LED14 du slår på medan alla övriga av (de två nedersta raderna av blå lysdioder). Så vidare så vidare, ända tills vi får den 10: e ljudnivån där vi kommer att vill att alla de blå lysdioderna på. Så är här den funktion som vi kommer att använda:
void Bar_Graph(void)
{
UInt16 nivå.
Level = (0xF0 & (uint16) PORTD) << 2. Lagra den övre Mumsa av PORTD i "nivå" från bit #9 - bit #6
nivå | = ((0xFC & PORTB) >> 2); Mask av RB0 och RB1, bitars SKIFT data rätt två platser och lagra RB2 - RB7 i "nivå"
Switch (nivå)
{
fall 0x03FF: SPI_Send_595(0x000000C0); bryta; Ljud nivå 0
fall 0x03DF: SPI_Send_595(0xE00000C0); bryta; Ljud nivå 1
fall 0x03CF: SPI_Send_595(0xFC0000C0); bryta; Ljud nivå 2
fall 0x03C7: SPI_Send_595(0xFF8000C0); bryta; Ljud nivå 3
fall 0x03C3: SPI_Send_595(0xFFF000C0); bryta; Ljud nivå 4
fall 0x03C1: SPI_Send_595(0xFFFE00C0); bryta; Ljud nivå 5
fall 0x03C0: SPI_Send_595(0xFFFFC0C0); bryta; Ljud nivå 6
fall 0x01C0: SPI_Send_595(0xFFFFF8C0); bryta; Ljud nivå 7
fall 0x00C0: SPI_Send_595(0xFFFFFFC0); bryta; Ljud nivå 8
fall 0x0040: SPI_Send_595(0xFFFFFFCC); bryta; Ljud nivå 9
fall 0x0000: SPI_Send_595(0xFFFFFFCF); bryta; Ljud nivå 10
}
}
** Inte oroa lite #7 och bit #6 som gör 0xC0 rätt ännu, dess förklaras under nästa stycke
Du kan se att på ljud nivå 0 jag inte förvandla någon lysdioder, så det sänder ut 0x000000C0. På ljudnivå 1 sända jag 0xE00000C0 som kommer att slå på LED7, LED8 och LED9. På ljudnivå 2 skickar jag ut 0xFC0000C0 som kommer att slå på LED7, LED8, LED9, LED10, LED11 och LED12. Och så vidare. Dess ganska enkelt, du bara räkna ut som lysdioder du vill aktiveras eller inaktiveras och oavsett nivå av ljud, då bara sätta den i en switch-sats.
Nu minns du tillbaka i steg #8 när jag berättat att vi ignorera dessa 4 övre databitar som skickas till IC4? Ja nu vi faktiskt kommer att använda 2 av dessa oanvända bitar när vi passerar vår 32-bitars värde till SPI_Send_74HC595(*data*). Du kanske har märkt i schematiskt att vi ska kunna kontrollera alla gröna lysdioderna som helhet och alla gula lamporna hela tack vare de 2 x IRL510 MOSFETs i kretsen. Om du vill aktivera alla gröna lysdioderna vi helt enkelt skriva en 1 (+ 5v) till RC2 och aktivera alla gula lamporna vi skriver en 1 till RC1. Detta visar på IRL510 så att nuvarande flöda genom dem, således belysning lampor.
För att vända flaskan och citron på, när du skickar dina data genom funktionen SPI_Send_595(*data*) måste du göra bit #6 och lite #7 hög. Lite #6 styr flaskan och bit #7 citron. I SPI_Send_595 funktion jag mask av bit #6 och #7-bitars och ange utdata från RC1 och RC2 beroende på vilket av dessa bitar. IRL510 kontrolleras inte av SKIFT register, får inte så förvirrad. Jag bara använda bit #6 och #7-bitars programvara, aldrig få överförs de till 74HC595. Som ni kan se få de maskerade bort när vi skickar ut byte #4.
#define citron PORTCbits.RC2
#define flaska PORTCbits.RC1
void SPI_Send_595(uint32 data)
{
CITRON = (data >> 7) & 0x00000001; Aktivera citron om bit #7 är hög och stänga av om bit #7 är låg
FLASKA = (data >> 6) & 0x00000001; Aktivera flaskan om bit #6 är hög och vända bort den bit #6 är låg
SPI_Send (data >> 24); Shift ut byte #1 första (IC1)
SPI_Send ((data >> 16) & 0x000000FF); Shift ut byte #2 nästa (IC2)
SPI_Send ((data >> 8) & 0x000000FF); Shift ut byte #3 nästa (IC3)
SPI_Send (data & 0x0000000F); Shift ut byte #4 sista (IC4)
LAT_595 = 1; Spärren data på resultaten av 74HC595
NOP();
LAT_595 = 0; Återställa spärren till dess standardtillstånd
}
Du kan också hända att både RC1 och RC2 är PWM utgångar på PIC18F4550. De har placerats där ifall någon skulle vilja styra ljusstyrkan på flaskan eller citron. Jag tror det skulle vara ganska coolt att använda stapeldiagrammet för en LED animation och för varje nivå av ljud har en annan ljusstyrka av ljus från de gula lysdioderna. På så sätt citron vill också gå i takt med musiken med de blå lysdioderna.
Jag stötte på problem när jag designade den första versionen av PCB och jag kan inte styra LED flaskan och citron separat. Jag hittade inte mitt fel tills jag hade redan skapat och monterade PCB. Inga bekymmer för dig men jag fixade det misstaget i PCB-filer när jag hittade den, så om du använder min design för att göra denna VU-Meter kommer du att kunna styra flaskan och citron.
Så småningom fick jag trött på att räkna ut värden för specifika lysdioder som jag ville aktivera så jag vispade ihop ett litet program som kommer att göra allt för oss. Allt vi behöver göra är att ta att data hex värde och lägga den i SPI_Send_595 (* Data här *) och det kommer att lysa upp varje LED som det visar på programmet. Den kan hämtas i zip-filen i steg #4. Såvitt jag är orolig är detta program en livräddare.