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:
Fri Jun 19 16:38:34 2015 +0000
Revision:
3:1220287bcbd7
Parent:
2:893e9004c547
Child:
4:3bf9d70a48c8
Added CT time.

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 3:1220287bcbd7 35 int x,n,i,l,signal,lastsignal,volume,laststereo;
star297 2:893e9004c547 36 float lastfreq;
star297 3:1220287bcbd7 37 char Station[10],lastStationName[10],vol[4],lastCT[12];
star297 3:1220287bcbd7 38 char RDStxt[70],RDStxt1[70],RDStxt2[70],text1[70],lasttext1[70],text2[70],lasttext2[70];
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 3:1220287bcbd7 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 3:1220287bcbd7 94 pc.printf("Station:\n%s\n\n",Station);
star297 2:893e9004c547 95 strcpy(lastStationName,radio.StationName);
star297 2:893e9004c547 96 }
star297 2:893e9004c547 97 }
star297 2:893e9004c547 98 if(lastfreq != radio.freq/1000){lastfreq = radio.freq/1000;
star297 2:893e9004c547 99 if(radio.freq<100000){
star297 2:893e9004c547 100 segmentDisplay.Number(radio.freq/10);segmentDisplay.Symbol(LCD_SYMBOL_DP10,1);
star297 2:893e9004c547 101 }
star297 2:893e9004c547 102 else {segmentDisplay.Number(radio.freq/100);segmentDisplay.Symbol(LCD_SYMBOL_DP10,0);}
star297 3:1220287bcbd7 103 led0=0;
star297 2:893e9004c547 104 }
star297 2:893e9004c547 105 if(laststereo != radio.stereo){
star297 2:893e9004c547 106 if(radio.stereo){segmentDisplay.Symbol(LCD_SYMBOL_ANT,1);}
star297 2:893e9004c547 107 else{segmentDisplay.Symbol(LCD_SYMBOL_ANT,0);}
star297 2:893e9004c547 108 laststereo = radio.stereo;
star297 2:893e9004c547 109 }
star297 2:893e9004c547 110 if(lastsignal != radio.signal){
star297 2:893e9004c547 111 signal=radio.signal;
star297 2:893e9004c547 112 for (i = 0; i < 8; i++)
star297 2:893e9004c547 113 {segmentDisplay.ARing(i, 0);}
star297 2:893e9004c547 114 if(signal>4){segmentDisplay.ARing(0, 1);}
star297 2:893e9004c547 115 if(signal>9){segmentDisplay.ARing(1, 1);}
star297 2:893e9004c547 116 if(signal>14){segmentDisplay.ARing(2, 1);}
star297 2:893e9004c547 117 if(signal>19){segmentDisplay.ARing(3, 1);}
star297 2:893e9004c547 118 if(signal>25){segmentDisplay.ARing(4, 1);}
star297 2:893e9004c547 119 if(signal>30){segmentDisplay.ARing(5, 1);}
star297 2:893e9004c547 120 if(signal>35){segmentDisplay.ARing(6, 1);}
star297 2:893e9004c547 121 if(signal>40){segmentDisplay.ARing(7, 1);}
star297 2:893e9004c547 122 lastsignal=radio.signal;
star297 2:893e9004c547 123 }
star297 3:1220287bcbd7 124 if(strcmp(RDStxt1, lasttext1) != 0 || strcmp(RDStxt2, lasttext2) != 0){
star297 3:1220287bcbd7 125 pc.printf("\n-------------------------------------------\n");
star297 3:1220287bcbd7 126 pc.printf("Station:\n%s\n\n",Station);
star297 3:1220287bcbd7 127 pc.printf("RT:\n%s\n",RDStxt1);
star297 3:1220287bcbd7 128 pc.printf("%s\n\n",RDStxt2);
star297 3:1220287bcbd7 129 pc.printf("Time: %s\n",radio.CTtime);
star297 3:1220287bcbd7 130 memset(lasttext1, '\0', sizeof(lasttext1));strcpy(lasttext1, RDStxt1);
star297 3:1220287bcbd7 131 memset(lasttext2, '\0', sizeof(lasttext2));strcpy(lasttext2, RDStxt2);
star297 3:1220287bcbd7 132 led0=1;
star297 3:1220287bcbd7 133 }
star297 3:1220287bcbd7 134 if(strcmp(lastCT, radio.CTtime) !=0){
star297 3:1220287bcbd7 135 pc.printf("Time: %s\n",radio.CTtime);
star297 3:1220287bcbd7 136 strcpy(lastCT,radio.CTtime);
star297 3:1220287bcbd7 137 }
star297 2:893e9004c547 138 }
star297 2:893e9004c547 139
star297 2:893e9004c547 140 void getrds()
star297 2:893e9004c547 141 {
star297 3:1220287bcbd7 142 if(strlen(radio.RDSText)>3){
star297 3:1220287bcbd7 143 memset(RDStxt1, '\0', sizeof(RDStxt1));
star297 3:1220287bcbd7 144 memset(RDStxt2, '\0', sizeof(RDStxt2));
star297 3:1220287bcbd7 145
star297 3:1220287bcbd7 146 // format into 2 lines of text seperated by first 'space' after 30 characters
star297 3:1220287bcbd7 147 strcpy(RDStxt1,radio.RDSText);
star297 3:1220287bcbd7 148 n=strlen(RDStxt1);
star297 2:893e9004c547 149 for ( i = 0; i < (n); i++ ){
star297 2:893e9004c547 150 if (i>30 && (RDStxt1[i] == ' ') ){
star297 2:893e9004c547 151 RDStxt1 [strlen(RDStxt1) - (n-i)] = '\0';
star297 2:893e9004c547 152 l=strlen(RDStxt1);
star297 3:1220287bcbd7 153 x=1;
star297 3:1220287bcbd7 154 break; // break if more than 30 characters with space
star297 3:1220287bcbd7 155 }
star297 3:1220287bcbd7 156 if(i>39){
star297 3:1220287bcbd7 157 RDStxt1 [strlen(RDStxt1) - (n-i)] = '\0';
star297 3:1220287bcbd7 158 l=strlen(RDStxt1);
star297 3:1220287bcbd7 159 x=1;
star297 3:1220287bcbd7 160 break; //break if more than 39 characters with no spaces
star297 3:1220287bcbd7 161 }
star297 2:893e9004c547 162 }
star297 3:1220287bcbd7 163 if(x==1){
star297 3:1220287bcbd7 164 strcpy (RDStxt2, radio.RDSText + l);
star297 3:1220287bcbd7 165 while(RDStxt2[0]==' '){
star297 3:1220287bcbd7 166 strcpy (RDStxt2, (RDStxt2 + 1));
star297 3:1220287bcbd7 167 }
star297 3:1220287bcbd7 168 x=0;
star297 3:1220287bcbd7 169 }
star297 3:1220287bcbd7 170 }
star297 2:893e9004c547 171 }
star297 2:893e9004c547 172
stevew817 0:b0927d62ef70 173