si4703

Dependencies:   Si4703 mbed millis

Committer:
vodavprasku
Date:
Sat Jan 16 19:27:51 2016 +0000
Revision:
1:ebbd4cc237bc
Parent:
0:11630d0d8271
abc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vodavprasku 1:ebbd4cc237bc 1 /*
vodavprasku 1:ebbd4cc237bc 2 +-----------------------------------------------------+
vodavprasku 1:ebbd4cc237bc 3 | |
vodavprasku 1:ebbd4cc237bc 4 | |
vodavprasku 1:ebbd4cc237bc 5 | FM radio s Si4703 |
vodavprasku 1:ebbd4cc237bc 6 | |
vodavprasku 1:ebbd4cc237bc 7 | |
vodavprasku 1:ebbd4cc237bc 8 +-----------------------------------------------------+
vodavprasku 1:ebbd4cc237bc 9 */
vodavprasku 1:ebbd4cc237bc 10 // Autor: Adam Stepanek
vodavprasku 1:ebbd4cc237bc 11 // Vytvoreno v ramci projektu MPOA 2016
vodavprasku 1:ebbd4cc237bc 12
vodavprasku 1:ebbd4cc237bc 13
vodavprasku 1:ebbd4cc237bc 14 // Inkluze knihoven
vodavprasku 0:11630d0d8271 15 #include "mbed.h"
vodavprasku 0:11630d0d8271 16 #include "SparkFun-Si4703.h"
vodavprasku 0:11630d0d8271 17 #include "SSD1306.h"
vodavprasku 1:ebbd4cc237bc 18 #include "millis.h"
vodavprasku 0:11630d0d8271 19
vodavprasku 1:ebbd4cc237bc 20 // Definice pro tlacitka
vodavprasku 1:ebbd4cc237bc 21 #define LEFT 0x01
vodavprasku 1:ebbd4cc237bc 22 #define CENTER 0x02
vodavprasku 1:ebbd4cc237bc 23 #define RIGHT 0x03
vodavprasku 0:11630d0d8271 24
vodavprasku 1:ebbd4cc237bc 25 // Definice pro displej
vodavprasku 1:ebbd4cc237bc 26 #define MAIN 0x01
vodavprasku 1:ebbd4cc237bc 27 #define MENU 0x02
vodavprasku 1:ebbd4cc237bc 28 #define ONOFF 0x04
vodavprasku 1:ebbd4cc237bc 29 #define VOLUME 0x05
vodavprasku 1:ebbd4cc237bc 30
vodavprasku 1:ebbd4cc237bc 31 // Konstruktory
vodavprasku 0:11630d0d8271 32 Serial pc(USBTX, USBRX); // tx, rx
vodavprasku 0:11630d0d8271 33 Si4703_Breakout radio(I2C_SDA, I2C_SCL, PTA1, &pc);
vodavprasku 0:11630d0d8271 34
vodavprasku 1:ebbd4cc237bc 35 // Nastaveni I/O
vodavprasku 1:ebbd4cc237bc 36 DigitalIn btn_left(PTA5);
vodavprasku 1:ebbd4cc237bc 37 DigitalIn btn_center(PTC8);
vodavprasku 1:ebbd4cc237bc 38 DigitalIn btn_right(PTC9);
vodavprasku 1:ebbd4cc237bc 39
vodavprasku 1:ebbd4cc237bc 40 // Definice funkci
vodavprasku 1:ebbd4cc237bc 41 int button_pressed(void);
vodavprasku 1:ebbd4cc237bc 42 void show_frequency(void);
vodavprasku 1:ebbd4cc237bc 43 void show_screen(int screen, int position);
vodavprasku 1:ebbd4cc237bc 44
vodavprasku 1:ebbd4cc237bc 45 // Prostor pro ulozeni nastaveni
vodavprasku 1:ebbd4cc237bc 46 typedef struct{
vodavprasku 1:ebbd4cc237bc 47 bool rds;
vodavprasku 1:ebbd4cc237bc 48 int volume;
vodavprasku 1:ebbd4cc237bc 49 bool tuning;
vodavprasku 1:ebbd4cc237bc 50 }Menu_Setup;
vodavprasku 1:ebbd4cc237bc 51
vodavprasku 1:ebbd4cc237bc 52 Menu_Setup setup;
vodavprasku 0:11630d0d8271 53
vodavprasku 1:ebbd4cc237bc 54 // Prostor pro ulozeni aktualni frekvence
vodavprasku 1:ebbd4cc237bc 55 typedef struct{
vodavprasku 1:ebbd4cc237bc 56 int current;
vodavprasku 1:ebbd4cc237bc 57 int high;
vodavprasku 1:ebbd4cc237bc 58 int low;
vodavprasku 1:ebbd4cc237bc 59 }Frequency_Info;
vodavprasku 1:ebbd4cc237bc 60
vodavprasku 1:ebbd4cc237bc 61 Frequency_Info frequency;
vodavprasku 1:ebbd4cc237bc 62
vodavprasku 1:ebbd4cc237bc 63 // Nezbytne promenne
vodavprasku 1:ebbd4cc237bc 64 char rds[8]; // Zde se uklada vysledek cteni RDS
vodavprasku 1:ebbd4cc237bc 65 char volume_char[2]; // Aktualni hlasitost prevedena na text
vodavprasku 1:ebbd4cc237bc 66 char channel_char[4]; // Aktualni frekvence prevedena na text
vodavprasku 1:ebbd4cc237bc 67 int btn_pressed = false; // Bylo v minulosti zmacknuto tlacitko?
vodavprasku 1:ebbd4cc237bc 68 bool exit_menu = false; // Navrat z menu
vodavprasku 1:ebbd4cc237bc 69 bool exit_submenu = false; // Navrat z menu druhe urovne
vodavprasku 1:ebbd4cc237bc 70 int menu_position = 0; // Ulozeni aktualni pozice sipky v menu
vodavprasku 1:ebbd4cc237bc 71 int submenu_position = 0; // Ulozeni aktualni pozice sipky v submenu
vodavprasku 1:ebbd4cc237bc 72
vodavprasku 1:ebbd4cc237bc 73 // HLAVNI FUNKCE
vodavprasku 0:11630d0d8271 74 int main() {
vodavprasku 1:ebbd4cc237bc 75 init(); // Inicializace displeje SSD1306
vodavprasku 1:ebbd4cc237bc 76 cls(); // Smazani obrazovky
vodavprasku 1:ebbd4cc237bc 77 startMillis(); // Zapnuti pocitani milisekund
vodavprasku 1:ebbd4cc237bc 78 radio.powerOn(); // Zapnuti radia
vodavprasku 1:ebbd4cc237bc 79 setup.volume = 2;
vodavprasku 1:ebbd4cc237bc 80 radio.setVolume(setup.volume); // Nastaveni vychozi hlasitosti
vodavprasku 1:ebbd4cc237bc 81 frequency.current = 760; // Naladeni vychozi frekvence
vodavprasku 1:ebbd4cc237bc 82 radio.setChannel(frequency.current);
vodavprasku 1:ebbd4cc237bc 83
vodavprasku 1:ebbd4cc237bc 84 show_screen(MAIN, 0); // Zobrazeni hlavni obrazovky
vodavprasku 1:ebbd4cc237bc 85 show_frequency(); // Zobrazeni aktualni frekvence
vodavprasku 0:11630d0d8271 86
vodavprasku 0:11630d0d8271 87
vodavprasku 1:ebbd4cc237bc 88 // HLAVNI SMYCKA
vodavprasku 1:ebbd4cc237bc 89 while(true){
vodavprasku 1:ebbd4cc237bc 90 if(setup.rds){ // Cti RDS pokud je tato funkce zapnuta
vodavprasku 1:ebbd4cc237bc 91 radio.readRDS(rds, 1500); // Cteni RDS s timeoutem 1.5 sekundy
vodavprasku 1:ebbd4cc237bc 92 OLED_ShowStr(50, 5, rds, 1);// Zobrazeni vysledku RDS, pokud byla prijata
vodavprasku 1:ebbd4cc237bc 93 }
vodavprasku 1:ebbd4cc237bc 94
vodavprasku 1:ebbd4cc237bc 95 switch(button_pressed()){ // Ceka, dokud nebude zmacknuto tlacitko
vodavprasku 1:ebbd4cc237bc 96 case LEFT: // Zmacknuto leve tlacitko
vodavprasku 1:ebbd4cc237bc 97 if(setup.tuning) // Je zapnuto manualni ladeni?
vodavprasku 1:ebbd4cc237bc 98 radio.setChannel(--frequency.current); // Manualni ladeni
vodavprasku 1:ebbd4cc237bc 99 else
vodavprasku 1:ebbd4cc237bc 100 frequency.current = radio.seekDown(); // Automaticke ladeni
vodavprasku 1:ebbd4cc237bc 101 if(frequency.current < 760){ // Pokud dosahneme pod minimalni frekvenci,
vodavprasku 1:ebbd4cc237bc 102 frequency.current = 1080; // bude naladena nejvyssi
vodavprasku 1:ebbd4cc237bc 103 radio.setChannel(frequency.current);
vodavprasku 1:ebbd4cc237bc 104 }
vodavprasku 1:ebbd4cc237bc 105 show_frequency();
vodavprasku 1:ebbd4cc237bc 106 break;
vodavprasku 1:ebbd4cc237bc 107
vodavprasku 1:ebbd4cc237bc 108 case RIGHT: // Zmacknuto prave tlacitko
vodavprasku 1:ebbd4cc237bc 109 if(setup.tuning) // Je zapnuto manualni ladeni?
vodavprasku 1:ebbd4cc237bc 110 radio.setChannel(++frequency.current); // Manualni ladeni
vodavprasku 1:ebbd4cc237bc 111 else
vodavprasku 1:ebbd4cc237bc 112 frequency.current = radio.seekUp(); // Automaticke ladeni
vodavprasku 1:ebbd4cc237bc 113 if(frequency.current < 760) // Ochrana proti naladeni neplatne frekvence
vodavprasku 1:ebbd4cc237bc 114 frequency.current = radio.seekUp();
vodavprasku 1:ebbd4cc237bc 115 show_frequency();
vodavprasku 1:ebbd4cc237bc 116 break;
vodavprasku 1:ebbd4cc237bc 117
vodavprasku 1:ebbd4cc237bc 118
vodavprasku 1:ebbd4cc237bc 119
vodavprasku 1:ebbd4cc237bc 120 case CENTER: // Vstup do MENU
vodavprasku 1:ebbd4cc237bc 121 while(!exit_menu){
vodavprasku 1:ebbd4cc237bc 122
vodavprasku 1:ebbd4cc237bc 123 show_screen(MENU, menu_position+2); // Ukaze sipku v menu
vodavprasku 1:ebbd4cc237bc 124
vodavprasku 1:ebbd4cc237bc 125 switch(button_pressed()){ // Ceka dokud nebude zmacknuto tlacitko
vodavprasku 1:ebbd4cc237bc 126
vodavprasku 1:ebbd4cc237bc 127 case LEFT: // Zmacknuto leve tlacitko,
vodavprasku 1:ebbd4cc237bc 128 if(menu_position == 0) // provede se posunuti sipky
vodavprasku 1:ebbd4cc237bc 129 menu_position = 3;
vodavprasku 1:ebbd4cc237bc 130 else
vodavprasku 1:ebbd4cc237bc 131 menu_position--;
vodavprasku 1:ebbd4cc237bc 132 break;
vodavprasku 1:ebbd4cc237bc 133
vodavprasku 1:ebbd4cc237bc 134 case RIGHT: // Zmacknuto leve tlacitko,
vodavprasku 1:ebbd4cc237bc 135 if(menu_position == 3) // provede se posunuti sipky
vodavprasku 1:ebbd4cc237bc 136 menu_position = 0;
vodavprasku 1:ebbd4cc237bc 137 else
vodavprasku 1:ebbd4cc237bc 138 menu_position++;
vodavprasku 1:ebbd4cc237bc 139 break;
vodavprasku 1:ebbd4cc237bc 140
vodavprasku 1:ebbd4cc237bc 141 case CENTER: // Vstup do dalsi urovne MENU
vodavprasku 1:ebbd4cc237bc 142 exit_submenu = false;
vodavprasku 1:ebbd4cc237bc 143 switch(menu_position){
vodavprasku 1:ebbd4cc237bc 144 case 0: // SUBMENU Nastaveni Hlasitosti
vodavprasku 1:ebbd4cc237bc 145 exit_submenu = false;
vodavprasku 1:ebbd4cc237bc 146 while(!exit_submenu){
vodavprasku 1:ebbd4cc237bc 147 radio.setVolume(setup.volume);
vodavprasku 1:ebbd4cc237bc 148 show_screen(VOLUME, 0);
vodavprasku 1:ebbd4cc237bc 149 switch(button_pressed()){ // Pridat volume
vodavprasku 1:ebbd4cc237bc 150 case LEFT:
vodavprasku 1:ebbd4cc237bc 151 if(setup.volume == 0);
vodavprasku 1:ebbd4cc237bc 152 else
vodavprasku 1:ebbd4cc237bc 153 setup.volume--;
vodavprasku 1:ebbd4cc237bc 154 break;
vodavprasku 1:ebbd4cc237bc 155 case RIGHT: // Ubrat volume
vodavprasku 1:ebbd4cc237bc 156 if(setup.volume == 15);
vodavprasku 1:ebbd4cc237bc 157 else
vodavprasku 1:ebbd4cc237bc 158 setup.volume++;
vodavprasku 1:ebbd4cc237bc 159 break;
vodavprasku 1:ebbd4cc237bc 160 case CENTER: // Navrat do hlavniho menu
vodavprasku 1:ebbd4cc237bc 161 exit_submenu = true;
vodavprasku 1:ebbd4cc237bc 162 break;
vodavprasku 1:ebbd4cc237bc 163 }
vodavprasku 1:ebbd4cc237bc 164 }
vodavprasku 1:ebbd4cc237bc 165
vodavprasku 1:ebbd4cc237bc 166 break;
vodavprasku 1:ebbd4cc237bc 167 case 1: // SUBMENU Manualni ladeni
vodavprasku 1:ebbd4cc237bc 168 exit_submenu = false;
vodavprasku 1:ebbd4cc237bc 169 while(!exit_submenu){
vodavprasku 1:ebbd4cc237bc 170 cls();
vodavprasku 1:ebbd4cc237bc 171 show_screen(ONOFF, setup.tuning+3);
vodavprasku 1:ebbd4cc237bc 172 if(button_pressed() == CENTER)
vodavprasku 1:ebbd4cc237bc 173 exit_submenu = true;
vodavprasku 1:ebbd4cc237bc 174 else
vodavprasku 1:ebbd4cc237bc 175 setup.tuning = !setup.tuning; // Zapnuti nebo vypnuti
vodavprasku 1:ebbd4cc237bc 176 } // manualniho ladeni
vodavprasku 1:ebbd4cc237bc 177 break;
vodavprasku 1:ebbd4cc237bc 178 case 2: // SUBMENU Nastaveni RDS
vodavprasku 1:ebbd4cc237bc 179 exit_submenu = false;
vodavprasku 1:ebbd4cc237bc 180 while(!exit_submenu){
vodavprasku 1:ebbd4cc237bc 181 cls();
vodavprasku 1:ebbd4cc237bc 182 show_screen(ONOFF, setup.rds+3);
vodavprasku 1:ebbd4cc237bc 183 if(button_pressed() == CENTER)
vodavprasku 1:ebbd4cc237bc 184 exit_submenu = true;
vodavprasku 1:ebbd4cc237bc 185 else
vodavprasku 1:ebbd4cc237bc 186 setup.rds = !setup.rds; // Zapnuti nebo vypnuti RDS
vodavprasku 1:ebbd4cc237bc 187 }
vodavprasku 1:ebbd4cc237bc 188 break;
vodavprasku 1:ebbd4cc237bc 189 case 3: // Navrat z menu
vodavprasku 1:ebbd4cc237bc 190 show_screen(MAIN, 0);
vodavprasku 1:ebbd4cc237bc 191 show_frequency();
vodavprasku 1:ebbd4cc237bc 192 exit_menu = true;
vodavprasku 1:ebbd4cc237bc 193 break;
vodavprasku 1:ebbd4cc237bc 194 }
vodavprasku 1:ebbd4cc237bc 195
vodavprasku 1:ebbd4cc237bc 196 break;
vodavprasku 1:ebbd4cc237bc 197 }
vodavprasku 1:ebbd4cc237bc 198 }
vodavprasku 1:ebbd4cc237bc 199 break;
vodavprasku 1:ebbd4cc237bc 200 }
vodavprasku 1:ebbd4cc237bc 201 exit_menu = false;
vodavprasku 1:ebbd4cc237bc 202 menu_position = 0;
vodavprasku 1:ebbd4cc237bc 203
vodavprasku 1:ebbd4cc237bc 204 OLED_ShowStr(0, 5, "Staince: ", 1); // Smazani informaci z RDS, pokud dojde k preladeni
vodavprasku 1:ebbd4cc237bc 205 }
vodavprasku 1:ebbd4cc237bc 206 }
vodavprasku 1:ebbd4cc237bc 207
vodavprasku 1:ebbd4cc237bc 208
vodavprasku 1:ebbd4cc237bc 209
vodavprasku 1:ebbd4cc237bc 210
vodavprasku 1:ebbd4cc237bc 211
vodavprasku 1:ebbd4cc237bc 212 // FUNKCE
vodavprasku 1:ebbd4cc237bc 213
vodavprasku 1:ebbd4cc237bc 214 // Funkce pro zjisteni, ktere tlacitko bylo stisknuto
vodavprasku 1:ebbd4cc237bc 215 int button_pressed(void){
vodavprasku 1:ebbd4cc237bc 216 btn_pressed = false;
vodavprasku 1:ebbd4cc237bc 217 while(!btn_pressed){
vodavprasku 1:ebbd4cc237bc 218
vodavprasku 1:ebbd4cc237bc 219 if (btn_left)
vodavprasku 1:ebbd4cc237bc 220 btn_pressed = LEFT; // Indikace zmacknuteho leveho tlacitka
vodavprasku 1:ebbd4cc237bc 221
vodavprasku 1:ebbd4cc237bc 222 if (btn_center)
vodavprasku 1:ebbd4cc237bc 223 btn_pressed = CENTER; // Indikace zmacknuteho prostredniho tlacitka
vodavprasku 1:ebbd4cc237bc 224
vodavprasku 1:ebbd4cc237bc 225 if (btn_right)
vodavprasku 1:ebbd4cc237bc 226 btn_pressed = RIGHT; // Indikace zmacknuteho praveho tlacitka
vodavprasku 1:ebbd4cc237bc 227 }
vodavprasku 1:ebbd4cc237bc 228 while(btn_left || btn_center || btn_right); // Dokud je tlacitko zmacknute, ceka
vodavprasku 1:ebbd4cc237bc 229 wait_ms(200); // Jednoduche odstraneni zakmitu
vodavprasku 1:ebbd4cc237bc 230 return btn_pressed;
vodavprasku 1:ebbd4cc237bc 231 }
vodavprasku 1:ebbd4cc237bc 232
vodavprasku 1:ebbd4cc237bc 233 // Funkce pro zobrazeni aktualni frekvence
vodavprasku 1:ebbd4cc237bc 234 void show_frequency(void){
vodavprasku 1:ebbd4cc237bc 235 frequency.high = frequency.current / 10;
vodavprasku 1:ebbd4cc237bc 236 frequency.low = frequency.current % 10;
vodavprasku 1:ebbd4cc237bc 237 OLED_ShowStr(38, 2, " ", 2);
vodavprasku 1:ebbd4cc237bc 238 sprintf(channel_char, "%d.%d",frequency.high, frequency.low);
vodavprasku 1:ebbd4cc237bc 239 OLED_ShowStr(38, 2, channel_char, 2);
vodavprasku 1:ebbd4cc237bc 240 }
vodavprasku 1:ebbd4cc237bc 241
vodavprasku 1:ebbd4cc237bc 242 //Funkce pro zobrazeni displeje (menu, hlavni obrazovka...)
vodavprasku 1:ebbd4cc237bc 243 void show_screen(int screen, int position){
vodavprasku 1:ebbd4cc237bc 244 switch(screen){
vodavprasku 1:ebbd4cc237bc 245
vodavprasku 1:ebbd4cc237bc 246 case MAIN: // Zobrazeni hlavni obrazovky
vodavprasku 1:ebbd4cc237bc 247 cls();
vodavprasku 1:ebbd4cc237bc 248 locate(0, 0);
vodavprasku 1:ebbd4cc237bc 249 OLED_ShowStr(0, 0, " FM Radio", 2);
vodavprasku 1:ebbd4cc237bc 250 OLED_ShowStr(0, 2, "< MHz >", 2);
vodavprasku 1:ebbd4cc237bc 251 OLED_ShowStr(0, 5, "Staince:", 1);
vodavprasku 1:ebbd4cc237bc 252 OLED_ShowStr(0, 7, " [MENU] ", 1);
vodavprasku 1:ebbd4cc237bc 253 show_frequency();
vodavprasku 1:ebbd4cc237bc 254 break;
vodavprasku 1:ebbd4cc237bc 255
vodavprasku 1:ebbd4cc237bc 256 case MENU: // Zobrazeni menu
vodavprasku 1:ebbd4cc237bc 257 cls();
vodavprasku 1:ebbd4cc237bc 258 OLED_ShowStr(0, 0, " MENU", 2);
vodavprasku 1:ebbd4cc237bc 259 OLED_ShowStr(0, 2, " Hlasitost", 1);
vodavprasku 1:ebbd4cc237bc 260 OLED_ShowStr(0, 3, " Manualni ladeni", 1);
vodavprasku 1:ebbd4cc237bc 261 OLED_ShowStr(0, 4, " RDS", 1);
vodavprasku 1:ebbd4cc237bc 262 OLED_ShowStr(0, 5, " Zpet", 1);
vodavprasku 1:ebbd4cc237bc 263 OLED_ShowStr(0, 7, " [VYBRAT] ", 1);
vodavprasku 1:ebbd4cc237bc 264 OLED_ShowStr(0, position, "->", 1); // Zobrazeni sipky na spravne pozici
vodavprasku 1:ebbd4cc237bc 265 break;
vodavprasku 1:ebbd4cc237bc 266
vodavprasku 1:ebbd4cc237bc 267 case ONOFF: // Zobrazeni submenu volby On/Off
vodavprasku 1:ebbd4cc237bc 268 cls();
vodavprasku 1:ebbd4cc237bc 269 OLED_ShowStr(0, 3, " Off", 1);
vodavprasku 1:ebbd4cc237bc 270 OLED_ShowStr(0, 4, " On", 1);
vodavprasku 1:ebbd4cc237bc 271 OLED_ShowStr(0, position, "->", 1); // Zobrazeni sipky na spravne pozici
vodavprasku 1:ebbd4cc237bc 272 OLED_ShowStr(0, 7, " [OK] ", 1);
vodavprasku 1:ebbd4cc237bc 273
vodavprasku 1:ebbd4cc237bc 274 break;
vodavprasku 1:ebbd4cc237bc 275
vodavprasku 1:ebbd4cc237bc 276 case VOLUME: // Volba hlasitosti
vodavprasku 1:ebbd4cc237bc 277 cls();
vodavprasku 1:ebbd4cc237bc 278 sprintf(volume_char, "%d",setup.volume); // Zobrazeni aktualni hlasitosti
vodavprasku 1:ebbd4cc237bc 279 OLED_ShowStr(60, 3, volume_char, 2);
vodavprasku 1:ebbd4cc237bc 280 break;
vodavprasku 0:11630d0d8271 281 }
vodavprasku 1:ebbd4cc237bc 282 }