Тема: вывод RDS(rda5807m) на панельку от магнитолы

Данный контент доступен только зарегистрированным пользователям.

2

Re: вывод RDS(rda5807m) на панельку от магнитолы

Попробуйте этот код, при запуске должно появится слово HELLO

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     

 String inputStr;
 long data = 0; // Инициализируем переменную data
 long h[7];// это вместо h1 h2 h3 h4 h5



void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("HELLO");

delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
   
  char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов

  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     h[i]=data;
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  
  print_out();
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

3

Re: вывод RDS(rda5807m) на панельку от магнитолы

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     


 long data = 0; // Инициализируем переменную data




void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("HELLO");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  unsigned long h[7]; // Массив для хранения результатов
  char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов

  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     h[i]=data;
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

Re: вывод RDS(rda5807m) на панельку от магнитолы

всё так же, 10 секунд тишина, потом идет текст

5

Re: вывод RDS(rda5807m) на панельку от магнитолы

Сейчас точно должно работать

http://forum.rcl-radio.ru/uploads/images/2025/02/a8d8d94b6af08b094756dd9bd122400a.png

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("HELLO");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  int length = inputStr.length();
  uint16_t h[7]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов

  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= length) {
    for (int i = 0; i < length; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

Re: вывод RDS(rda5807m) на панельку от магнитолы

http://forum.rcl-radio.ru/uploads/images/2025/02/9308ee08c485950f687614619d7ab441.jpeg

7 (2025-02-06 17:50:02 отредактировано vladbuharkin20)

Re: вывод RDS(rda5807m) на панельку от магнитолы

Текст вывелся, но какие-то артефакты в конце и лишние знаки горят

8

Re: вывод RDS(rda5807m) на панельку от магнитолы

Выводятся 5 символов, если слово меньше 7 символов нужно выводить пустоту, что бы не было артефактов.

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("HELLO");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 Serial.println(h6,BIN);
 Serial.println(h7,BIN);

 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  while (inputStr.length() < 7) {
    inputStr += " "; // Добавляем пробелы до тех пор, пока длина не станет 7
  }
  uint16_t h[7]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов

  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

Re: вывод RDS(rda5807m) на панельку от магнитолы

всё супер

10 (2025-02-06 18:09:24 отредактировано vladbuharkin20)

Re: вывод RDS(rda5807m) на панельку от магнитолы

теперь надо сделать вывод RDS на экран с условием if(присутствует рдс){ команда вывода на экран текста RDS};
else{вывод частоты}
вытаскивая текст RDS из этой команды, он в самом начале скетча, среди переменных

void DisplayServiceName(char *name){}

11

Re: вывод RDS(rda5807m) на панельку от магнитолы

и желательно текст с RDS всегда отображать в центре экрана, как это сделано на lcd1602

12

Re: вывод RDS(rda5807m) на панельку от магнитолы

Авто центрирование текста

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("RTE");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 Serial.println(h6,BIN);
 Serial.println(h7,BIN);

 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 7;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[7]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

13

Re: вывод RDS(rda5807m) на панельку от магнитолы

Работает, текст отцентровался

14

Re: вывод RDS(rda5807m) на панельку от магнитолы

теперь надо сделать вывод RDS на экран с условием if(присутствует рдс){ команда вывода на экран текста RDS};
else{вывод частоты}
вытаскивая текст RDS из этой команды, он в самом начале скетча, среди переменных

void DisplayServiceName(char *name){}

15

Re: вывод RDS(rda5807m) на панельку от магнитолы

RDS выводится через

void DisplayServiceName(char *name){Serial.print(name);}

RDS выводится в монитор порта?
Надо проверить
Так же надо посмотреть длину текста, а так понимаю на дисплей можно вывести только 7 символов?

16 (2025-02-12 11:50:43 отредактировано vladbuharkin20)

Re: вывод RDS(rda5807m) на панельку от магнитолы

Дисплей у меня на 8 мест.RDS выводится

http://forum.rcl-radio.ru/uploads/images/2025/02/3cd05e23cb5636c47027916a0f0ab36f.png

17

Re: вывод RDS(rda5807m) на панельку от магнитолы

radio.checkRDS();  // RDS - эта функция выводит RDS ?

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){str(name);print_out();} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("RTE");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 Serial.println(h6,BIN);
 Serial.println(h7,BIN);

 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 7;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[8]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  h8=h[7];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

18

Re: вывод RDS(rda5807m) на панельку от магнитолы

Все хорошо, но на пустых местах загораются сегменты

http://forum.rcl-radio.ru/uploads/images/2025/02/c53ecac9774b67d371044f8534888681.jpg

19

Re: вывод RDS(rda5807m) на панельку от магнитолы

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){str(name);print_out();} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("RTE");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 Serial.println(h6,BIN);
 Serial.println(h7,BIN);

 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 8;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[8]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  h8=h[7];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

20 (2025-02-12 12:44:09 отредактировано vladbuharkin20)

Re: вывод RDS(rda5807m) на панельку от магнитолы

Всё четко, пустых нету и еще надо сделать условие "Присутствие рдс", о котором я говорил ранее

21

Re: вывод RDS(rda5807m) на панельку от магнитолы

это функция вывода частоты
http://forum.rcl-radio.ru/uploads/images/2025/02/a3a28373b5e30fab63e256194dd061a1.png

22

Re: вывод RDS(rda5807m) на панельку от магнитолы

Надо проверить, если есть RDS то выводится RDS , если нет то должна появится надпись NO RDS

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){if(name==1){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();

 str("RTE");
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
 Serial.println(h6,BIN);
 Serial.println(h7,BIN);

 print_out();
delay(10000);
 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();

   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 8;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[8]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 7) {
    for (int i = 0; i < 7; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  h8=h[7];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

23

Re: вывод RDS(rda5807m) на панельку от магнитолы

Частоты на которых был RDS он пишет что нету, возьмите вот этот скетч, он такой же как у вас, но я его немного доработал(отключил долгую заставку и закомментировал вывод частоты)

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){if(name==1){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////

 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
/*
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();
*/
   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 8;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[8]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 8) {
    for (int i = 0; i < 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  h8=h[7];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

24

Re: вывод RDS(rda5807m) на панельку от магнитолы

#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h> 
#define CE  7
#define CL  8
#define DI  9
#define pinX    A1  // ось X джойстика
#define pinY    A0  // ось Y джойстика
#define R_PIN 10 //подсветка дисплея 
#define G_PIN 11 //подсветка дисплея 
#define B_PIN 12 //подсветка дисплея 


#define FIX_BAND    RADIO_BAND_FM   
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
 int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};

void DisplayServiceName(char *name){if (strlen(name) > 0){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
//              MO      EON     TP      ST    REG    PTY      AF     AM  CD-CH    FM     2       3     







void setup() {
  Serial.begin(9600);
  pinMode(pinX, INPUT);
  pinMode(pinY, INPUT);
  pinMode(R_PIN, OUTPUT);
  pinMode(G_PIN, OUTPUT);
  pinMode(B_PIN, OUTPUT);

pinMode(3, INPUT_PULLUP);//кнопка джостика

  pinMode(CE, OUTPUT);
  pinMode(CL, OUTPUT);
  pinMode(DI, OUTPUT);
  digitalWrite(CE,LOW);
  digitalWrite(CL,LOW);

color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255,  255);};



  k=0;
  f=10200;
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(6);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);

delay(400);


////////////////////////////ПРИВЕТСТВИЕ////////////////////////////

 h1 = buk(7);
 h2 = buk(4);
 h3 = buk(12);
 h4 = buk(12);
 h5 = buk(15);
 Serial.println(h1,BIN);
 Serial.println(h2,BIN);
 Serial.println(h3,BIN);
 Serial.println(h4,BIN);
 Serial.println(h5,BIN);
  print_out();
 delay(2000);
 h1 = buk(27);
 h2 = buk(27);
 h3 = buk(27);
 h4 = buk(27);
 h5 = buk(27);
 print_out();
 delay(30);
 clear_lcd();
 h4 = buk(9);
 h5 = buk(22);
 h6 = buk(2);
 print_out();
 delay(2000);
////////////////////////////////////////////////////////////////

clear_lcd();

} //setup
 
void loop() {


  if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost

  radio.checkRDS();
  radio.formatFrequency(s, sizeof(s));


 
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
  
 //Serial.println(stat);

  if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();}      //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();}  //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;}                   //сохранёные -


    //lcd.setCursor(0,0);lcd.print(info.tuned  ? "TUNED"  : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
    //lcd.setCursor(14,1);lcd.print(info.rssi);
    //lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz   ");
    //lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
   radio.checkRDS();  // RDS

//вывод частоты
/*
int sec12 = (float)f/10;
  h2 = segm(sec12/100%10);
  h3 = segm(sec12/10%10);
  h4 = segm(sec12%10);
  h6 = buk(5);
  h7 = buk(13);
     if(sec12/1000==1){h1 = segm(1);}
      else{h1 = segm(10);}
      toch=1;
      print_out();
*/
   }//menu0 конец
  

 
 
  
} // LOOP


void str(String inputStr){
  const int targetLength = 8;
  int currentLength = inputStr.length();

  // Если строка короче целевой длины, добавляем пробелы по краям
  if (currentLength < targetLength) {
    int spacesNeeded = targetLength - currentLength;
    int leftSpaces = spacesNeeded / 2;
    int rightSpaces = spacesNeeded - leftSpaces;

    String paddedString = "";
    for (int i = 0; i < leftSpaces; ++i) {
      paddedString += " ";
    }
    paddedString += inputStr;
    for (int i = 0; i < rightSpaces; ++i) {
      paddedString += " ";
    }

    inputStr = paddedString;
  }

  // Остальная часть функции остается без изменений
  uint16_t h[8]; // Массив для хранения результатов
  uint16_t data = 0; // Инициализируем переменную data
  char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов


  // Проверяем, что длина строки >= 5, ели надо больше указываем больше
  if (strlen(outputChars) >= 8) {
    for (int i = 0; i < 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case 'A': data = 0b11010100010011; break;
      case 'B': data = 0b00000111010011; break;
      case 'C': data = 0b11000101000000; break;
      case 'D': data = 0b00000111000011; break;
      case 'E': data = 0b11010101010000; break;
      case 'F': data = 0b11010100000000; break;
      case 'G': data = 0b11000101010001; break;
      case 'H': data = 0b11010000010011; break;
      case 'I': data = 0b00000111000000; break;
      case 'J': data = 0b01000001000011; break;
      case 'K': data = 0b11010000101000; break;
      case 'L': data = 0b11000001000000; break;
      case 'M': data = 0b11100000100011; break;
      case 'N': data = 0b11100000001011; break;
      case 'O': data = 0b11000101000011; break;
      case 'P': data = 0b11010100010010; break;
      case 'Q': data = 0b11000101001011; break;
      case 'R': data = 0b11010100011010; break;
      case 'S': data = 0b00100101010001; break;
      case 'T': data = 0b00000110000000; break;
      case 'U': data = 0b11000001000011; break;
      case 'V': data = 0b11001000100000; break;
      case 'W': data = 0b11001000001011; break;
      case 'X': data = 0b00101000101000; break;
      case 'Y': data = 0b00100010100000; break;
      case 'Z': data = 0b00001101100000; break;
      case ' ': data = 0b00000000000000; break;
      default: Serial.println("Неверный первый символ."); break;
  }
     Serial.println(outputChars[i]);
     h[i]=data;
      
  }}
  
  h1=h[0];
  h2=h[1];
  h3=h[2];
  h4=h[3];
  h5=h[4];
  h6=h[5];
  h7=h[6];
  h8=h[7];
  
  
  delete[] outputChars; // Освобождаем выделенную память
}


char* stringToCharArray(String str) {
  int len = str.length() + 1;
  char *buffer = new char[len];
  str.toCharArray(buffer, len);
  return buffer;
}







int segm(int cif){
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b11000101000011;break;//0
    case 1: data_out=0b00000000000011;break;//1 
    case 2: data_out=0b01010101010010;break;//2
    case 3: data_out=0b00010101010011;break;//3 
    case 4: data_out=0b10010000010011;break;//4  
    case 5: data_out=0b10010101010001;break;//5 
    case 6: data_out=0b11010101010001;break;//6   
    case 7: data_out=0b00000100000011;break;//7   
    case 8: data_out=0b11010101010011;break;//8   
    case 9: data_out=0b10010101010011;break;//9  
   case 10: data_out=0b00000000000000;break;// пусто
   case 11: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
   
  int buk(int cif1){
  unsigned int data_out;
  switch(cif1){
    case 0: data_out=0b11010100010011;break;//A
    case 1: data_out=0b00000111010011;break;//B
    case 2: data_out=0b11000101000000;break;//C
    case 3: data_out=0b00000111000011;break;//D 
    case 4: data_out=0b11010101010000;break;//E  
    case 5: data_out=0b11010100000000;break;//F 
    case 6: data_out=0b11000101010001;break;//G   
    case 7: data_out=0b11010000010011;break;//H   
    case 8: data_out=0b00000111000000;break;//I   
    case 9: data_out=0b01000001000011;break;//J 
    case 11: data_out=0b11010000101000;break;//K
    case 12: data_out=0b11000001000000;break;//L 
    case 13: data_out=0b11100000100011;break;//M
    case 14: data_out=0b11100000001011;break;//N
    case 15: data_out=0b11000101000011;break;//O
    case 16: data_out=0b11010100010010;break;//P
    case 17: data_out=0b11000101001011;break;//Q
    case 18: data_out=0b11010100011010;break;//R
    case 19: data_out=0b00100101010001;break;//S
    case 20: data_out=0b00000110000000;break;//T
    case 21: data_out=0b11000001000011;break;//U
    case 22: data_out=0b11001000100000;break;//V
    case 23: data_out=0b11001000001011;break;//W
    case 24: data_out=0b00101000101000;break;//X
    case 25: data_out=0b00100010100000;break;//Y
    case 26: data_out=0b00001101100000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  } 
  int znak(int cif){//допоснительные знаки
  unsigned int data_out;
  switch(cif){
    case 0: data_out=0b00010001000000;break;//0
  
   case 2: data_out=0b00000000000000;break;// пусто
   case 3: data_out=0b11111111111011;break;// все
    
    }
    return data_out;
  }  







  void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
  /// addr 8 bit
     digitalWrite(CE,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr >> i) & 1); 
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(CE,HIGH);

// data 156 bit
  // 1-24 seg
     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 >> i) & 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b1 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b2 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 31;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b3 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

     for(int i = 27;i >= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b4 >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
    
// control data 4 bit     
for(int i = 3; i >= 0; i--){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (contr >> i) & 1);
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 
     digitalWrite(CE,LOW);
     digitalWrite(CL,LOW);
     delay(10);
  }  
void print_out(){
  unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
  byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10; 
  byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5; 
  byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
  byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
  byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
  write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5,    0b0000);
  } 
  
  void clear_lcd(){
    h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10);    h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
   print_out();
   }
   
   void RGB(int R, int G, int B){
  analogWrite(R_PIN, R);
  analogWrite(G_PIN, G);
  analogWrite(B_PIN, B);
}

25

Re: вывод RDS(rda5807m) на панельку от магнитолы

RDS вывелся на экран и монитор порта, но если переключить частоту надпись на экране остается http://forum.rcl-radio.ru/uploads/images/2025/02/71ebb2abb2bbf7fa863dfe99472b4d0c.png