W niniejszym artykule opracowano metronom muzyczny oparty na ekranie Stone-STVC070WT. Ten schemat wykorzystuje ekran HMI Stone-STVC070WT jako platformę sterowania wyświetlaczem i płytkę Arduino jako terminal wyjściowy audio beat, aby stworzyć prosty i łatwy w użyciu metronom muzyczny.
Realizacja funkcji
1. Interfejs funkcjonalny Metronome UI, zapewniający funkcję dotykową;
2. Funkcja ustawiania częstotliwości, która może być regulowana od 40 do 120 razy/min z interwałem 10 poprzez dotknięcie przycisku;
3. Funkcja ustawiania beatu. Dotykając przycisku, 1/4, 2/4, 3/4 i 4/4 bity mogą być ustawione przez zawieszenie;
4. Funkcja kontroli odtwarzania, rozpoczęcie lub zatrzymanie wykonywania beatu;
5. Płyta Arduino napędza brzęczyk, aby zrealizować dźwięk bicia;
6. Komunikacja szeregowa realizuje wymianę informacji pomiędzy ekranem a Arduino.

Projekt oprogramowania terminala wykonawczego back-end
(1) Ton, który napędza brzęczyk do wytworzenia rytmu
Arduino posiada wbudowaną funkcję o nazwie tone( ), która jako parametry wejściowe przyjmuje piny sterownika oraz częstotliwość. Im wyższa częstotliwość, tym wyższy ton, a zasada działania to PWM.
Kod: Zaznacz cały
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
int pinBuzzer = 3; // Pin D3 is connected to the signal pin of the buzzer module
void setup()
{
PinMode (pinBuzzer, the OUTPUT);// Set the Pinbuzzer foot to output
}
void Beep(long fre,unsigned int on,unsigned int off)
{
Long frequency = MAC;// Frequency, in Hz
// Use the tone() function to emit the waveform with frequency
Tone (pinBuzzer, frequency);
Delay (on);// Wait 1000 milliseconds
NoTone (pinBuzzer);// Stop vocalizing
Delay (off);// Wait for 2000 milliseconds
}
(2) Ustaw prędkość bicia
W rzeczywistości bardzo łatwo jest obliczyć tempo Speed, głównie dlatego, że Speed jest ustawioną wartością, a metoda rytmu to głównie 1/4, 2/4, 3/4, 4/4, czyli ostatnie uderzenie każdego taktu przy wzmocnionej muzyce (600Hz) jest OK;
Na przykład, jeśli prędkość wynosi 120, a rytm jest 3/4, to czas trwania każdego taktu (włączając buczenie i ciszę) wynosi 60S ÷120=0,5s, a w każdej sekcji są 4 takty. Pierwsze 2 uderzenia to 300Hz pianissimo, a trzecie to 600Hz forte.
Kolejność tonów jest następująca:
Beep (300250250);
Bip (300250250);
Beep (600250250);
Funkcja jest ponownie enkapsulowana do użycia w kolejnych wydajnych Ustawieniach.
Kod: Zaznacz cały
void metronome(unsigned char metr,unsigned char speed)
{
unsigned char i;
Unsigned int on = 250;
Unsigned int off = 60000 / speed - 250;
for(i=0;i
{
Beep(300,on,off);
}
Beep(600,on,off);
}
Zainicjuj port szeregowy funkcją Serial. Begin function, napisz port szeregowy jak funkcja odbiornika przerwania i funkcja parse, i zadeklaruj bufor odbiorczy portu szeregowego char Uart_RX_Buf[9];
Kod: Zaznacz cały
Serial.begin(115200);
void serialEvent()
{
If (Serial. The available () & gt;0)
{
char tmp = Serial.read();
//- Determined if a data packet is being received
if(Uart_Packet_IN)
{
Uart_RX_Buf[Uart_Current_Order++] = tmp;
< / span > < span > < span >The set length of the packet
if(Uart_Current_Order == 9)
{
// Check if the end-of-&& checksum is correct
Uart_Packet_Flag = 1;// A valid packet is received
Uart_Packet_IN = 0;//-- No longer in the receiving packet state
Uart_Current_Order = 0;// reset the number
}
//- Check if it is a data header
else if(tmp==Uart_Packet_Header)
{
Uart_Packet_IN = 1;
Uart_RX_Buf [0] = TMP;
Uart_Current_Order + +;
}
}
Kod: Zaznacz cały
void process(void)
{
Uart0_Packet_Flag = 0;
The switch (Uart0_RX_Buf [5])
{
//-- Determinate whether it is speed or tempo
Case 0 x06:
{
Speed = Uart0_RX_Buf [8];
break;
}
//-- Determinate whether it is speed or tempo
Case 0 x07:
{
Metr = Uart0_RX_Buf [8];
break;
}
Default: break;
}
