Site Language

Translate

Danish Dutch English French German

FM-радиомодуль TEA5767

img48  img49 
ePN Cashback - сервис, который возвращает часть денег с покупок, сделанных в интернет магазинах, представленных в ePN Cashback CashBack 3  

 

 

 

Sketch code

#include <Wire.h>

unsigned char frequencyH = 0;
unsigned char frequencyL = 0;

unsigned int frequencyB;
double frequency = 0;

int pinA0 =A0;
int A;
int B = 1;


void setup()
{
  Wire.begin();
  frequency = 101.2; //Начальная частота
  setFrequency();
  Serial.begin(9600);
}

void loop()
{
  A = analogRead(pinA0);
  if(A>0)
    {
     B=B+1;
     delay(500);
    }
    if(B==1)
      frequency = 101.2;
    if(B==2)
      frequency = 102.5;
    if(B==3)
      frequency = 103.7;
    if(B==4)
      frequency = 104.5;
    if(B==5)
      frequency = 105.0;
    if(B>=6)
      B=1;
    
  setFrequency();
}

void setFrequency()
{
  frequencyB = 4 * (frequency * 1000000 + 225000) / 32768;
  frequencyH = frequencyB >> 8;
  frequencyL = frequencyB & 0XFF;
  delay(100);
  Wire.beginTransmission(0x60);
  Wire.write(frequencyH);
  Wire.write(frequencyL);
  Wire.write(0xB0);
  Wire.write(0x10);
  Wire.write((byte)0x00);
  Wire.endTransmission();
  delay(100);
}

 

Sketch code

#include <Wire.h>
#define DEBUG 0

const int entrada = A0; 
int entradaV = 0; 

int menu;
#define MAXmenu  4
int menux;
#define MAXmenux  4
static char* menuS[]= {" ","MANUAL TUNE","VOLUME     ","AUTO TUNE","INFO        "};

int volumen=2,volumenOld=7;
int frecuencia,frecuenciaOld;

unsigned int z,z1;
byte xfrecu,xfrecuOld;
unsigned int estado[6];

unsigned long time,time1,time2,time3;

// int    RDA5807_adrs=0x10;       // I2C-Address RDA Последовательный порт
// int    RDA5807_adrr=0x11;       // I2C-Address RDA Случайный доступ
// int    RDA5807_adrt=0x60;       // I2C-Address RDA Chip for TEA5767like Access

char buffer[30];
unsigned int RDS[4];
char seg_RDS[8];
char seg_RDS1[64];
char indexRDS1;

char hora,minuto,grupo,versio;
unsigned long julian;

 int mezcla;

void setup() 
{
  Wire.begin();   
  Serial.begin(9600); 
  
  LcdInitialise();
  LcdClear();
  //drawBox();
  
   WriteReg(0x02,0xC00d); // write 0xC00d into Reg.2 ( soft reset, enable,RDS, )
   WriteReg(0x05,0x84d8);  // write ,0x84d8 into Reg.3 
   
   // frecuencia inicial
   frecuencia=177; //104.7
//  frecuencia=26; //89.6
  time3=time2=time1=time = millis();
  menu=3;
  
  canal(frecuencia);
  clearRDS;
}

void loop() {
 
  entradaV = analogRead(entrada);
  
   #if DEBUG  
      Serial.print("sensor = " );  Serial.println(entradaV);delay(50);
   #endif
   
// Boton menu   
 if(entradaV>500 && entradaV<524)
   {
    menu++;
    if(menu>MAXmenu)menu=1;
    Visualizar();
//    sprintf(buffer,"Menu->%s",menuS[menu]); gotoXY(2,2);  LcdString(buffer); 
    #if DEBUG 
      Serial.print("menu = " );  Serial.println(menu); 
    #endif   
    while(1020>analogRead(entrada))delay(5);
   }
            
// Boton derecho
 if( entradaV<50)
   {
    menux++;
    if(menux>MAXmenux)menux=MAXmenux;
    #if DEBUG 
      Serial.print("menux = " );  Serial.println(menux);
    #endif
    switch(menu)
      {
        case 1:
          frecuencia++;
          if(frecuencia>205)frecuencia=205; // верхняя граница частот
          delay(130);
        break;  
        case 2:
           volumen++;
           if(volumen>15)volumen=15;
           while(1020>analogRead(entrada))delay(5);
        break; 
        case 3:
           busqueda(0);
           while(1020>analogRead(entrada))delay(5);
        break; 
        case 4:
            LcdClear();
            visualPI();
            delay(3000);
            LcdClear();
            frecuenciaOld=-1;
        break; 
      }              
   }
   
// Boton izquierdo
 if( entradaV<700 && entradaV>660)
   {
    menux--;
    if(menux<1)menux=1; 
    #if DEBUG 
      Serial.print("menux = " );  Serial.println(menux);
    #endif   
    switch(menu)
      {
        case 1:
            frecuencia--;
            if(frecuencia<0)frecuencia=0;    
            delay(130);
        break;  
        case 2:
            volumen--;
            if(volumen<0)volumen=0;
            while(1020>analogRead(entrada))delay(5);
        break; 
        case 3:
            busqueda(1);
            while(1020>analogRead(entrada))delay(5);
        break; 
        case 4:
            LcdClear();
            visualPTY();
            delay(3000);
            LcdClear();
            frecuenciaOld=-1;
        break; 
      }
    
   }
      
      if( millis()-time2>50)
          {
           ReadEstado();
           time1 = millis(); 
            //RDS   
           if ((estado[0] & 0x8000)!=0) {get_RDS();}
          }
     if( millis()-time3>500)
          {
            time3 = millis();
            Visualizar(); 

          }

    if( frecuencia!=frecuenciaOld)
          {  
            frecuenciaOld=frecuencia;                        
            z=870+frecuencia;
         #if DEBUG  
            Serial.print("Frecuencia = " );  Serial.println(frecuencia);
         #endif 
            sprintf(buffer,"%04d ",z);
             gotoXY(1,3);        
             for(z=0;z<5;z++)
               {
                if(z==3)  LcdStringX(".");
                LcdCharacterX(buffer[z]);
               }
          gotoXY(62,3); 
          LcdString("MHz");
        
          canal(frecuencia);
          clearRDS();
       }     

    //Изменение громкости      
    if(volumen!=volumenOld)
        { 
          volumenOld=volumen;
          sprintf(buffer,"Vol %02d",volumen); gotoXY(38,1);  LcdString(buffer);      
          WriteReg(5, 0x84D0 | volumen);
        }       
}

void visualPI(void)
{
    #if DEBUG       
     Serial.print("PAIS:  "); Serial.println(RDS[0]>>12 & 0X000F);
     Serial.print("Cobertura:"); Serial.println(RDS[0]>>8 & 0X000F);
     Serial.print("CODIGO:"); Serial.println(RDS[0] & 0X00FF); 
    #endif
    
     gotoXY(1,3);sprintf(buffer,"PAIS  -%02d",RDS[0]>>12 & 0X000F); LcdString(buffer);
     gotoXY(1,4);sprintf(buffer,"COBERT-%02d",RDS[0]>>8 & 0X000F); LcdString(buffer);
     gotoXY(1,5);sprintf(buffer,"CODIGO-%02d",RDS[0] & 0X00FF); LcdString(buffer);     
}
void visualPTY(void)
{
    #if DEBUG       
     Serial.print("PTY:  "); Serial.println(RDS[1]>>5 & 0X001F);     
    #endif
    
     gotoXY(1,3);     LcdString("TIPO");
     gotoXY(1,4);     LcdString("PROGRAMA");
     gotoXY(1,5);sprintf(buffer,"%02d",RDS[1]>>5 & 0X001F); LcdString(buffer);
}

void busqueda(byte direc)
{
  byte i;
  if(!direc) WriteReg(0x02,0xC30d); else  WriteReg(0x02,0xC10d);
  
  for(i=0;i<10;i++)
    {
      delay(200);      
      ReadEstado();      
      if(estado[0]&0x4000)
        {
          //Serial.println("Emisora encontrada");
          frecuencia=estado[0] & 0x03ff;  
          break;
        }       
    }
}

void clearRDS(void)
{       
         gotoXY(10,4); for (z=0;z<8;z++) {seg_RDS[z]=32; LcdCharacter(32);}  //borrar Name LCD Emisora
         gotoXY(38,2); for (z=0;z<6;z++) { LcdCharacter(32);}  //borrar linea Hora
         for (z=0;z<64;z++) seg_RDS1[z]=32;   
}

void Visualizar(void)
{ 
      //Serial.print("READ_Frecuencia= " );  Serial.println(estado[0] & 0x03ff);
      gotoXY(2,0); LcdStringX("FM"); 
      sprintf(buffer,"%s",menuS[menu]); gotoXY(2,2);  LcdString(buffer); 
       //Detectar se&#241;al stereo
       gotoXY(72,0);
       if((estado[0] & 0x0400)==0)  LcdCharacter(32);   else     LcdCharacter(127);        
       //Se&#241;al 
       z=estado[1]>>10; sprintf(buffer,"S-%02d",z); gotoXY(38,0);  LcdString(buffer);
       sprintf(buffer,"Vol %02d",volumen); gotoXY(38,1);  LcdString(buffer);
       //ver RADIO_TXT
       gotoXY(0,5);
       z1=indexRDS1;
       for (z=0;z<12;z++)
       {           
         LcdCharacter(seg_RDS1[z1]);
         z1++;
         if(z1>35)z1=0;           
       }
       indexRDS1++; if(indexRDS1>35) indexRDS1=0;
       
      frecuencia=estado[0] & 0x03ff;  
  }

void canal( int canal)
     {
       byte numeroH,numeroL;
       
       numeroH=  canal>>2;
       numeroL = ((canal&3)<<6 | 0x10); 
       Wire.beginTransmission(0x11);
       Wire.write(0x03);
         Wire.write(numeroH);                     // write frequency into bits 15:6, set tune bit         
         Wire.write(numeroL);
         Wire.endTransmission();
       }

//________________________ 
//RDA5807_adrr=0x11;       
// I2C-Address RDA Chip for random      Access
void WriteReg(byte reg,unsigned int valor)
{
  Wire.beginTransmission(0x11);
  Wire.write(reg); Wire.write(valor >> 8); Wire.write(valor & 0xFF);
  Wire.endTransmission();
  //delay(50);
}

//RDA5807_adrs=0x10;
// I2C-Address RDA Chip for sequential  Access
int ReadEstado()
{
 Wire.requestFrom(0x10, 12); 
 for (int i=0; i<6; i++) { estado[i] = 256*Wire.read ()+Wire.read(); }
 Wire.endTransmission();

}

//READ RDS  Direccion 0x11 for random access
void ReadW()
{
   Wire.beginTransmission(0x11);            // Device 0x11 for random access
   Wire.write(0x0C);                                // Start at Register 0x0C
   Wire.endTransmission(0);                         // restart condition
   Wire.requestFrom(0x11,8, 1);       // Retransmit device address with READ, followed by 8 bytes
   for (int i=0; i<4; i++) {RDS[i]=256*Wire.read()+Wire.read();}        // Read Data into Array of Unsigned Ints
   Wire.endTransmission();                  
 } 

 void get_RDS()
 {    
  int i;
  ReadW();      
  grupo=(RDS[1]>>12)&0xf;
      if(RDS[1]&0x0800) versio=1; else versio=0;  //Version A=0  Version B=1   
      if(versio==0)
      {
       #if DEBUG             
       sprintf(buffer,"Version=%d  Grupo=%02d ",versio,grupo); Serial.print(buffer);
    //    Serial.print(" 0->");Serial.print(RDS[0],HEX);Serial.print(" 1->");Serial.print(RDS[1],HEX);Serial.print(" 2->");Serial.print(RDS[2],HEX);Serial.print(" 3->");Serial.println(RDS[03],HEX);
    //    Serial.print(" 0->");Serial.print(RDS[0],BIN);Serial.print(" 1->");Serial.print(RDS[1],BIN);Serial.print(" 2->");Serial.print(RDS[2],BIN);Serial.print(" 3->");Serial.println(RDS[03],BIN);
    #endif 
    switch(grupo)
    {
     case 0:              
      #if DEBUG 
      Serial.print("_RDS0__");     
      #endif
      i=(RDS[1] & 3) <<1;
      seg_RDS[i]=(RDS[3]>>8);       
      seg_RDS[i+1]=(RDS[3]&0xFF);
      gotoXY(10,4);
      for (i=0;i<8;i++)
      {
        #if DEBUG 
        Serial.write(seg_RDS[i]);   
        #endif
        
        if(seg_RDS[i]>31 && seg_RDS[i]<128)
        LcdCharacter(seg_RDS[i]);
        else
        LcdCharacter(32);
      }  
      //Serial.print("FrecuAlt1-");Serial.println((RDS[2]>>8)+875);
      //Serial.print("FrecuAlt2-"); Serial.println(RDS[2]&0xFF+875);      
      
      #if DEBUG                 
      Serial.println("---");
      #endif
      break;
     case 2:
      i=(RDS[1] & 15) <<2;              
      seg_RDS1[i]=(RDS[2]>>8);       
      seg_RDS1[i+1]=(RDS[2]&0xFF);
      seg_RDS1[i+2]=(RDS[3]>>8);       
      seg_RDS1[i+3]=(RDS[3]&0xFF);
      #if DEBUG 
      Serial.println("_RADIOTEXTO_");
              //Serial.print(i);Serial.print("   ");Serial.println(RDS[1] & 15);
              //Serial.write(RDS[2]>>8); Serial.write (RDS[2]&0xFF);Serial.write(RDS[3]>>8);Serial.write(RDS[3]&0xFF);Serial.write("_");
              for (i=0;i<32;i++)  Serial.write(seg_RDS1[i]);                                    
              Serial.println("-TXT-");
              #endif      
              break;
              case 4:             
              i=RDS[3]& 0x003f;
              minuto=(RDS[3]>>6)& 0x003f;
              hora=(RDS[3]>>12)& 0x000f;
              if(RDS[2]&1) hora+=16;
              hora+=i;        
              z=RDS[2]>>1;
              julian=z;
              
              if(RDS[1]&1) julian+=32768;
              if(RDS[1]&2) julian+=65536;
              #if DEBUG 
              Serial.print("_DATE_");
              Serial.print(" Juliano=");Serial.print(julian);
              sprintf(buffer," %02d:%02d ",hora,minuto); gotoXY(38,2);  LcdString(buffer); 
              Serial.println(buffer); 
              #endif            
              break;
              default:
              #if DEBUG 
              Serial.println("__"); 
              #endif    
              ;        
            }                        
          }                   
        } 
        
// Пины подключения Arduino
#define PIN_SCE   3
#define PIN_RESET 4
#define PIN_DC    5
#define PIN_SDIN  6
#define PIN_SCLK  7 

// Подключение к LCD
#define LCD_C     LOW
#define LCD_D     HIGH
#define LCD_CMD   0

// Размер  LCD
#define LCD_X     84
#define LCD_Y     48

int scrollPosition = -10;

static const byte ASCII[][5] =
{
 {0x00, 0x00, 0x00, 0x00, 0x00} // 20
,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c &#194;&#165;
,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e &#195;&#162;&#194;&#134;&#194;&#144; 
//,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f &#195;&#162;&#194;&#134;&#194;&#146;
,{B11111111, B01111110, B00011000, B01111110, B11111111} //Stereo 127
};

void LcdCharacter(char character)
{
  unsigned char z,z1;
  
  z1=character - 0x20;
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    //para que funciona en proteus
    
    z=ASCII[z1][index];
    LcdWrite(LCD_D, z);
   // LcdWrite(LCD_D, ASCII[character - 0x20][index]);    
 }
 LcdWrite(LCD_D, 0x00);
}

void LcdCharacterX(char character)
{
  unsigned char z,z1;
  z1=character - 0x20;       
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
     //para que funciona en proteus
     z=ASCII[z1][index];
     LcdWrite(LCD_D, z);
     LcdWrite(LCD_D, z);
    //LcdWrite(LCD_D, ASCII[character - 0x20][index]);
    //LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}  

void LcdClear(void)
{
  for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
  {
    LcdWrite(LCD_D, 0x00);
  }
}

void LcdInitialise(void)
{
  pinMode(PIN_SCE,   OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC,    OUTPUT);
  pinMode(PIN_SDIN,  OUTPUT);
  pinMode(PIN_SCLK,  OUTPUT);
  
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
  
  LcdWrite(LCD_CMD, 0x21);  // LCD Extended Commands.
  LcdWrite(LCD_CMD, 0xB5);  // Set LCD Vop (Contrast). //B1
  LcdWrite(LCD_CMD, 0x04);  // Set Temp coefficent. //0x04
  LcdWrite(LCD_CMD, 0x14);  // LCD bias mode 1:48. //0x13
  LcdWrite(LCD_CMD, 0x0C);  // LCD in normal mode. 0x0d for inverse
  LcdWrite(LCD_C, 0x20);
  LcdWrite(LCD_C, 0x0C);
}

void LcdString(char *characters)
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}
void LcdStringX(char *characters)
{
  while (*characters)
  {
    LcdCharacterX(*characters++);
  }
} 

void LcdWrite(byte dc, byte data)
{
  digitalWrite(PIN_DC, dc);
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}

/**
 * gotoXY routine to position cursor
 * x - range: 0 to 84
 * y - range: 0 to 5
 */
 void gotoXY(int x, int y)
 {
  LcdWrite( 0, 0x80 | x);  // Column.
  LcdWrite( 0, 0x40 | y);  // Row.
}

void drawBox(void)
{
  int j;
  for(j = 0; j < 84; j++) // top
  {
    gotoXY(j, 0);
    LcdWrite(1, 0x01);
  }     
  
  for(j = 0; j < 84; j++) //Bottom
  {
    gotoXY(j, 5);
    LcdWrite(1, 0x80);
  }     
  
  for(j = 0; j < 6; j++) // Right
  {
    gotoXY(83, j);
    LcdWrite(1, 0xff);
  }     
  
  for(j = 0; j < 6; j++) // Left
  {
    gotoXY(0, j);
    LcdWrite(1, 0xff);
  }
}

void Scroll(String message)
{
  for (int i = scrollPosition; i < scrollPosition + 11; i++)
  {
    if ((i >= message.length()) || (i < 0))
    {
      LcdCharacter(' ');
    }
    else	
    {
      LcdCharacter(message.charAt(i));
    }
  }
  scrollPosition++;
  if ((scrollPosition >= message.length()) && (scrollPosition > 0))
  {
    scrollPosition = -10;
  }
}

Sketch code

#include <Wire.h>
#define DEBUG 0

int volumen=8,volumenOld=7;
int frecuencia,frecuenciaOld;

unsigned int z,z1;
byte xfrecu,xfrecuOld;
unsigned int estado[6];

int time,time1;

// int    RDA5807_adrs=0x10;       // I2C-Address RDA Chip for sequential  Access
// int    RDA5807_adrr=0x11;       // I2C-Address RDA Chip for random      Access
// int    RDA5807_adrt=0x60;       // I2C-Address RDA Chip for TEA5767like Access

char buffer[30];
unsigned int RDS[4];
char seg_RDS[8];
char seg_RDS1[64];
char indexRDS1;

char hora,minuto,grupo,versio;
unsigned long julian;

int mezcla;

char entrada[100];
int contador;
boolean stringComplete = true;

void setup() 
{
  Wire.begin();   
  Serial.begin(9600);
  Serial.print("RADIO\n");
  Serial.print("RADIO\n"); 
   
   WriteReg(0x02,0xC00d); // write 0xC00d into Reg.2 ( soft reset, enable,RDS, )
   WriteReg(0x05,0x84d8);  // write ,0x84d8 into Reg.3 
     
   // frecuencia inicial
   frecuencia=165; //103.5
//  frecuencia=26; //89.6
  
  canal(frecuencia);
  clearRDS;
  time=time1=100;
}

void loop() 
{
  
  while (Serial.available())
    {
    char inChar = (char)Serial.read(); 
    entrada[contador]=inChar;  
    if (inChar == '\n')
        {
          stringComplete = true;
          entrada[contador]=0;
        } 
    contador++;  
    } 
    
    if (stringComplete) 
    { 
      if(!strncmp(entrada,"RADIO1=",7))
          {
            Serial.println("OK");
            goto salir0;
          }
      if(!strncmp(entrada,"buscar+",7))
          {  
           Serial.println("buscar+_OK");
           busqueda(0); 
           goto salir0;  
          }
      if(!strncmp(entrada,"buscar-",7))
          {   
           Serial.println("buscar-_OK");
           busqueda(1);
          goto salir0;   
          }
      if(!strncmp(entrada,"volume+",7))
          {  
           Serial.println("volume+_OK");
           volumen++;
           if(volumen>15)volumen=15;  
           goto salir0;
          }
      if(!strncmp(entrada,"volume-",7))
          {   
           Serial.println("volume-_OK");
           volumen--;
           if(volumen<0)volumen=0;   
           goto salir0;
          }
      if(!strncmp(entrada,"ncanal=",7))
          {   
           Serial.print("ncanalOK=");
           strcpy(buffer,entrada+7);
           z=atoi(buffer); Serial.println(z);  
           frecuencia=z;
           goto salir0;
          }
        if(!strncmp(entrada,"volume=",7))
          {   
           Serial.print("volumeOK=");
           strcpy(buffer,entrada+7);
           z=atoi(buffer); Serial.println(z);  
           volumen=z;
           if(volumen>15)volumen=15;
           if(volumen<0)volumen=0;
           goto salir0;
          }  
       Serial.print("ERROR "); Serial.println(entrada);
salir0:
      contador=0;
      stringComplete = false;
    }
  
   
    delay(1); time--; time1--;
    if(time<1)
      {
        time=30000;
        Visualizar(); 
      }
     
    if(time1<1)
      {
       time1=50;
       ReadEstado();       
       //RDS   
       if ((estado[0] & 0x8000)!=0) {get_RDS();}
      }
          
    //Cambio de frecuencia
    if( frecuencia!=frecuenciaOld)
          {  
            frecuenciaOld=frecuencia;                        
            Visualizar();
            canal(frecuencia);
            clearRDS();
         }     

    //Изменение громкости        
    if(volumen!=volumenOld)
        { 
          volumenOld=volumen;
          sprintf(buffer,"Volumen=%02d",volumen); 
          Serial.println(buffer);
          WriteReg(5, 0x84D0 | volumen);
        }       
}

void visualPI(void)
{
      
}
void visualPTY(void)
{
  
}
void get_RDS()
{  
}

void busqueda(byte direc)
{
  byte i;
  if(!direc) WriteReg(0x02,0xC30d); else  WriteReg(0x02,0xC10d);
  
  for(i=0;i<10;i++)
    {
      delay(200);      
      ReadEstado();      
      if(estado[0]&0x4000)
        {
          //Serial.println("Emisora encontrada");
          frecuencia=estado[0] & 0x03ff;  
          break;
        }       
    }
}


void clearRDS(void)
{       
 
}

void Visualizar(void)
{ 
  z=870+frecuencia;
  sprintf(buffer,"Canal=%04i",frecuencia); Serial.println(buffer);  
  sprintf(buffer,"Frecuencia=%04i",z); Serial.println(buffer); 
}

void canal( int canal)
     {
       byte numeroH,numeroL;
       
       numeroH=  canal>>2;
       numeroL = ((canal&3)<<6 | 0x10); 
       Wire.beginTransmission(0x11);
       Wire.write(0x03);
         Wire.write(numeroH);                     // write frequency into bits 15:6, set tune bit         
         Wire.write(numeroL);
         Wire.endTransmission();
       }

//________________________ 
//RDA5807_adrr=0x11;       
// I2C-Address RDA Chip for random      Access
void WriteReg(byte reg,unsigned int valor)
{
  Wire.beginTransmission(0x11);
  Wire.write(reg); Wire.write(valor >> 8); Wire.write(valor & 0xFF);
  Wire.endTransmission();
  //delay(50);
}

//RDA5807_adrs=0x10;
// I2C-Address RDA Chip for sequential  Access
int ReadEstado()
{
 Wire.requestFrom(0x10, 12); 
 for (int i=0; i<6; i++) { estado[i] = 256*Wire.read ()+Wire.read(); }
 Wire.endTransmission();

}

//READ RDS  Direccion 0x11 for random access
void ReadW()
{
   Wire.beginTransmission(0x11);            // Device 0x11 for random access
   Wire.write(0x0C);                                // Start at Register 0x0C
   Wire.endTransmission(0);                         // restart condition
   Wire.requestFrom(0x11,8, 1);       // Retransmit device address with READ, followed by 8 bytes
   for (int i=0; i<4; i++) {RDS[i]=256*Wire.read()+Wire.read();}        // Read Data into Array of Unsigned Ints
   Wire.endTransmission();                  
 } 

 даташит http://www.micro4you.com/files/ElecFr...

Плата расширения L293D, ИК-датчик VS1838B, TFT LCD, Модем M590E GSM GPRS, "монитор TFT LCD, датчик движения HC-SR501, ИК-пульт дистанционного управления, Радиомодуль NRF24L01, SD Card Module, Звуковой модуль, 5-axis stepper motor driver, Шаговый двигатель, Модем M590E GSM GPRS, 5-axis stepper motor driver, Часы реального времени DS 3231/DS 1307, терморегулятор W1209 DC, Релейный модуль, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, датчик движения HC-SR501, Передатчик и приемник в диапазоне RF 433 Mhz, Блок питания, L293D, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, Датчики контроля температуры, Радиомодуль NRF24L01, OKI 120A2, Rotary Encoder, SD Card Module, Беспроводной пульт дистанционного управления, Микросхема контроллера коллекторного электродвигателя, Модуль Bluetooth HC-06,, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Mini 360 на схеме LM2596, MP3-TF-16P, L293D, Модуль LCD монитора, Инфракрасные датчики расстояния, Часы реального времени, USB Host Shield, HC-SR501, Cветочувствительный датчик сопротивления, блок питания Mini 360 на схеме LM2596, ЖК-дисплей TFT дисплей, Контроллер L298N, HC-SR501, Модуль MP3 Player WTV020, GSM GPRS, Сервоприводы, Модем M590E GSM GPRS, Часы реального времени DS 3231/DS 1307, Модуль Wi-Fi ESP8266-12E, Инфракрасные датчики расстояния, Card Module, Ультразвуковые дальномеры HC-SR04, Блок питания, Карта памяти SD, Mini 360, Ethernet shield, L293D, блок питания Mini 360 на схеме LM2596, Радиомодуль, датчик температуры DS18B20, ИК-пульт дистанционного управления, USB конвертер UART, ИК-пульт, Антена для модуля WiFi, Ethernet shield, Модуль блока питания XL6009, Микросхема контроллера коллекторного электродвигателя, Модуль качества воздуха MQ-135, Микросхема контроллера коллекторного электродвигателя, ИК-пульт дистанционного управления, SD Card Module, Радиомодуль NRF24L01, двигатель OKI, 5-axis stepper motor driver, L293D, TB6560, Драйвер шагового двигателя TB6600, Шаговый двигатель, Модуль камеры, Блок питания, L293D, блок питания Mini 360 на схеме LM2596, 5axis mach3 interface, Карта памяти SD, Ethernet shield, Контроллер L298N, датчик движения HC-SR501, Модуль Wi-Fi ESP8266-12E, Модуль LCD монитора LCD1602, Шаговый двигатель OKI 120A2, Шаговый двигатель, Шаговый двигатель.

All Vintage Vinyl Records VinylSU.xyz

1.png2.png3.png4.png5.png

РУБИКОН Группа «Мозаика», ИЕРОГЛИФ ГРУППА «ПИКНИК», В ПОЛЁТ ГРУППА «ТЯЖЕЛЫЙ ДЕНЬ», Группа «Алиса», Бенни Гудмен, Равноденствие ГРУППА «АКВАРИУМ», Элтон Джон Твоя песня, Демон Группа «Август», Deep Purple – The House Of Blue Light, «Лед Зеппелин» Led Zeppelin, «Акцепт», Doors, «Металлика», АНСАМБЛЬ „UB 40", группа «Зоопарк», рок-группа «ЗОДИАК», «Браво», «Кино», Rolling Stones «Роллинг стоунз», РОК-ГРУППА «МАШИНА ВРЕМЕНИ»,«Кокто твинз», Группа «ДИАЛОГ», Bill Evans, Джимми Лансфорд, Флетчера Хендерсона, Дюк Эллингтон, Каунт Бейси, АНСАМБЛЬ "THE MOODY BLUES", Элвис Пресли, "Юнона" и "Авось" , Дж. Верди Реквием G.Verdi Requiem Mass, Элтон Джон, Реджинальд Кеннет Дуайт, АББА, ABBA, “Deep Purple”, «ЧЕЛОВЕК С БУЛЬВАРА КАПУЦИНОВ», “Rolling Stone”, Instrumrutal rock group Zodiac,‘‘Long Tall Ernie and The Shakers”, “The Beatles”, "Tom Fcgerty and The Blue Velvets", "Creedruce Clearwater Revival","Greru River" "Bayou Country", "Willy and The Poorboys", Varnishing Day Songs on Ilya Reznik's lirics , Leo Sayer ЛЕО СЕЙЕР, Boney M,"Waiting For The Sun", Doors «ДОРЗ», "Piper At The Gates Of Dawn", Led Zeppelin ? «ЛЕД ЗЕППЕЛИН», Rolling Stones , "Юнона" и "Авось" Опера Либретто, «РОЛЛИНГ СТОУНЗ», Modern talking,"Aftermath", «ДОМ ГОЛУБОГО СВЕТА», "Out Of Our Heads", Ricchi E Poveri, PINK FLOYD «Пинк Флойд», Vladimir Kuzmin, ПОЛ МАККАРТНИ Paul McCartney, «TWruTY FLIGHT ROCK», Creedruce Clearvater revival Traveling band,«LAWDY. MISS CLAWDY», «BRING IT ON HOME TO ME», Light My Fire,«DON'T GET AROUND MUCH ANY MORE», МУЗЫКАЛЬНЫЙ ТЕЛЕТАЙП-3,«I'М GONNA BE A WHEEL SOME DAY», МОДЕРН ТОКИНГ,«AINT THAT A SHAME», «THAT'S ALL RIGHT (МАМА)», АНСАМБЛЬ UB 40, «JUST BECAUSE», МИГЕЛЬ РАМОС, «SUMMERTIME», "АНСАМБЛЬ "THE MOODY BLUES", «CRACKIN UP», ТНЕ СОММОDORES, «MIDNIGHT SPECIAL», АННА ГEРМАН, Deep Purple «ДИП ПЁРПЛ», „Deep Purple in Rock", Андрей Миронов, Олег Табаков, Михаил Боярский, Николай Караченцов, Альберт Филозов, Олег Анофриев, Игорь Кваша, Леонид Ярмольник, ИЛЬЯ РЕЗНИК , Резанов Николай Петрович, ВЛАДИМИР ВЫСОЦКИЙ, Роджер Уотерс, АЛЕКСАНДР РОЗЕНБАУМ, Ричард Райт и Ник Мэйсон, ВЛАДИМИР КУЗЬМИН, Элвис Аарон Пресли, Leo Sayer, АДРИАНО ЧЕЛЕНТАНО, Билл Эванс, Клаудия Мори....

и это еще не конец.

С уваженим Dron!