Código
código Arduino
/ * Sintonizador de rádio simples usando Arduino Leonardo e o módulo Philips TEA5767 (versão Arduino Uno) Notas:------ A tensão de alimentação máxima TEA5767 é 5V. Certifique-se de que seu Arduino não esteja fornecendo mais de 5V- O TEA5767 não atualiza o indicador de nível de sinal na leitura. O nível do sinal só será atualizado na mudança de estação- Se você obtiver algumas falhas no codificador ou no botão de pressão, use uma rede snubber, como esta:Arduino pin> ---- + ---- / \ / \ / \ / ---------> Codificador ou pino do interruptor | Resistor de 100 ohms ----- ----- 47nF cap | --- Conexões GND:------------ Codificador (com interruptor de eixo "empurrável"):Botão de pressão ---> Arduino pino 2 Pino do codificador "A" ---> Arduino pino 3 Pino do codificador "B "---> Arduino pin 4- LCD:D7 ---> Arduino pin 8D6 ---> Arduino pin 9D5 ---> Arduino pin 10D4 ---> Arduino pin 11RS ---> Arduino pin 13RW ---> GNDE ----> Arduino pin 12VO ---> 2k2 resistor para GND (contraste) - Módulo TEA5756:Vista superior:+ - 10--9--8--7--6- + | + ------ + ++ || | TEA | || || | 5767 | || || + ------ + ++ | + - 1--2--3--4--5- + 1 ----> Arduino SDA2 ----> Arduino SCL3 ----> GND5 ----> + 5V6 ----> GND7 ----> Saída de áudio (canal direito) 8 ----> Saída de áudio (canal esquerdo) 10 ---> AntenaObrigado por seu interesse.Divirta-se! [email protected]*/#include #include // Obtenha a biblioteca TEA5767 em https://github.com/andykarpov/TEA5767#include // Codificador pins # define ENCODER_SW 2 # define ENCODER_A 3 # define ENCODER_B 4 # define button_freq1 A0 # define button_freq2 A1 # define button_freq3 A2 # define button_freq4 A3 // Caracteres personalizados # define SCALE_CLEAR 5 // Escala de discagem de rádio # define STEREO_CHAR_S 6 // Estilizado " S "#define STEREO_CHAR_T 7 // Estilizado" T "// Sinalizadores de status global # define ST_AUTO 0 // Modo automático (alternado pelo botão de pressão) #define ST_STEREO 1 // Módulo de rádio detectou um piloto estéreo # define ST_GO_UP 2 // Codificador girando no sentido horário # define ST_GO_DOWN 3 // Codificador girando no sentido anti-horário # define ST_SEARCH 4 // Módulo de rádio está realizando uma busca automática int LED =0; int analogsignal =0; int analogscale =0; int estereolizado =0; TEA5767 Rádio; frequência de flutuação =88; status de byte =0; LiquidCrystal lcd (13, 12, 11, 10, 9, 8); / ******************** ************************ \ * updateScale () * * Move a "agulha" sobre a escala de rádio * \ ********* *********************************** / void updateScale () {int lcdBase =(frequência - 88) * 4; // Índice de pixels da coluna LCD (0 <=lcdBase <=(16 * 5)) if (lcdBase> 79) lcdBase =79; int lcdMajor =lcdBase / 5; // Índice de caracteres do LCD (0 <=lcdMajor <=15) int lcdMinor =lcdBase% 5; // Índice da coluna de pixel do LCD dentro do caractere (0 <=lcdMinor <=4) if (lcdMajor> 0) {// O ponteiro do dial do rádio não está na posição mais à esquerda:// limpe o caractere à esquerda (para apagar o anterior posição intermediária) lcd.setCursor (lcdMajor - 1, 0); lcd.write (SCALE_CLEAR); } else lcd.setCursor (lcdMajor, 0); lcd.write (lcdMinor); if (lcdMajor <15) // Não na posição mais à direita:limpar o caractere à direita lcd.write (SCALE_CLEAR);} / *********************** ******** \ * isrEncoder () * * Capturar interrupções do codificador * \ *************************** ** / void isrEncoder () {atraso (50); // Debouncing (para codificadores ruins) if (digitalRead (ENCODER_B) ==HIGH) {bitWrite (status, ST_GO_UP, 1); } else bitWrite (status, ST_GO_DOWN, 1);} / ***************************** \ * isrSwitch () * * Catch interrupções de interruptores * \ ***************************** / void isrSwitch () {delay (50); // Debouncing if (bitRead (status, ST_AUTO)) bitWrite (status, ST_AUTO, 0); else bitWrite (status, ST_AUTO, 1);} / ******************* \ * Arduino Setup () * \ *********** ******** / configuração void () {Serial.end (); pinMode (button_freq1, INPUT); digitalWrite (button_freq1, LOW); pinMode (button_freq2, INPUT); digitalWrite (button_freq2, LOW); pinMode (button_freq3, INPUT); digitalWrite (button_freq3, LOW); pinMode (button_freq4, INPUT); digitalWrite (button_freq4, LOW); pinMode (LED, SAÍDA); pinMode (6, SAÍDA); pinMode (7, SAÍDA); pinMode (5, SAÍDA); int i; byte agulhaChar [8]; // Byte "S" estilizado stereoChar1 [8] ={0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000}; lcd.createChar (STEREO_CHAR_S, stereoChar1); // Byte "T" estilizado stereoChar2 [8] ={0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000}; lcd.createChar (STEREO_CHAR_T, stereoChar2); // Dial scale background byte scaleChar [8] ={0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101}; lcd.createChar (SCALE_CLEAR, scaleChar); // Cria um caractere personalizado para representar todas as (5) posições possíveis da agulha para (int j =0; j <5; j ++) {for (i =0; i <8; i ++) needleChar [i] =scaleChar [i ] | (0b10000>> j); lcd.createChar (j, needleChar); } lcd.begin (16, 2); lcd.clear (); // Desenhe o fundo da escala do dial para (i =0; i <16; i ++) lcd.write (SCALE_CLEAR); pinMode (ENCODER_SW, INPUT); digitalWrite (ENCODER_SW, HIGH); pinMode (ENCODER_A, INPUT); digitalWrite (ENCODER_A, HIGH); pinMode (ENCODER_B, INPUT); digitalWrite (ENCODER_B, HIGH); attachInterrupt (0, isrSwitch, RISING); attachInterrupt (1, isrEncoder, RISING); // Inicializa o módulo de rádio Wire.begin (); Radio.init (); Radio.set_frequency (frequência);} / ****************** \ * Arduino Loop () * \ *************** *** / void loop () {unsigned char buf [5]; int stereo; int signalLevel; int searchDirection; int i; i =0; // Atualiza o indicador Auto / Manual lcd.setCursor (12, 1); lcd.write (bitRead (status, ST_AUTO)? 'A':'M'); if bitRead (status, ST_AUTO) // LED Auto / manual {digitalWrite (LED, LOW); } else {digitalWrite (LED, HIGH); } if (Radio.read_status (buf) ==1) {// Obter frequência de dados de rádio =floor (Radio.frequency_available (buf) / 100000 + .5) / 10; estéreo =Radio.stereo (buf); // 0 <=Radio.signal_level <=15 signalLevel =(Radio.signal_level (buf) * 100) / 15; analogsignal =map (signalLevel, 0,100,0,255); escala analógica =mapa (frequência, 88,114,0,255); estereolizado =mapa (estéreo, 0,7,1,0,255); analogWrite (5, sinal analógico); // Medidor de sinal analogWrite (6, analogscale); // medidor de frequência analogWrite (7, estereolizado); // LED estéreo // Atualiza o dial do rádio updateScale (); // Indicador de nível de sinal lcd.setCursor (0, 1); lcd.write (183); // Caractere japonês que se parece com uma antena :) if (signalLevel <100) lcd.write (''); lcd.print (signalLevel); lcd.write ('%'); // Indicador de frequência lcd.setCursor (6, 1); if (frequência <100) lcd.write (''); lcd.print (frequência, 1); // Indicador mono / estéreo lcd.setCursor (14, 1); if (estéreo) {lcd.write (STEREO_CHAR_S); lcd.write (STEREO_CHAR_T); } else lcd.print (""); } if (bitRead (status, ST_SEARCH)) {// O rádio está realizando uma pesquisa automática? if (Radio.process_search (buf, searchDirection) ==1) {bitWrite (status, ST_SEARCH, 0); }} if (digitalRead (button_freq2) ==HIGH) {// botões de "memória" if (frequência> 94,8) {frequência =94,8; Radio.set_frequency (frequência); bitWrite (status, ST_GO_DOWN, 0); } mais {frequência =94,8; Radio.set_frequency (frequência); bitWrite (status, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq1) ==HIGH) {if (frequência> 92) {frequência =92; Radio.set_frequency (frequência); bitWrite (status, ST_GO_DOWN, 0); } mais {frequência =92; Radio.set_frequency (frequência); bitWrite (status, ST_GO_UP, 0); } precrtajScale ();} if (digitalRead (button_freq3) ==HIGH) {if (frequência> 97) {frequência =97; Radio.set_frequency (frequência); bitWrite (status, ST_GO_DOWN, 0); } mais {frequência =97; Radio.set_frequency (frequência); bitWrite (status, ST_GO_UP, 0); } precrtajScale (); } if (digitalRead (button_freq4) ==HIGH) {if (frequência> 101,2) {frequência =101,2; Radio.set_frequency (frequência); bitWrite (status, ST_GO_DOWN, 0); } senão {frequência =101,2; Radio.set_frequency (frequência); bitWrite (status, ST_GO_UP, 0); } precrtajScale ();} // Codificador girando no sentido horário (+) if (bitRead (status, ST_GO_UP)) {if (bitRead (status, ST_AUTO) &&! bitRead (status, ST_SEARCH)) {// Modo de pesquisa automática (apenas processado se o rádio não estiver realizando uma pesquisa) bitWrite (status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_UP; Radio.search_up (buf); atraso (50); } else {// Modo de sintonia manual if (freqüência <108) {freqüência + =0,1; Radio.set_frequency (frequência); }} bitWrite (status, ST_GO_UP, 0); } // Codificador girando no sentido anti-horário (-) if (bitRead (status, ST_GO_DOWN)) {if (bitRead (status, ST_AUTO) &&! BitRead (status, ST_SEARCH)) {// Modo de pesquisa automática (apenas processado se o rádio estiver não está realizando uma pesquisa no momento) bitWrite (status, ST_SEARCH, 1); searchDirection =TEA5767_SEARCH_DIR_DOWN; Radio.search_down (buf); atraso (50); } else {// Modo de sintonia manual if (freqüência> 88) {freqüência - =0,1; Radio.set_frequency (frequência); }} bitWrite (status, ST_GO_DOWN, 0); }} void precrtajScale () {int i; lcd.clear (); para (i =0; i <16; i ++) lcd.write (SCALE_CLEAR);}