Closed MatPeff closed 1 year 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.
closed as there was no activity.
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.