Zitat Zitat von HaWe Beitrag anzeigen
...
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