<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; вывод RDS(rda5807m) на панельку от магнитолы]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=693&amp;type=atom" />
	<updated>2025-02-13T17:29:51Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=693</id>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11412#p11412" />
			<content type="html"><![CDATA[<p>void ff(){<br />&nbsp; el_9 =&nbsp; (info.stereo ? 1 : 0);</p><p>&nbsp; int sec12 = (float)f;<br />&nbsp; h2 = segm(sec12/1000%10);<br />&nbsp; h3 = segm(sec12/100%10);<br />&nbsp; h4 = segm(sec12/10%10);<br />&nbsp; h6 = buk(5);<br />&nbsp; h7 = buk(13);<br />&nbsp; &nbsp; &nbsp;if(sec12/10000==1){h1 = segm(1);}<br />&nbsp; &nbsp; &nbsp; else{h1 = segm(10);}<br />&nbsp; &nbsp; &nbsp; toch=1;<br />&nbsp; &nbsp; &nbsp; h5=segm(sec12%10);<br />&nbsp; &nbsp; &nbsp; print_out();}</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-13T17:29:51Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11412#p11412</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11411#p11411" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv=1;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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;
bool cler;
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 DisplayServiceName(char* name) {
  if(cler==1){cler=0;name=&quot;&quot;;}
    if (strcmp(name, &quot;&quot;) != 0) {
        stv = 0;
        toch=0;
        str(name);
        print_out();
    } else{stv=1;}
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   


void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      case &#039;*&#039;: data = 0b00101010101000;break;//* 
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 29: data_out=0b00000000000000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
 //  case 29: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  el_9 =  (info.stereo ? 1 : 0);

  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;
      h5=buk(27);
      print_out();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-13T16:53:38Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11411#p11411</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11410#p11410" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv=1;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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;
bool cler;
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 DisplayServiceName(char* name) {
  if(cler==1){cler=0;name=&quot;&quot;;}
    if (strcmp(name, &quot;&quot;) != 0) {
        stv = 0;
        toch=0;
        str(name);
        print_out();
    } else{stv=1;}
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   


void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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() {

  Serial.println(info.stereo);


  if(digitalRead(3)==0){stat++;delay(200);if(stat&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      case &#039;*&#039;: data = 0b00101010101000;break;//* 
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 29: data_out=0b00000000000000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
 //  case 29: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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;
      h5=buk(27);
      print_out();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-13T16:41:34Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11410#p11410</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11409#p11409" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv=1;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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;
bool cler;
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 DisplayServiceName(char* name) {
  if(cler==1){cler=0;name=&quot;&quot;;}
    if (strcmp(name, &quot;&quot;) != 0) {
        stv = 0;
        toch=0;
        str(name);
        print_out();
    } else{stv=1;}
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   


void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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() {

  Serial.println(info.stereo ? 1 : 0);


  if(digitalRead(3)==0){stat++;delay(200);if(stat&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      case &#039;*&#039;: data = 0b00101010101000;break;//* 
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 29: data_out=0b00000000000000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
 //  case 29: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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;
      h5=buk(27);
      print_out();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-13T16:22:06Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11409#p11409</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11408#p11408" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv=1;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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 DisplayServiceName(char* name) {
    if (strcmp(name, &quot;&quot;) != 0) {
        stv = 0;
        toch=0;
        str(name);
        print_out();
    } else{stv=1;}
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   


void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 29: data_out=0b00000000000000;break;//Z
   case 27: data_out=0b00000000000000;break;// пусто
   case 28: data_out=0b11111111111011;break;// все
   case 29: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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;
      h5=buk(27);
      print_out();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2025-02-13T16:15:54Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11408#p11408</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11407#p11407" />
			<content type="html"><![CDATA[<p>все,все проблемы устранил,но рдс по прежнему плохо находит</p>]]></content>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2025-02-13T16:05:23Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11407#p11407</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11406#p11406" />
			<content type="html"><![CDATA[<p>всё работает, но очень тупо работает приём RDS то он есть, то его нету на других станциях (хотя он там есть), и надо сделать очистку экрана, когда происходит переключение с текста на частоту в пустых местах остаются буквы</p>]]></content>
			<author>
				<name><![CDATA[vladbuharkin20]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2352</uri>
			</author>
			<updated>2025-02-13T15:47:59Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11406#p11406</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11405#p11405" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv=1;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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 DisplayServiceName(char* name) {
    if (strcmp(name, &quot;&quot;) != 0) {
        stv = 0;
        str(name);
        print_out();
    } else{stv=1;}
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   


void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T17:34:37Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11405#p11405</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11404#p11404" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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 DisplayServiceName(char* name) {
    if (stv == 1) {
        name = &quot;&quot;;
    }
    stv = 0;
    if (strcmp(name, &quot;&quot;) != 0) {
        str(name);
        print_out();
    } else {
      ff();
    }
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   









void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T15:04:07Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11404#p11404</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11403#p11403" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;

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 DisplayServiceName(char* name) {
    if (stv == 1) {
        name = &quot;&quot;;
    }
    stv = 0;
    if (strcmp(name, &quot;&quot;) != 0) {
        str(name);
        print_out();
    } else {
       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();
    }
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}

   









void setup() {
  Serial.begin(9600);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}

void ff(){
  
  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();}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T15:00:47Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11403#p11403</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11402#p11402" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;

void DisplayServiceName(char* name) {
    if (stv == 1) {
        name = &quot;&quot;;
    }
    stv = 0;
    if (strcmp(name, &quot;&quot;) != 0) {
        str(name);
        print_out();
    } else {
        str(convertToMhz(f));
        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);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 27: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T14:38:18Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11402#p11402</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11401#p11401" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;

void DisplayServiceName(char* name) {
    if (stv == 1) {
        name = &quot;&quot;;
    }
    stv = 0;
    if (*name != &#039;\0&#039;){
        str(name);
        print_out();
    } else {
        str(convertToMhz(f));
        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);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 27: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T14:37:39Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11401#p11401</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11400#p11400" />
			<content type="html"><![CDATA[<p>Есть проблема определения наличия строки RDS, что она не пустая, вот код но он плохо работает:</p><p>void DisplayServiceName(char* name) {<br />&nbsp; &nbsp; if (stv == 1) {<br />&nbsp; &nbsp; &nbsp; &nbsp; name = &quot;&quot;;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; stv = 0;<br />&nbsp; &nbsp; if (strlen(name) &gt; 0) {<br />&nbsp; &nbsp; &nbsp; &nbsp; str(name);<br />&nbsp; &nbsp; &nbsp; &nbsp; print_out();<br />&nbsp; &nbsp; } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; str(convertToMhz(f));<br />&nbsp; &nbsp; &nbsp; &nbsp; print_out();<br />&nbsp; &nbsp; }<br />}</p><p>Есть несколько вариантов определения пустой строки, но не факт что они сработают. </p><p>Я дам несколько вариантов определения пустой строки, возможно один из вариантов сработает</p>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T14:37:08Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11400#p11400</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11399#p11399" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;

void DisplayServiceName(char *name){
    if (stv == 1) {
        // Очищаем строку, на которую указывает name
        memset(name, 0, strlen(name) + 1);  // Заполняем строку нулями
    }
    stv = 0;
    if (strlen(name) &gt; 0) {
        str(name);
        print_out();
    } else {
        str(convertToMhz(f));
        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);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 27: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T14:28:18Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11399#p11399</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: вывод RDS(rda5807m) на панельку от магнитолы]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=11398#p11398" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#include &lt;Wire.h&gt;
#include &lt;radio.h&gt;
#include &lt;RDA5807M.h&gt;
//#include &lt;LiquidCrystalRus.h&gt;
#include &lt;EEPROM.h&gt;//#include &lt;EEPROMex.h&gt;
#include &lt;RDSParser.h&gt;
#include &lt;MsTimer2.h&gt; 
#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};
bool stv;
void DisplayServiceName(char *name){if(stv==1){name = &quot;&quot;;}stv=0;if (strlen(name) &gt; 0){str(name);print_out();} else {str(convertToMhz(f));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);
   str(&quot;M-CARLO&quot;);
 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();

 Serial.println(convertToMhz(10180));
  
  
  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&gt;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(&amp;info);start=1;}
  
 //Serial.println(stat);

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


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

   }//menu0 конец
  

 
 
  
} // LOOP


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

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

    String paddedString = &quot;&quot;;
    for (int i = 0; i &lt; leftSpaces; ++i) {
      paddedString += &quot; &quot;;
    }
    paddedString += inputStr;
    for (int i = 0; i &lt; rightSpaces; ++i) {
      paddedString += &quot; &quot;;
    }

    inputStr = paddedString;
  }

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


  // Проверяем, что длина строки &gt;= 5, ели надо больше указываем больше
  if (strlen(outputChars) &gt;= 8) {
    for (int i = 0; i &lt; 8; i++) {
    
    
    switch(outputChars[i]) { // коды символов, те что Вы мне прислали
      case &#039;A&#039;: data = 0b11010100010011; break;
      case &#039;B&#039;: data = 0b00000111010011; break;
      case &#039;C&#039;: data = 0b11000101000000; break;
      case &#039;D&#039;: data = 0b00000111000011; break;
      case &#039;E&#039;: data = 0b11010101010000; break;
      case &#039;F&#039;: data = 0b11010100000000; break;
      case &#039;G&#039;: data = 0b11000101010001; break;
      case &#039;H&#039;: data = 0b11010000010011; break;
      case &#039;I&#039;: data = 0b00000111000000; break;
      case &#039;J&#039;: data = 0b01000001000011; break;
      case &#039;K&#039;: data = 0b11010000101000; break;
      case &#039;L&#039;: data = 0b11000001000000; break;
      case &#039;M&#039;: data = 0b11100000100011; break;
      case &#039;N&#039;: data = 0b11100000001011; break;
      case &#039;O&#039;: data = 0b11000101000011; break;
      case &#039;P&#039;: data = 0b11010100010010; break;
      case &#039;Q&#039;: data = 0b11000101001011; break;
      case &#039;R&#039;: data = 0b11010100011010; break;
      case &#039;S&#039;: data = 0b00100101010001; break;
      case &#039;T&#039;: data = 0b00000110000000; break;
      case &#039;U&#039;: data = 0b11000001000011; break;
      case &#039;V&#039;: data = 0b11001000100000; break;
      case &#039;W&#039;: data = 0b11001000001011; break;
      case &#039;X&#039;: data = 0b00101000101000; break;
      case &#039;Y&#039;: data = 0b00100010100000; break;
      case &#039;Z&#039;: data = 0b00001101100000; break;
      case &#039; &#039;: data = 0b00000000000000; break;
      case &#039;0&#039;: data = 0b11000101000011;break;//0
      case &#039;1&#039;: data = 0b00000000000011;break;//1 
      case &#039;2&#039;: data = 0b01010101010010;break;//2
      case &#039;3&#039;: data = 0b00010101010011;break;//3 
      case &#039;4&#039;: data = 0b10010000010011;break;//4  
      case &#039;5&#039;: data = 0b10010101010001;break;//5 
      case &#039;6&#039;: data = 0b11010101010001;break;//6   
      case &#039;7&#039;: data = 0b00000100000011;break;//7   
      case &#039;8&#039;: data = 0b11010101010011;break;//8   
      case &#039;9&#039;: data = 0b10010101010011;break;//9  
      default:  data = 0b00000000000000;Serial.println(&quot;Неверный первый символ.&quot;); 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 27: data_out=0b00000000000000;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 &lt;= 7; i++){
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (addr &gt;&gt; i) &amp; 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 &gt;= 0; i--){ 
     digitalWrite(CL,LOW);delayMicroseconds(10);
     digitalWrite(DI, (b0 &gt;&gt; i) &amp; 1);    
     digitalWrite(CL,HIGH);delayMicroseconds(10);
     } 

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

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

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

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

String convertToMhz(int value) {
    float frequency = float(value) / 100.0;
    char buffer[9];  // 8 символов + завершающий ноль
    
    // Преобразуем значение в строку с одним знаком после запятой
    dtostrf(frequency, 5, 1, buffer);
    
    // Обрезаем строку до 5 символов и добавляем &quot;MHz&quot;
    buffer[5] = &#039;\0&#039;;  // Завершаем строку после 5-го символа
    strcat(buffer, &quot;MHz&quot;);
    
    return String(buffer);
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2025-02-12T14:21:17Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=11398#p11398</id>
		</entry>
</feed>
