From 1622a6b71a276e58c9ff19cc9bd7ae876faa4914 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Mon, 15 Oct 2018 11:01:49 +0800 Subject: [PATCH] update beep code, add play little star support --- modules/c/led.c | 15 +++-- modules/c/beep.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 154 insertions(+), 12 deletions(-) diff --git a/modules/c/beep.c b/modules/c/beep.c index 4108b1f..b26011c 100644 --- a/modules/c/beep.c +++ b/modules/c/beep.c @@ -32,9 +32,32 @@ //#define CONFIG_ACTV_BEEP +/* Only passive buzzer can play tone */ +#ifndef CONFIG_ACTV_BEEP +#define CONFIG_PLAY_LITTLE_STAR +//#define CONFIG_PLAY_TONE_TEST +#endif + +void play_tone_freq(void); +void play_little_star(void); + int main(int argc, char *argv[]) { wiringPiSetup(); + +#ifdef CONFIG_PLAY_LITTLE_STAR + while(1) + { + play_little_star(); + sleep(3); + } +#elif (defined CONFIG_PLAY_TONE_TEST) + while(1) + { + play_tone_freq(); + sleep(3); + } +#else while(1) { @@ -52,20 +75,20 @@ #endif sleep(1); } +#endif + return 0; } + +/*+-----------------------------+ + *| Turn buzzer on or off API | + *+-----------------------------+*/ int turn_passive_beep(int cmd, int freq) { int range; - - if(freq<2000 || freq>2500) - { - printf("Beep set invalid PWM frequency!\n"); - return -1; - } if(OFF == cmd) { @@ -74,6 +97,13 @@ } else { + + if(freq<2000 || freq>5000) + { + printf("Beep set invalid PWM frequency[%d]!\n", freq); + return -1; + } + /* Set GPIO as PWM output mode */ pinMode(PWM_PIN, PWM_OUTPUT) ; @@ -91,6 +121,7 @@ pwmWrite(PWM_PIN, range/2); } } + /* Turn ON/OFF buzzer, Active Buzzer can not set frequency */ int turn_active_beep(int cmd) @@ -116,3 +147,111 @@ } +/*+---------------------------------+ + *| Play Tone OD,RE,MI....XI,DO1 | + *+---------------------------------+*/ + +enum +{ + UNUSED=0, + DO, + RE, + MI, + FA, + SO, + LA, + XI, + DO1, + RI1, + TONE_MAX, +}; + +#define msleep(x) usleep( 1000*(x) ) + +static int tone_freq[TONE_MAX]={0, 2093, 2349, 2637, 2794, 3136, 3520, 3952, 4186, 4698 }; +//static int tone_freq[TONE_MAX]={0, 2000, 2130, 2250, 2360, 2450, 2530, 2620, 2700, 2780}; + +static inline void play_tone(int tone, int delay) +{ + if(tone<DO || tone>RI1) + return ; + + turn_passive_beep(ON, tone_freq[tone]); + msleep(delay); + turn_passive_beep(OFF, 0); +} + +void play_tone_freq(void) +{ + int i; + + for(i=DO; i<TONE_MAX; i++) + { + play_tone( i, 500 ); + msleep(500); + } +} + + +/*+------------------------------+ + *| Play song "Little Start" | + *+------------------------------+*/ + +typedef struct tone_s +{ + int tone; + int delay_ms; + +} tone_t; + +#define DEF_DELAY 350 +static tone_t little_start_notation[]= +{ + {DO, DEF_DELAY}, + {DO, DEF_DELAY}, + {SO, DEF_DELAY}, + {SO, DEF_DELAY}, + {LA, DEF_DELAY}, + {LA, DEF_DELAY}, + {SO, DEF_DELAY*2}, + + {FA, DEF_DELAY}, + {FA, DEF_DELAY}, + {MI, DEF_DELAY}, + {MI, DEF_DELAY}, + {RE, DEF_DELAY}, + {RE, DEF_DELAY}, + {DO, DEF_DELAY*2}, + + + {SO, DEF_DELAY}, + {SO, DEF_DELAY}, + {FA, DEF_DELAY}, + {FA, DEF_DELAY}, + {MI, DEF_DELAY}, + {MI, DEF_DELAY}, + {RE, DEF_DELAY*2}, + + + {SO, DEF_DELAY}, + {SO, DEF_DELAY}, + {FA, DEF_DELAY}, + {FA, DEF_DELAY}, + {MI, DEF_DELAY}, + {MI, DEF_DELAY}, + {RE, DEF_DELAY*2}, +}; + +#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) +void play_little_star(void) +{ + int i; + + for(i=0; i<ARRAY_SIZE(little_start_notation); i++) + { + play_tone(little_start_notation[i].tone, little_start_notation[i].delay_ms); + msleep(30); + } +} + + diff --git a/modules/c/led.c b/modules/c/led.c index 8007bcd..514dd85 100644 --- a/modules/c/led.c +++ b/modules/c/led.c @@ -31,6 +31,9 @@ #include <wiringPi.h> #include "led.h" +#define msleep(x) usleep( 1000*(x) ) + +#define DELAY 500 int main(int argc, char *argv[]) { @@ -39,19 +42,19 @@ while(1) { turn_led(LED_R, ON); - sleep(1); + msleep(DELAY); turn_led(LED_R, OFF); - sleep(1); + msleep(DELAY); turn_led(LED_G, ON); - sleep(1); + msleep(DELAY); turn_led(LED_G, OFF); - sleep(1); + msleep(DELAY); turn_led(LED_B, ON); - sleep(1); + msleep(DELAY); turn_led(LED_B, OFF); - sleep(1); + msleep(DELAY); } return 0; -- Gitblit v1.9.1