RDA5807M FM RDS radio using the Gecko Segment LCD display. PC serial is used to display the RDS text on a pc terminal program if required (115200 baud). The two press buttons to tune up or down, touch slider to change volume. Top numeric displays frequency, bottom alpha displays station name. Ring segment displays signal level, antenna segment indicates stereo received.

Dependencies:   EFM32_CapSenseSlider EFM32_SegmentLCD RDA5807M mbed-src

Committer:
star297
Date:
Sat May 23 14:48:15 2015 +0000
Revision:
2:893e9004c547
Parent:
0:b0927d62ef70
Child:
3:1220287bcbd7
V1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
star297 2:893e9004c547 1 /*
star297 2:893e9004c547 2 RDA5807M FM RDS Radio using the EFM32 Gecko Segment LCD
star297 2:893e9004c547 3 RDS information is displayed using a PC terminal
star297 2:893e9004c547 4
star297 2:893e9004c547 5 Use:
star297 2:893e9004c547 6 switches PB0 and PB1 for frequency search
star297 2:893e9004c547 7 Volume controlled by the Touch Slider
star297 2:893e9004c547 8 Indicators:
star297 2:893e9004c547 9 Signal level - Ring Segement Display
star297 2:893e9004c547 10 Stereo received - Antenna Segment Display
star297 2:893e9004c547 11 RDS available - LED0
star297 2:893e9004c547 12 */
star297 2:893e9004c547 13
stevew817 0:b0927d62ef70 14 #include "mbed.h"
star297 2:893e9004c547 15 #include "RDA5807M.h"
star297 2:893e9004c547 16 #include "EFM32_SegmentLCD.h"
star297 2:893e9004c547 17 #include "EFM32_CapSenseSlider.h"
star297 2:893e9004c547 18
star297 2:893e9004c547 19
star297 2:893e9004c547 20 RDA5807M radio(PC4, PC5); // sda - scl
star297 2:893e9004c547 21
star297 2:893e9004c547 22 Serial pc(USBTX, USBRX);
star297 2:893e9004c547 23
star297 2:893e9004c547 24 InterruptIn scan_up(SW1);
star297 2:893e9004c547 25 InterruptIn scan_down(SW0);
star297 2:893e9004c547 26
star297 2:893e9004c547 27 DigitalOut led1(LED1);
star297 2:893e9004c547 28 DigitalOut led0(LED0);
star297 2:893e9004c547 29
star297 2:893e9004c547 30 silabs::EFM32_SegmentLCD segmentDisplay;
star297 2:893e9004c547 31 silabs::EFM32_CapSenseSlider capSlider;
star297 2:893e9004c547 32
star297 2:893e9004c547 33 Timer t1;
stevew817 0:b0927d62ef70 34
star297 2:893e9004c547 35 int n,i,l,signal,lastsignal,volume,lastrds,laststereo,rdstextgood;
star297 2:893e9004c547 36 float lastfreq;
star297 2:893e9004c547 37 char Station[10],lastStationName[10],vol[4];
star297 2:893e9004c547 38 char RDStxt[70],RDStxt1[70],RDStxt2[70],text1[50],lasttext1[50],text2[50],lasttext2[50];
star297 2:893e9004c547 39
star297 2:893e9004c547 40 void displayrefresh(),getrds();
star297 2:893e9004c547 41
star297 2:893e9004c547 42 void scan_upIRQ() {
star297 2:893e9004c547 43 radio.SeekUp();
star297 2:893e9004c547 44 }
star297 2:893e9004c547 45
star297 2:893e9004c547 46 void scan_downIRQ() {
star297 2:893e9004c547 47 radio.SeekDown();
star297 2:893e9004c547 48 }
stevew817 0:b0927d62ef70 49
star297 2:893e9004c547 50 void slideCallback(void) {
star297 2:893e9004c547 51 volume = capSlider.get_position()/3;
star297 2:893e9004c547 52 if(volume > 15){volume = 15;}
star297 2:893e9004c547 53 if(volume < 0){volume = 0;}
star297 2:893e9004c547 54 radio.Volume(volume);
star297 2:893e9004c547 55 sprintf(vol,"Vol %d", volume);
star297 2:893e9004c547 56 segmentDisplay.Write(vol);
star297 2:893e9004c547 57 t1.reset();t1.start();
star297 2:893e9004c547 58 }
star297 2:893e9004c547 59
star297 2:893e9004c547 60 int main() {
star297 2:893e9004c547 61
star297 2:893e9004c547 62 radio.Reset(); // reset and power up radio chip
star297 2:893e9004c547 63 segmentDisplay.Write("RdA5807");
star297 2:893e9004c547 64 wait(1);
star297 2:893e9004c547 65 segmentDisplay.Write("RDS FM");
star297 2:893e9004c547 66 wait(1);
star297 2:893e9004c547 67 segmentDisplay.Write("Radio");
star297 2:893e9004c547 68 capSlider.start();
star297 2:893e9004c547 69 capSlider.attach_slide(-1, slideCallback);
star297 2:893e9004c547 70 scan_up.fall(scan_upIRQ);
star297 2:893e9004c547 71 scan_down.rise(scan_downIRQ);
star297 2:893e9004c547 72 wait(1);
star297 2:893e9004c547 73
star297 2:893e9004c547 74 while(1){
star297 2:893e9004c547 75 radio.processData();
star297 2:893e9004c547 76 displayrefresh();
star297 2:893e9004c547 77 getrds();
star297 2:893e9004c547 78 wait_ms(50);
star297 2:893e9004c547 79 if(t1.read()>3){strcpy(lastStationName," ");t1.stop();}
star297 2:893e9004c547 80 }
stevew817 0:b0927d62ef70 81 }
star297 2:893e9004c547 82
star297 2:893e9004c547 83 void displayrefresh()
star297 2:893e9004c547 84 {
star297 2:893e9004c547 85 if (strcmp(lastStationName, radio.StationName) != 0){
star297 2:893e9004c547 86 if(strlen(radio.StationName)<9){
star297 2:893e9004c547 87 n=0;for(i=0;i<(8);i++){ // remove non-printable ASCCi error characters
star297 2:893e9004c547 88 if(radio.StationName[i] > 31){
star297 2:893e9004c547 89 Station[n] = radio.StationName[i];
star297 2:893e9004c547 90 n++;
star297 2:893e9004c547 91 }
star297 2:893e9004c547 92 }
star297 2:893e9004c547 93 segmentDisplay.Write(Station);
star297 2:893e9004c547 94 strcpy(lastStationName,radio.StationName);
star297 2:893e9004c547 95 }
star297 2:893e9004c547 96 }
star297 2:893e9004c547 97 if(lastfreq != radio.freq/1000){lastfreq = radio.freq/1000;
star297 2:893e9004c547 98 if(radio.freq<100000){
star297 2:893e9004c547 99 segmentDisplay.Number(radio.freq/10);segmentDisplay.Symbol(LCD_SYMBOL_DP10,1);
star297 2:893e9004c547 100 }
star297 2:893e9004c547 101 else {segmentDisplay.Number(radio.freq/100);segmentDisplay.Symbol(LCD_SYMBOL_DP10,0);}
star297 2:893e9004c547 102 rdstextgood=0;lastrds=!lastrds;
star297 2:893e9004c547 103 }
star297 2:893e9004c547 104 if(laststereo != radio.stereo){
star297 2:893e9004c547 105 if(radio.stereo){segmentDisplay.Symbol(LCD_SYMBOL_ANT,1);}
star297 2:893e9004c547 106 else{segmentDisplay.Symbol(LCD_SYMBOL_ANT,0);}
star297 2:893e9004c547 107 laststereo = radio.stereo;
star297 2:893e9004c547 108 }
star297 2:893e9004c547 109 if(lastsignal != radio.signal){
star297 2:893e9004c547 110 signal=radio.signal;
star297 2:893e9004c547 111 for (i = 0; i < 8; i++)
star297 2:893e9004c547 112 {segmentDisplay.ARing(i, 0);}
star297 2:893e9004c547 113 if(signal>4){segmentDisplay.ARing(0, 1);}
star297 2:893e9004c547 114 if(signal>9){segmentDisplay.ARing(1, 1);}
star297 2:893e9004c547 115 if(signal>14){segmentDisplay.ARing(2, 1);}
star297 2:893e9004c547 116 if(signal>19){segmentDisplay.ARing(3, 1);}
star297 2:893e9004c547 117 if(signal>25){segmentDisplay.ARing(4, 1);}
star297 2:893e9004c547 118 if(signal>30){segmentDisplay.ARing(5, 1);}
star297 2:893e9004c547 119 if(signal>35){segmentDisplay.ARing(6, 1);}
star297 2:893e9004c547 120 if(signal>40){segmentDisplay.ARing(7, 1);}
star297 2:893e9004c547 121 lastsignal=radio.signal;
star297 2:893e9004c547 122 }
star297 2:893e9004c547 123 if(lastrds != radio.rds){
star297 2:893e9004c547 124 if(radio.rds){
star297 2:893e9004c547 125 if(rdstextgood){led0=1;}
star297 2:893e9004c547 126 else{led0=0;}
star297 2:893e9004c547 127 }
star297 2:893e9004c547 128 else{led0=0;rdstextgood=0;}
star297 2:893e9004c547 129 lastrds=radio.rds;
star297 2:893e9004c547 130 }
star297 2:893e9004c547 131 if (strcmp(text1, lasttext1) != 0){
star297 2:893e9004c547 132 pc.printf(Station);
star297 2:893e9004c547 133 pc.printf("\n %s\n",text1);
star297 2:893e9004c547 134 memset(lasttext1, '\0', sizeof(lasttext1));strcpy(lasttext1, text1);}
star297 2:893e9004c547 135 if (strcmp(text2, lasttext2) != 0){
star297 2:893e9004c547 136 pc.printf(" %s\n\n",text2);
star297 2:893e9004c547 137 memset(lasttext2, '\0', sizeof(lasttext2));strcpy(lasttext2, text2);}
star297 2:893e9004c547 138 }
star297 2:893e9004c547 139
star297 2:893e9004c547 140 void getrds()
star297 2:893e9004c547 141 {
star297 2:893e9004c547 142 if(strlen(radio.RDSText)==64 && signal>23){
star297 2:893e9004c547 143 memset(text1, '\0', sizeof(text1));
star297 2:893e9004c547 144 memset(text2, '\0', sizeof(text2));
star297 2:893e9004c547 145 if(!rdstextgood){rdstextgood=1;lastrds=!lastrds;}
star297 2:893e9004c547 146 // remove non-printable ASCCi error characters
star297 2:893e9004c547 147 n=0;
star297 2:893e9004c547 148 for(i=0;i<(64);i++){
star297 2:893e9004c547 149 if(radio.RDSText[i] > 31){
star297 2:893e9004c547 150 RDStxt[n] = radio.RDSText[i];
star297 2:893e9004c547 151 n++;
star297 2:893e9004c547 152 }
star297 2:893e9004c547 153 }
star297 2:893e9004c547 154 // slit into 2 lines of text seperated by 'space'
star297 2:893e9004c547 155 strcpy(RDStxt1,RDStxt);
star297 2:893e9004c547 156 for ( i = 0; i < (n); i++ ){
star297 2:893e9004c547 157 if (i>30 && (RDStxt1[i] == ' ') ){
star297 2:893e9004c547 158 RDStxt1 [strlen(RDStxt1) - (n-i)] = '\0';
star297 2:893e9004c547 159 l=strlen(RDStxt1);
star297 2:893e9004c547 160 i=n;
star297 2:893e9004c547 161 } }
star297 2:893e9004c547 162 strcpy (RDStxt2, RDStxt + l);
star297 2:893e9004c547 163 while(RDStxt2[0]==' '){
star297 2:893e9004c547 164 strcpy (RDStxt2, (RDStxt2 + 1));
star297 2:893e9004c547 165 }
star297 2:893e9004c547 166 if(strlen(RDStxt1)<40){strcpy (text1, RDStxt1);}
star297 2:893e9004c547 167 if(strlen(RDStxt2)<40){strcpy (text2, RDStxt2);}
star297 2:893e9004c547 168
star297 2:893e9004c547 169 memset(radio.RDSText, '\0', sizeof(radio.RDSText));
star297 2:893e9004c547 170 }
star297 2:893e9004c547 171 }
star297 2:893e9004c547 172
stevew817 0:b0927d62ef70 173