
Zitat von
HaWe
...
ist frequency vom Typ int oder float?
welchen Typ liefert radio.getFrequency() zurück?
Und welchen Typ hat storeFreq ?
nenne vlt auch mal ein paar typische Werte, die radio.getFrequency() zurückiefert!
...
macht er jetzt noch Fehler beim Speichern und Zurücklesen?
- frequency ist int
- ich denke, radio.getFrequency() liefert ebenfalls int (typischer Werte ist 8760 als Entsprechung für 87,60 MHz oder 10330 für 103,30 MHz
- storeFreq ist byte, weil nur byte von EEPROM.update akzeptiert wird
Nein, in der letzten Variante tritt der Fehler bisher nicht mehr auf.
Hier der Code, der (bis) jetzt problemlos läuft:
Code:
/**************************************************************************
* FM-Radio mit RDA5708M, Arduino Pro Mini 3.3V und OLED 128x32 *
* Steuerung über vier Drucktaster: *
* button 1 - volume down *
* button 2 - volume up *
* button 3 - scan frequency down *
* button 4 - scan frequency up *
* Das OLED-display zeigt zwei Zeilen: *
* 1- "Empfangsfrequenz" *
* 2- "Volume level" + "Batteriespannung" *
* alternativ bei Unterschreiten von 3,3V "CHARGE BATTERY" *
* Die Empfangsfrequenz wird im EEPROM gespeichert. *
* *
* U.Galepp 2018 *
**************************************************************************/
#include <Arduino.h>
#include <Wire.h>
#include <radio.h>
#include <RDA5807M.h>
#include "U8glib.h"
#include <EEPROM.h>
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // Auswahl des OLED Typs
#define FIX_BAND RADIO_BAND_FM // ausgewähltes Band ist FM
#define FIX_VOLUME 3 // Lautstärke beim Start ist 3 (0-15 möglich)
RDA5807M radio; // create an instance of class for RDA5807M chip
int volume = FIX_VOLUME;
int button_1 = 4; // Taster für volume up an D4
int button_2 = 5; // Taster für volume down an D5
int button_3 = 6; // Taster für scan up an D6
int button_4 = 7; // Taster für scan down an D7
int buttonState_1 = 0;
int buttonState_2 = 0;
int buttonState_3 = 0;
int buttonState_4 = 0;
int frequency;
byte storeFreq; // Speichervariable für EEPROM
char vol[2];
float volts;
char akku[4];
unsigned long previousMillis = 0;
/*** setup ***/
void setup()
{
radio.init(); // Radio initialisieren
radio.setBand(FIX_BAND); // Radio auf FM setzen
storeFreq = EEPROM.read(0); // Speicherwert für Frequenz aus EEPROM holen
frequency = (storeFreq + 825)*10; // Frequenzwert zu int für Radio-Chip wandeln
radio.setFrequency(frequency); // Radio auf gespeicherte Frequenz setzen
radio.setVolume(volume); // Radio auf gespeicherte Lautstärke setzen
pinMode(button_1, INPUT); // Taster-Pins als Eingang definieren
pinMode(button_2, INPUT); // -||-
pinMode(button_3, INPUT); // -||-
pinMode(button_4, INPUT); // -||-
digitalWrite(button_1, HIGH); // Pull-Up Widerstände aktivieren
digitalWrite(button_2, HIGH); // -||-
digitalWrite(button_3, HIGH); // -||-
digitalWrite(button_4, HIGH); // -||-
}
/*** Subroutine Spannungsmessung ***/
void measureVolt()
{ analogReference(INTERNAL);
volts = (float)analogRead(A0)*6.1/1000;}
/*** Subroutine Datenanzeige auf OLED ***/
void displayData()
{
u8g.firstPage();
do {
u8g.setFont(u8g_font_helvB14);
char s[12];
radio.formatFrequency(s, sizeof(s));
u8g.drawStr( 10, 15, s);
u8g.setFont(u8g_font_unifont);
if(volts > 3.3) // wenn Vcc > 3.3V zeige "Volume" & "Volt"
{
u8g.drawStr( 0, 32, "Vol:");
sprintf (vol, "%d", volume); // Umwandlung int "volume" zu char "vol"
u8g.drawStr( 35, 32, vol);
u8g.drawStr( 60, 32, "Bat:");
dtostrf(volts, 2, 1, akku); // Umwandlung float "volts" zu char "akku"
u8g.drawStr( 95, 32, akku);
u8g.drawStr( 119, 32, "V");
}
else // wenn VCC >= 3.3V zeige "CHARGE BATTERY"
{
u8g.drawStr(8, 32,"CHARGE BATTERY");
}
} while( u8g.nextPage() );
}
/*** main loop ***/
void loop()
{
measureVolt(); // Batteriespannung messen
displayData(); // alle Daten auf OLED anzeigen
if (millis() - previousMillis > 5000){ // Prüfung alle 5 Sek ob update der gespeicherten Station nötig ???
previousMillis = millis();
frequency = (radio.getFrequency()); // Frequenz aus Radio auslesen
storeFreq = (frequency/10)-825; // Frequenz in Speicherwert (byte) umrechnen
EEPROM.update(0, storeFreq); // falls neuer Speicherwert abweicht, dann update EEPROM
}
if(!digitalRead(button_1) ) { // wenn Taster 1 gedrückt, Volume einen Schritt runter
while(!digitalRead(button_1) ) // warten auf Taster loslassen == HIGH
{delay(10);}
volume --;
if (volume < 0) volume = 0;
radio.setVolume(volume);
delay(100);
}
if(!digitalRead(button_2) ) { // wenn Taster 2 gedrückt, Volume einen Schritt hoch
while(!digitalRead(button_2) ) // warten auf Taster loslassen == HIGH
{delay(10);}
volume ++;
if (volume == 16) volume = 15;
radio.setVolume(volume);
delay(100);
}
if(!digitalRead(button_3) ) { // wenn Taster 3 gedrückt, abwärts scannen
while(!digitalRead(button_3) ) // warten auf Taster loslassen == HIGH
{delay(10);}
radio.seekDown();
delay(100);
}
if(!digitalRead(button_4) ) { // wenn Taster 4 gedrückt, aufwärts scannen
while(!digitalRead(button_4) ) // warten auf Taster loslassen == HIGH
{delay(10);}
radio.seekUp();
delay(100);
}
}
Uwe
Lesezeichen