mathertel / Radio

An Arduino library to control FM radio chips like SI4703, SI4705, RDA5807M, TEA5767.
http://mathertel.github.io/Radio
BSD 3-Clause "New" or "Revised" License
297 stars 89 forks source link

RDA5807M + Arduino Pro Micro + SerialRadio Example = Random Freezing #14

Closed MatPeff closed 1 year ago

MatPeff commented 7 years ago

Hello, At the beginning thank you for this work , It's very interesting project and comprehensive solution to easy implement of SDR receivers. I have a problem like this : I connected typical RDA5807 module to Arduino Micro and have uploaded example from your library - SerialRadio. Everything looked good , i could give serial commands to the radio( like frequency change (fxxxxx) , seekUp , seekDown , volume +/- ) , i could receive RDS messages but after few minutes I lost communication with radio via serial. In other case i have connected a LCD with I2C converter and encoder to manually control of radio(change frq , vol etc...) . Frequency , and RDS was displayed properly , I could control radio by encoder but after few minutes everything froze again and I couldn't control radio by encoder. RDS refreshing was frozing too. I2C Addresses of LCD and RDA are different , I think that isn't a problem. In my custom implementation I turned off a serial communication. I have tried to comment parts of code with control encoder but It still isn't It and It did not help.

Below is my implementation of your code with LCD control :

include

include

include

include

include

include

include

define outputA 6

define outputB 7

define zeroButton 8

int counter = 0; int aState; int aLastState;
int n = LOW; unsigned long swTime = 0; bool turnRight = false; bool turnLeft = false; int mode = 0; int volumeEnc = 0; int volumeSet; RADIO_FREQ fqToSave;

byte Vol1[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B11111, };

byte Vol2[8] = { B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111, };

byte Vol3[8] = { B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111, };

byte Vol4[8] = { B00000, B00000, B00000, B00000, B11111, B11111, B11111, B11111, };

byte Vol5[8] = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111, };

byte Vol6[8] = { B00000, B00000, B11111, B11111, B11111, B11111, B11111, B11111, };

byte Vol7[8] = { B00000, B11111, B11111, B11111, B11111, B11111, B11111, B11111, };

byte Vol8[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, };

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set LCD address on 0x3F RADIO_FREQ preset[] = { 10160, 9300, 10270, 8850, 8890, 8930, 8980, 9180, 9220, }; int i_sidx=0; ///< Start at Station with index=5 RDA5807M radio; ///< Create an instance of a RDA5807 chip radio RDSParser rds; void DisplayFrequency(RADIO_FREQ f) { char s[12]; radio.formatFrequency(s, sizeof(s)); lcd.clear(); lcd.setCursor(0,0); lcd.print(s); lcd.print(" "); if(mode == 0) { lcd.print("Tun"); }

if(mode == 1) { lcd.print("Mem"); lcd.print(" "); lcd.print(i_sidx+1); }

if(mode == 2) { lcd.print("Vol"); } lcd.setCursor(8,1); lcd.print(" ");

if(volumeEnc == 0) {};

if(volumeEnc > 1 && volumeEnc <5) { lcd.write((uint8_t)0); };

if(volumeEnc > 4 && volumeEnc < 8) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); };

if(volumeEnc > 7 && volumeEnc < 9) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); };

if(volumeEnc > 8 && volumeEnc < 11) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); };

if(volumeEnc > 10 && volumeEnc < 13) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); };

if(volumeEnc > 12 && volumeEnc < 14) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); lcd.write((uint8_t)5); };

if(volumeEnc > 13 && volumeEnc < 16) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); lcd.write((uint8_t)5); lcd.write((uint8_t)6); }; }

void DisplayServiceName(char *name) {

char s[12]; radio.formatFrequency(s, sizeof(s));
lcd.clear(); lcd.setCursor(0,0); lcd.print(s); lcd.print(" "); if(mode == 0) { lcd.print("Tun"); } if(mode == 1) { lcd.print("Mem"); lcd.print(" "); lcd.print(i_sidx+1); } if(mode == 2) { lcd.print("Vol"); } lcd.setCursor(0,1); lcd.print(name); lcd.print(" "); if(volumeEnc == 0) { };

if(volumeEnc > 1 && volumeEnc <5) { lcd.write((uint8_t)0); };

if(volumeEnc > 4 && volumeEnc < 8) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); };

if(volumeEnc > 7 && volumeEnc < 9) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); };

if(volumeEnc > 8 && volumeEnc < 11) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); };

if(volumeEnc > 10 && volumeEnc < 13) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); };

if(volumeEnc > 12 && volumeEnc < 14) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); lcd.write((uint8_t)5); };

if(volumeEnc > 13 && volumeEnc < 16) { lcd.write((uint8_t)0); lcd.write((uint8_t)1); lcd.write((uint8_t)2); lcd.write((uint8_t)3); lcd.write((uint8_t)4); lcd.write((uint8_t)5); lcd.write((uint8_t)6); }; } // DisplayServiceName()

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

void SetRadioVolumeByENC(int val){ if(val == 0) { radio.setMute(true); } else { radio.setMute(false); } radio.setVolume(val); }

void setup() { pinMode (outputA,INPUT_PULLUP); pinMode (outputB,INPUT_PULLUP);
pinMode (zeroButton , INPUT); digitalWrite(zeroButton, HIGH); aLastState = digitalRead(outputA);
delay(500); lcd.begin(16,2); lcd.createChar(0, Vol1); lcd.createChar(1, Vol2);
lcd.createChar(2, Vol3); lcd.createChar(3, Vol4); lcd.createChar(4, Vol5); lcd.createChar(5, Vol6); lcd.createChar(6, Vol7); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Radio FM"); delay(1000); lcd.setCursor(0,1); lcd.print("Version 1"); delay(1000); radio.init(); radio.setBandFrequency(RADIO_BAND_FM, preset[i_sidx]); // 5. preset. radio.setMono(false); radio.setMute(false);
radio.setVolume(5); volumeEnc = 5; radio.attachReceiveRDS(RDS_process); rds.attachServicenNameCallback(DisplayServiceName);
}

/// Constantly check for serial input commands and trigger command execution. void loop() { unsigned long now = millis(); static unsigned long nextFreqTime = 0; static RADIO_FREQ lastf = 0; RADIO_FREQ f = 0;

if (digitalRead(zeroButton) == LOW) { swTime = millis(); delay(500); //debounce // check if the switch is pressed for longer than 1 second. if(digitalRead(zeroButton) == LOW && swTime - millis() > 5000) {
if(mode == 1) { fqToSave = radio.getFrequency();
preset[i_sidx] = fqToSave;
} char s1[12]; radio.formatFrequency(s1, sizeof(s1)); delay(1000); } else {
if(mode == 2) { mode = 0; } else { mode++; } int fq = radio.getFrequency(); DisplayFrequency(fq); } }

n = digitalRead(outputA); if((aLastState == LOW) && (n == HIGH)) { if (digitalRead(outputB) == LOW) { if(mode==0) { radio.seekUp(false); //radio.seekDown(true); } if(mode == 2) { if(volumeEnc<15) { volumeEnc++; SetRadioVolumeByENC(volumeEnc); int fq = radio.getFrequency(); DisplayFrequency(fq); }
} if(mode == 1) {
if (i_sidx < (sizeof(preset) / sizeof(RADIO_FREQ))-1) { i_sidx++; radio.setFrequency(preset[i_sidx]); int fq = radio.getFrequency(); DisplayFrequency(fq); } } } else { if(mode==0) { radio.seekDown(false); //radio.seekUp(true); } if(mode == 2) { if(volumeEnc>0) { volumeEnc--; SetRadioVolumeByENC(volumeEnc); int fq = radio.getFrequency(); DisplayFrequency(fq); }
} if(mode == 1) { if (i_sidx > 0) { i_sidx--; radio.setFrequency(preset[i_sidx]); int fq = radio.getFrequency(); DisplayFrequency(fq); } } }
} aLastState = n; radio.checkRDS(); if (now > nextFreqTime) { f = radio.getFrequency(); if (f != lastf) { // print current tuned frequency DisplayFrequency(f); lastf = f; } // if nextFreqTime = now + 400; } // if
}

Could you help me with this problem ? I would be very grateful for your help :) Best regards. Matthew.

wmarkow commented 6 years ago

@MatPeff, do you still have this freezing problem? Maybe you suffer to this arduino/Arduino#1476 issue in Wire library? Take a look at my wmarkow/arduino-hifi#3 where I describe my problems with a blocked I2C; maybe it will help you. At least you can use ArduinoCrashMonitor to find the place in the code which is responsible for freezing.

mathertel commented 1 year ago

closed as there was no activity.