Тема: вывод RDS(rda5807m) на панельку от магнитолы
Данный контент доступен только зарегистрированным пользователям.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → вывод RDS(rda5807m) на панельку от магнитолы
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Данный контент доступен только зарегистрированным пользователям.
Попробуйте этот код, при запуске должно появится слово HELLO
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
String inputStr;
long data = 0; // Инициализируем переменную data
long h[7];// это вместо h1 h2 h3 h4 h5
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("HELLO");
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
default: Serial.println("Неверный первый символ."); break;
}
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
print_out();
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
long data = 0; // Инициализируем переменную data
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("HELLO");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
unsigned long h[7]; // Массив для хранения результатов
char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
default: Serial.println("Неверный первый символ."); break;
}
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
всё так же, 10 секунд тишина, потом идет текст
Сейчас точно должно работать
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("HELLO");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
int length = inputStr.length();
uint16_t h[7]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= length) {
for (int i = 0; i < length; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
Текст вывелся, но какие-то артефакты в конце и лишние знаки горят
Выводятся 5 символов, если слово меньше 7 символов нужно выводить пустоту, что бы не было артефактов.
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("HELLO");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
Serial.println(h6,BIN);
Serial.println(h7,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
while (inputStr.length() < 7) {
inputStr += " "; // Добавляем пробелы до тех пор, пока длина не станет 7
}
uint16_t h[7]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразовываем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
всё супер
теперь надо сделать вывод RDS на экран с условием if(присутствует рдс){ команда вывода на экран текста RDS};
else{вывод частоты}
вытаскивая текст RDS из этой команды, он в самом начале скетча, среди переменных
void DisplayServiceName(char *name){}
и желательно текст с RDS всегда отображать в центре экрана, как это сделано на lcd1602
Авто центрирование текста
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("RTE");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
Serial.println(h6,BIN);
Serial.println(h7,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 7;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[7]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
Работает, текст отцентровался
теперь надо сделать вывод RDS на экран с условием if(присутствует рдс){ команда вывода на экран текста RDS};
else{вывод частоты}
вытаскивая текст RDS из этой команды, он в самом начале скетча, среди переменных
void DisplayServiceName(char *name){}
RDS выводится через
void DisplayServiceName(char *name){Serial.print(name);}
RDS выводится в монитор порта?
Надо проверить
Так же надо посмотреть длину текста, а так понимаю на дисплей можно вывести только 7 символов?
Дисплей у меня на 8 мест.RDS выводится
radio.checkRDS(); // RDS - эта функция выводит RDS ?
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){str(name);print_out();} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("RTE");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
Serial.println(h6,BIN);
Serial.println(h7,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 7;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[8]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
h8=h[7];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
Все хорошо, но на пустых местах загораются сегменты
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){str(name);print_out();} // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("RTE");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
Serial.println(h6,BIN);
Serial.println(h7,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 8;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[8]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
h8=h[7];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
Всё четко, пустых нету и еще надо сделать условие "Присутствие рдс", о котором я говорил ранее
это функция вывода частоты
Надо проверить, если есть RDS то выводится RDS , если нет то должна появится надпись NO RDS
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){if(name==1){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
clear_lcd();
str("RTE");
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
Serial.println(h6,BIN);
Serial.println(h7,BIN);
print_out();
delay(10000);
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 8;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[8]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 7) {
for (int i = 0; i < 7; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
h8=h[7];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
Частоты на которых был RDS он пишет что нету, возьмите вот этот скетч, он такой же как у вас, но я его немного доработал(отключил долгую заставку и закомментировал вывод частоты)
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){if(name==1){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
/*
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
*/
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 8;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[8]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 8) {
for (int i = 0; i < 8; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
h8=h[7];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
//#include <LiquidCrystalRus.h>
#include <EEPROM.h>//#include <EEPROMex.h>
#include <RDSParser.h>
#include <MsTimer2.h>
#define CE 7
#define CL 8
#define DI 9
#define pinX A1 // ось X джойстика
#define pinY A0 // ось Y джойстика
#define R_PIN 10 //подсветка дисплея
#define G_PIN 11 //подсветка дисплея
#define B_PIN 12 //подсветка дисплея
#define FIX_BAND RADIO_BAND_FM
RDA5807M radio;
RADIO_INFO info;
RDSParser rds;
char s[12];
int menu,k,f,stat,i1=8700;
int color;
byte vol,bass,z,w,start,start1,t;
unsigned long time;
int i_radio, f_radio;
int f_scan[25]= {8840,9020,9060,9120,9160,9500,9540,9620,9920,10060,10130,10200,10260,10320,10370,10410,10450,10490,10560,10630,10680,10720};
void DisplayServiceName(char *name){if (strlen(name) > 0){str(name);print_out();} else {str("NO RDS");print_out();} } // вывод рдс
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);}
unsigned long byte_1,byte_2,byte_3,byte_4,byte_5;
unsigned long h1,h2,h3,h4,h5,h6,h7,h8;
unsigned long kav_1=0,dvoetoh=0,toch=0,kav_2=0;
unsigned long vu[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned long scm=0, beat=0, soft=0,pop=0;
unsigned long rnd=0,prt=0,lond1=0,cif_1=0;
unsigned long el_12=0,el_11=0,el_10=0,el_9=0,el_8=0,el_7=0,el_6=0,el_5=0,el_4=0,el_3=0,el_2=0,el_1=0;
// MO EON TP ST REG PTY AF AM CD-CH FM 2 3
void setup() {
Serial.begin(9600);
pinMode(pinX, INPUT);
pinMode(pinY, INPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
pinMode(3, INPUT_PULLUP);//кнопка джостика
pinMode(CE, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(DI, OUTPUT);
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
color=5;//включение подсветки дисплея
if(color==5){RGB(255, 255, 255);};
k=0;
f=10200;
radio.init();
radio.debugEnable();
radio.setBandFrequency(FIX_BAND, f);
radio.setVolume(6);
radio.setMono(false);
radio.setMute(false);
radio.attachReceiveRDS(RDS_process);
rds.attachServicenNameCallback(DisplayServiceName);
delay(400);
////////////////////////////ПРИВЕТСТВИЕ////////////////////////////
h1 = buk(7);
h2 = buk(4);
h3 = buk(12);
h4 = buk(12);
h5 = buk(15);
Serial.println(h1,BIN);
Serial.println(h2,BIN);
Serial.println(h3,BIN);
Serial.println(h4,BIN);
Serial.println(h5,BIN);
print_out();
delay(2000);
h1 = buk(27);
h2 = buk(27);
h3 = buk(27);
h4 = buk(27);
h5 = buk(27);
print_out();
delay(30);
clear_lcd();
h4 = buk(9);
h5 = buk(22);
h6 = buk(2);
print_out();
delay(2000);
////////////////////////////////////////////////////////////////
clear_lcd();
} //setup
void loop() {
if(digitalRead(3)==0){stat++;delay(200);if(stat>1){stat=0;}radio.setBassBoost(stat);delay(100);}//включение bassboost
radio.checkRDS();
radio.formatFrequency(s, sizeof(s));
if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(200);radio.getRadioInfo(&info);start=1;}
//Serial.println(stat);
if(menu==0){//первое меню(тестовое)
if(analogRead(pinY)==0){f=f+10;t=1;if(f<8700){f=8700;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной +
if(analogRead(pinY)==1023){f=f-10;t=1;if(f>10800){f=8800;}start=0;time=millis();delay(100);radio.checkRDS();} //ручной -
if(analogRead(pinX)==1023){k++;if(k>25){k=0;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные +
if(analogRead(pinX)==0){k--;if(k<0){k=25;}delay(100);f=f_scan[k];w=1;time=millis();start=0;} //сохранёные -
//lcd.setCursor(0,0);lcd.print(info.tuned ? "TUNED" : "-----");// //подсказки для меня чтобы не забыть название команды которые пригодятся в будущем
//lcd.setCursor(14,1);lcd.print(info.rssi);
//lcd.setCursor(6,0);lcd.print((float)f/100);lcd.print(" MHz ");
//lcd.setCursor(0,1);lcd.print("K");lcd.print(k);
radio.checkRDS(); // RDS
//вывод частоты
/*
int sec12 = (float)f/10;
h2 = segm(sec12/100%10);
h3 = segm(sec12/10%10);
h4 = segm(sec12%10);
h6 = buk(5);
h7 = buk(13);
if(sec12/1000==1){h1 = segm(1);}
else{h1 = segm(10);}
toch=1;
print_out();
*/
}//menu0 конец
} // LOOP
void str(String inputStr){
const int targetLength = 8;
int currentLength = inputStr.length();
// Если строка короче целевой длины, добавляем пробелы по краям
if (currentLength < targetLength) {
int spacesNeeded = targetLength - currentLength;
int leftSpaces = spacesNeeded / 2;
int rightSpaces = spacesNeeded - leftSpaces;
String paddedString = "";
for (int i = 0; i < leftSpaces; ++i) {
paddedString += " ";
}
paddedString += inputStr;
for (int i = 0; i < rightSpaces; ++i) {
paddedString += " ";
}
inputStr = paddedString;
}
// Остальная часть функции остается без изменений
uint16_t h[8]; // Массив для хранения результатов
uint16_t data = 0; // Инициализируем переменную data
char *outputChars = stringToCharArray(inputStr); // Преобразуем строку в массив символов
// Проверяем, что длина строки >= 5, ели надо больше указываем больше
if (strlen(outputChars) >= 8) {
for (int i = 0; i < 8; i++) {
switch(outputChars[i]) { // коды символов, те что Вы мне прислали
case 'A': data = 0b11010100010011; break;
case 'B': data = 0b00000111010011; break;
case 'C': data = 0b11000101000000; break;
case 'D': data = 0b00000111000011; break;
case 'E': data = 0b11010101010000; break;
case 'F': data = 0b11010100000000; break;
case 'G': data = 0b11000101010001; break;
case 'H': data = 0b11010000010011; break;
case 'I': data = 0b00000111000000; break;
case 'J': data = 0b01000001000011; break;
case 'K': data = 0b11010000101000; break;
case 'L': data = 0b11000001000000; break;
case 'M': data = 0b11100000100011; break;
case 'N': data = 0b11100000001011; break;
case 'O': data = 0b11000101000011; break;
case 'P': data = 0b11010100010010; break;
case 'Q': data = 0b11000101001011; break;
case 'R': data = 0b11010100011010; break;
case 'S': data = 0b00100101010001; break;
case 'T': data = 0b00000110000000; break;
case 'U': data = 0b11000001000011; break;
case 'V': data = 0b11001000100000; break;
case 'W': data = 0b11001000001011; break;
case 'X': data = 0b00101000101000; break;
case 'Y': data = 0b00100010100000; break;
case 'Z': data = 0b00001101100000; break;
case ' ': data = 0b00000000000000; break;
default: Serial.println("Неверный первый символ."); break;
}
Serial.println(outputChars[i]);
h[i]=data;
}}
h1=h[0];
h2=h[1];
h3=h[2];
h4=h[3];
h5=h[4];
h6=h[5];
h7=h[6];
h8=h[7];
delete[] outputChars; // Освобождаем выделенную память
}
char* stringToCharArray(String str) {
int len = str.length() + 1;
char *buffer = new char[len];
str.toCharArray(buffer, len);
return buffer;
}
int segm(int cif){
unsigned int data_out;
switch(cif){
case 0: data_out=0b11000101000011;break;//0
case 1: data_out=0b00000000000011;break;//1
case 2: data_out=0b01010101010010;break;//2
case 3: data_out=0b00010101010011;break;//3
case 4: data_out=0b10010000010011;break;//4
case 5: data_out=0b10010101010001;break;//5
case 6: data_out=0b11010101010001;break;//6
case 7: data_out=0b00000100000011;break;//7
case 8: data_out=0b11010101010011;break;//8
case 9: data_out=0b10010101010011;break;//9
case 10: data_out=0b00000000000000;break;// пусто
case 11: data_out=0b11111111111011;break;// все
}
return data_out;
}
int buk(int cif1){
unsigned int data_out;
switch(cif1){
case 0: data_out=0b11010100010011;break;//A
case 1: data_out=0b00000111010011;break;//B
case 2: data_out=0b11000101000000;break;//C
case 3: data_out=0b00000111000011;break;//D
case 4: data_out=0b11010101010000;break;//E
case 5: data_out=0b11010100000000;break;//F
case 6: data_out=0b11000101010001;break;//G
case 7: data_out=0b11010000010011;break;//H
case 8: data_out=0b00000111000000;break;//I
case 9: data_out=0b01000001000011;break;//J
case 11: data_out=0b11010000101000;break;//K
case 12: data_out=0b11000001000000;break;//L
case 13: data_out=0b11100000100011;break;//M
case 14: data_out=0b11100000001011;break;//N
case 15: data_out=0b11000101000011;break;//O
case 16: data_out=0b11010100010010;break;//P
case 17: data_out=0b11000101001011;break;//Q
case 18: data_out=0b11010100011010;break;//R
case 19: data_out=0b00100101010001;break;//S
case 20: data_out=0b00000110000000;break;//T
case 21: data_out=0b11000001000011;break;//U
case 22: data_out=0b11001000100000;break;//V
case 23: data_out=0b11001000001011;break;//W
case 24: data_out=0b00101000101000;break;//X
case 25: data_out=0b00100010100000;break;//Y
case 26: data_out=0b00001101100000;break;//Z
case 27: data_out=0b00000000000000;break;// пусто
case 28: data_out=0b11111111111011;break;// все
}
return data_out;
}
int znak(int cif){//допоснительные знаки
unsigned int data_out;
switch(cif){
case 0: data_out=0b00010001000000;break;//0
case 2: data_out=0b00000000000000;break;// пусто
case 3: data_out=0b11111111111011;break;// все
}
return data_out;
}
void write_byte(byte addr, unsigned long b0, unsigned long b1, unsigned long b2, unsigned long b3, unsigned long b4, byte contr){
/// addr 8 bit
digitalWrite(CE,LOW);
for(int i = 0; i <= 7; i++){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (addr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(CE,HIGH);
// data 156 bit
// 1-24 seg
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b0 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b1 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b2 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 31;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b3 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
for(int i = 27;i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (b4 >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
// control data 4 bit
for(int i = 3; i >= 0; i--){
digitalWrite(CL,LOW);delayMicroseconds(10);
digitalWrite(DI, (contr >> i) & 1);
digitalWrite(CL,HIGH);delayMicroseconds(10);
}
digitalWrite(CE,LOW);
digitalWrite(CL,LOW);
delay(10);
}
void print_out(){
unsigned long vu_code = vu[1]<<24|vu[2]<<23|vu[3]<<22|vu[4]<<21|vu[5]<<20|vu[6]<<19|vu[7]<<18|vu[8]<<17|vu[9]<<16|vu[10]<<15|vu[11]<<14| vu[12]<<11|vu[13]<<8;
byte_1 = h1>>7 | vu[0]<<25 | vu_code | scm<<13 | beat<<12 |soft<<9 | pop<<10;
byte_2 = (h1&0b1111111)<<25 | h2<<10 |kav_1<<12 | dvoetoh<<9 | h3>>5;
byte_3 = (h3&0b11111)<<27 | toch<<29 | h4<<12 | kav_2<<14 | h5>>3;
byte_4 = (h5&0b111)<<29 | h6<<14 | h7>>1 | lond1<<1 | cif_1<<13;
byte_5 = (h7&1)<<27 | h8<<12 | rnd<<14|prt<<26| el_12<<11|el_11<<10|el_10<<9|el_9<<8|el_8<<7|el_7<<6|el_6<<5|el_5<<4|el_4<<3|el_3<<2|el_2<<1|el_1;
write_byte(0x41, byte_1,byte_2,byte_3,byte_4,byte_5, 0b0000);
}
void clear_lcd(){
h1 = segm(10); h2 = segm(10); h3 = segm(10);h4 = segm(10);h5 = segm(10);h6 = segm(10);h7 = segm(10);h8 = segm(10); h1 = buk(27); h2 = buk(27); h3 = buk(27);h4 = buk(27);h5 = buk(27);h6 = buk(27);h7 = buk(27);h8 = buk(27);
print_out();
}
void RGB(int R, int G, int B){
analogWrite(R_PIN, R);
analogWrite(G_PIN, G);
analogWrite(B_PIN, B);
}
RDS вывелся на экран и монитор порта, но если переключить частоту надпись на экране остается
Чтобы отправить ответ, вы должны войти или зарегистрироваться
forum.rcl-radio.ru → Тестирование скетчей → вывод RDS(rda5807m) на панельку от магнитолы
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|