Liste der Anhänge anzeigen (Anzahl: 1)
FM-Radio mit Arduino Pro Mini und Si4703 - Programm hängt sich auf!
Hallo Leute,
ich betreibe ein SI4703 breakout an einem Pro-Mini. Gesteuert wird mit 5 Tastern.
2x Volume +/-
1x Wechsel zu nächster Station (10 Stationen voreingestellt)
2x +/- Scan zu nächster auffindbarer Station
KEINE RDS-Auswertung.
Die Anzeige der Daten erfolgt auf OLED 128x64.
Code:
/**************************************************************************
* This code is a modification/extract of several example-codes that come *
* with different si4703-libraries. Libraries used are fetched from: *
* http://www.mathertel.de/Arduino/RadioLibrary.aspx *
* Not sure if other libraries work with same code. *
* 5 push-buttons control the radio (see comments in code) *
* OLED-display shows 3 lines: *
* 1- "frequency" *
* 2- "station name" or "scan mode" *
* 3- "volume level" + "battery voltage" or "CHARGE BATTERY" *
* Code for voltage monitoring is fetched from: *
* https://code.google.com/archive/p/tinkerit/wikis/SecretVoltmeter.wiki *
* *
* U.Galepp Jan./2018 *
**************************************************************************/
#include <Arduino.h>
#include <Wire.h>
#include <radio.h>
#include <si4703.h>
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // define type of display (OLED 0.96" 128x64 pix)
#define FIX_BAND RADIO_BAND_FM // the band that will be tuned by this sketch is FM
#define FIX_STATION 8760 // station at start-up is 87.60 MHz
#define FIX_VOLUME 1 // volume level at start-up
SI4703 radio; // Create an instance of Class for Si4703 Chip
int volume = FIX_VOLUME;
int button_1 = 3; // button volume up at Pin 3
int button_2 = 4; // button volume down at Pin 4
int button_3 = 5; // button station swap at Pin 5
int button_4 = 6; // button scan up at Pin 6
int button_5 = 7; // button scan down at Pin 7
int buttonState_1 = 0;
int buttonState_2 = 0;
int buttonState_3 = 0;
int buttonState_4 = 0;
int buttonState_5 = 0;
int flag = 0; // used for decission to show "Station Name" or "scan mode"
int stationNr = 0;
int fmFreq[10] = {8760, 8820, 9100, 9350, 9500, 10030, 10080, 10280, 10330, 10480};
char* fmName[10] = {" NDR 1 MV", " NDR Kultur", " NDR 1 MV", " NDR 2 MV",
" N-JOY", "Deutschlandfunk", " Antenne MV", " NDR Info",
"Radio Paradiso", " Ostseewelle"};
char vol[2];
float volts;
char akku[4];
long readVcc() {
long result;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3)
| _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1126400L / result; // Back-calculate AVcc in mV
return result;
}
/******************************
* Setup *
*****************************/
void setup() {
radio.init(); // initialize radio
radio.setBandFrequency(FIX_BAND, FIX_STATION);
radio.setVolume(volume);
radio.setMono(false);
radio.setMute(false);
pinMode(button_1, INPUT); // define button Pins
pinMode(button_2, INPUT); // -||-
pinMode(button_3, INPUT); // -||-
pinMode(button_4, INPUT); // -||-
pinMode(button_5, INPUT); // -||-
digitalWrite(button_1, HIGH); // button-Pin Pull-up
digitalWrite(button_2, HIGH); // -||-
digitalWrite(button_3, HIGH); // -||-
digitalWrite(button_4, HIGH); // -||-
digitalWrite(button_5, HIGH); // -||-
}
/******************************
* Subroutine Display on OLED *
*****************************/
void displayData()
{
volts = (float)readVcc()/(float)1000; // read Vcc and divide by 1000
char s[12];
radio.formatFrequency(s, sizeof(s)); // format frequency value to output like: "87,60 MHz"
u8g.firstPage();
do {
u8g.drawFrame(0,0,128,64); // display frame around screen
u8g.setFont(u8g_font_timB14);
u8g.drawStr(15, 22, s);
u8g.setFont(u8g_font_unifont);
if(flag==0)
{
u8g.drawStr(4, 44, fmName[stationNr]); // if fequency from array, take name from array too
}
if(flag==1)
{
u8g.drawStr(25, 44, "scan mode"); // if frequency from scan, show "scan mode"
}
if(volts > 3.3) // if Vcc > 3.3V display "Volume" & "Volt"
{
u8g.setFont(u8g_font_6x13);
u8g.drawStr(6, 59,"Volume: ");
sprintf (vol, "%d", volume); // change int "volume" to char "vol"
u8g.drawStr(50, 59, vol);
u8g.drawStr(68, 59,"Bat:");
dtostrf(volts, 2, 1, akku); // change float "volts" to char "akku"
u8g.drawStr(94, 59,akku);
u8g.drawStr(115, 59,"V");
}
else // if VCC >= 3.3V display "CHARGE BATTERY"
{
u8g.drawStr(6, 59,"CHARGE BATTERY");
}
}
while( u8g.nextPage() );
}
/******************************
* Main Loop *
*****************************/
void loop()
{
buttonState_1 = digitalRead(button_1);
buttonState_2 = digitalRead(button_2);
buttonState_3 = digitalRead(button_3);
buttonState_4 = digitalRead(button_4);
buttonState_5 = digitalRead(button_5);
if (buttonState_1 == LOW)
{
volume ++;
if (volume == 16) volume = 15;
radio.setVolume(volume);
delay(100);
}
else if (buttonState_2 == LOW)
{
volume --;
if (volume < 0) volume = 0;
radio.setVolume(volume);
delay(100);
}
else if (buttonState_3 == LOW)
{
stationNr ++;
if (stationNr == 10) stationNr = 0;
radio.setFrequency(fmFreq[stationNr]);
flag = 0;
delay(500);
}
else if (buttonState_4 == LOW)
{
radio.seekUp();
flag = 1;
delay(500);
}
else if (buttonState_5 == LOW)
{
radio.seekDown();
flag = 1;
delay(500);
}
else displayData();
}
Prinzipiell funktioniert alles prima, nur leider friert das Ding immer mal wieder ein!
Das kann schon Sekunden nach dem Start passieren, manchmal aber auch erst nach längerer Zeit.
Ich bin nicht sicher, ob der Sketch auf dem Arduino einfriert oder ob es der SI4703 ist. Eigentlich glaube ich eher an ein Problem mit dem Sketch, weil dann auch die Anzeigewerte nicht mehr richtig reagieren, wenn ich auf Taster drücke. Andererseits habe ich manchmal den Eindruck, das das Einfrieren durch Bewegung in der Nähe der Antenne getriggert wird. Das würde für mich eher auf ein Problem mit dem SI4703 deuten. Ich habe versuchsweise die Anzeigeroutine auskommentiert. Das hat nichts gebracht.
Hier noch die Schaltung, falls das wichtig ist:
Anhang 33275
Irgendwelche Ideen warum das Ding einfriert?
Gruß Uwe
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
wkrug
Scheint ja irgendwie ein Problem mit Statischer Aufladung zu sein.
Ja irgend sowas vermute ich auch. Das Ding (Breadboard-Aufbau) hat eben 30 Minuten ohne Probleme neben mir auf dem Schreibtisch gestanden und gespielt. Dann bin ich vom Stuhl aufgestanden ohne es irgendwie zu berühren und prompt hat es blockiert!
Ich hänge mal einen Ausschnitt aus der Schaltung des Moduls hier dran.
Anhang 33528
Da sieht man die Eingangsschaltung der Antenne. Mit Drossel gegen Masse und Kondensator zum RF-Eingang sieht das normal aus, denke ich. Ob Dioden da was bringen? Wenn ja, welche Typen wären geeignet? Vielleicht sollte ich das Modul metallisch abschirmen?
Gruß Uwe