TimeGPS auf Leonardo will nicht

Hallo Leute,
Da ich mit DCF77 hier keinen Erfolg habe(zuviel Störquellen) möchte ich die Zeit via GPS aktualisieren.
ich habe das Beispiel aus der Time-lib an das Leonardo angepasst, aber es passiert nix, er bleibt bei “Waiting for GPS time …” hängen.
RX habe ich auf PIN8 TX auf PIN 9.
mit einem anderem Scetch wirft er mir in der Konsole alle GPS-Daten korrekt aus, inkl. der Zeit.
Ich verwende einen EM-406A.

wo kann der Fehler sein?

/*
 * TimeGPS.pde
 * example code illustrating time synced from a GPS
 * 
 */

#include <Time.h>
#include <TinyGPS.h>       
#include <SoftwareSerial.h>
//  NewSoftSerial zu SoftwareSerial geändert
#define RXPIN 8
#define TXPIN 9
TinyGPS gps; 
SoftwareSerial serial_gps(RXPIN, TXPIN);

const int offset = 1;   // offset hours from gps time (UTC)
time_t prevDisplay = 0; // when the digital clock was displayed

void setup()
{
  Serial.begin(115200);
  serial_gps.begin(4800);
  Serial.println("Waiting for GPS time ... ");
  setSyncProvider(gpsTimeSync);
}

void loop()
{
  while (serial_gps.available()) 
  {
    gps.encode(serial_gps.read()); // process gps messages
  }
  if(timeStatus()!= timeNotSet) 
  {
     if( now() != prevDisplay) //update the display only if the time has changed
     {
       prevDisplay = now();
       digitalClockDisplay();  
     }
  }	 
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

time_t gpsTimeSync(){
  //  returns time if avail from gps, else returns 0
  unsigned long fix_age = 0 ;
  gps.get_datetime(NULL,NULL, &fix_age);
  unsigned long time_since_last_fix;
  if(fix_age < 1000)
    return gpsTimeToArduinoTime(); // return time only if updated recently by gps  
  return 0;
}

time_t gpsTimeToArduinoTime(){
  // returns time_t from gps date and time with the given offset hours
  tmElements_t tm;
  int year;
  gps.crack_datetime(&year, &tm.Month, &tm.Day, &tm.Hour, &tm.Minute, &tm.Second, NULL, NULL);
  tm.Year = year - 1970; 
  time_t time = makeTime(tm);
  return time + (offset * SECS_PER_HOUR);
}

Zuviele Störquellen? Das kann ich mir kaum vorstellen. Nimm mal meine Library und lass das hier laufen: http://blog.blinkenlight.net/experiments/dcf77/swiss-army-debug-helper/ Die Analyse würde mich interessieren. Falls Du in Deutschland mit DCF77 und meiner Library keinen Empfang hinbekommst würde mich interessieren wie die Störungen aussehen. Ggf. würde ich die Library aufbohren. Allerdings kann ich mir nicht wirklich vorstellen, daß der Störnebel zu dicht ist ;)

Joschi1711: wo kann der Fehler sein?

SoftwareSerial funktioniert schon auf den "normalen" AVR-Atmega Boards mit einem zweiten Chip für die USB-Serial Kommunikation extrem fehlerhaft, wenn es zusammen mit HardwareSerial verwendet wird.

Auf einem Board mit 32U4 Controller wie dem Leonardo, wo der Hauptcontroller auch noch die USB-Serial Wandlung selbst durchführen muss, dürfte es mit SoftwareSerial nur noch schlechter werden.

Darüber hinaus ist SoftwareSerial für die 1.0.x IDE-Versionen geschrieben und für die neueren 1.5.x Versionen nicht angepaßt worden. Unter den Arduino Betaversionen 1.5.x funktioniert SoftwareSerial daher nochmals schlechter als es unter den 1.0.x Versionen ohnehin schon der Fall ist. Das Ding ist voll die Pest. Am besten verwendest Du SoftwareSerial niemals für irgendwas.

Abhilfe könnte in dem Fall AltSoftSerial sein: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html Allerdings sind bei dieser Library die Send- und Receive-Pins nicht frei wählbar, sondern vom verwendeten Controller abhängig und fest vorgegeben.

Voraussetzung wäre natürlich ein mindestens zeitweise einwandfreier Empfang mindestens eines Satelliten, um die Zeit zu erhalten.

Hallo und ein gesundes Neues Jahr erst mal an alle Leser und Schreiber :wink: ,

Ich habe es nun doch hinbekommen, das es mir die Zeit holt und bin schon einen Schritt weiter, das ganze soll am Ende eine Steuerung für meine Aquarien werden ( Lichttimer, Sonnenuntergang, Nachtlicht usw.)

Das ganze soll Stück für Stück wachsen, und kein nachgebasteltes Ding aus dem Netz sein, ich will ja auch was lernen dabei^^.

Der Zweite Schritt, Funksteckdosen anzusteuern ist auch schon getan, Grund ist in meinen Augen die Sicherheit, Netz und Steuerung getrennt und unabhängige Platzierung der Steuerung ohne viel Kabelkram, da es 2 Aquarien gleichzeitig ansteuert.

hier mal mein Code zur Zeitabfrage via GPS, wie er jetzt funktioniert.

#include <Time.h>
#include <TinyGPS.h>
#include <SoftwareSerial.h>
// TinyGPS and SoftwareSerial libraries are the work of Mikal Hart
SoftwareSerial SerialGPS = SoftwareSerial(8, 9); // RX 8  TX 9
TinyGPS gps;

// Offset Stunden von GPS-Zeit (UTC)
const int offset = 1; // Central European Time
 
time_t prevDisplay = 0; 
void setup()
{
Serial.begin(9600);
while (!Serial) ; // benötigt bei Leonardo 
SerialGPS.begin(4800);
Serial.println("Warte auf GPS-Zeit ... ");
}
void loop()
{
while (SerialGPS.available()) {
if (gps.encode(SerialGPS.read())) { 
// wenn TinyGPS neue Daten bringt...
unsigned long age;
int Year;
byte Month, Day, Hour, Minute, Second;
gps.crack_datetime(&Year, &Month, &Day, &Hour, &Minute, &Second, NULL, &age);
if (age < 500) {
// stellt Zeit auf neueste GPS-Zeit
setTime(Hour, Minute, Second, Day, Month, Year);
adjustTime(offset * SECS_PER_HOUR);
}
}
}
if (timeStatus()!= timeNotSet) {
if (now() != prevDisplay) { //aktualisiert  die Anzeige nur dann, wenn die Zeit  sich geändert hat
prevDisplay = now();
digitalClockDisplay();
}
}
}
void digitalClockDisplay(){
// Digital-Uhr Anzeige der Uhrzeit
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(".");
Serial.print(month());
Serial.print(".");
Serial.print(year());
Serial.println();
}
void printDigits(int digits) {
// Funktion für digitale Zeitanzeige : zeige vorangestellten Doppelpunkt und führende 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);

@ Udo:
Den Test von dir habe ich schon gemacht^^, Ergebniss: etwa jeder 10te Wert lag bei 900-1000, alles andere weit unter 500. Ich werde den Test die Tage nochmals machen, wäre mir echt lieber, mit DCF77 zu handieren(Preis^^).
Ich habe hier nur eben sehr viel Funk in der Bude ^^ in meinem Bastelzimmer 2 Rechner 4 Monitore, Wlan 2 Netze + ein großes WlanNetz mit Richtfunk auf dem Dach (wohne in der Dachwohnung). Hier ist die Kopfstation von unserem Vereinsnetz, da es immer noch reichlich Ecken bei uns gibt ohne Internetanschluss^^.

So, mit DCF 77 läuft jetzt auch,
erster Fehler:

Beim Leonardo ist Int-0 mit Pin-3 und Int-1 mit Pin-2 verknüpft, während es beim UNO genau anders herum ist.
Also von Pin 2 auf 3 gewechselt.

dann mal geschaut was überhaupt an Signal kommt:

#define DCF77PIN 2
unsigned char signal = 0;
unsigned char buffer;
void setup(void) {
Serial.begin(9600);
pinMode(DCF77PIN, INPUT);
}
void loop(void) {
signal = digitalRead(DCF77PIN);
if (buffer != signal) {
Serial.println(signal);
buffer = signal;
}
}

sollte im Sekundentakt 1 0 ausgeben, tut es nicht, es rauschen 1 0 3-5mal durch.

Was machen? Dem Leonardo mit Steckernetzteil versehen, und siehe da es wird besser. es funktioniert zumindest 2m weg von meinem Arbeitsplatz.

Hm…

Jetzt wollte ich es wissen, mal direkt auf den Platz vor Tastatur gepackt (30cm bis zu zwei großen Monitoren)

auf der Platine eine Led mit Trans. angesteuert direkt vom DCF-Signal, um zu sehen, wenn extreme Störungen reinhaun und die LED flackert wie doof, bleibt stellenweise komplett an… Hm

Nun systematisch alles abgeschatet, erst die zwei Monitore, keine Besserung, dan auf Nachbartisch die Lötstation, auch nix.

Dann viel mir ein, Netzteil von Handy (Samsung) pfeift doch immer… also raus das Ding… was soll ich sagen…

die LED blinkt fein im Sekundentakt… alles andere wieder an: die LED tuts immer noch.

jetz den Sketch drauf und nochmal schaun.

#include "DCF77.h"
#include "Time.h"

#define DCF_PIN 3               // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0          // Interrupt number associated with pin

time_t time;
// Non-inverted input on pin DCF_PIN
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT, true);

void setup() {
  Serial.begin(9600);
  while (!Serial) ;
  DCF.Start();
  Serial.println("Waiting for DCF77 time ... ");
  Serial.println("It will take at least 2 minutes before a first time update.");
}

void loop() {
  delay(1000);
  time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime!=0)
  {
    Serial.println("Time is updated");
    setTime(DCFtime);
  }    
  digitalClockDisplay();  
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

siehe da:

0:02:14 1 1 1970
0:02:15 1 1 1970
Time is updated
15:11:00 2 1 2015
15:11:01 2 1 2015
15:11:02 2 1 2015
15:11:03 2 1 2015
15:11:04 2 1 2015
15:11:05 2 1 2015
15:11:06 2 1 2015
15:11:07 2 1 2015
15:11:08 2 1 2015
15:11:09 2 1 2015
15:11:10 2 1 2015
15:11:11 2 1 2015
15:11:12 2 1 2015
15:11:13 2 1 2015
15:11:14 2 1 2015
15:11:15 2 1 2015
15:11:16 2 1 2015
15:11:17 2 1 2015
15:11:18 2 1 2015
15:11:19 2 1 2015
15:11:20 2 1 2015
15:11:21 2 1 2015
15:11:22 2 1 2015
15:11:23 2 1 2015
15:11:24 2 1 2015
15:11:25 2 1 2015
15:11:26 2 1 2015
15:11:27 2 1 2015
15:11:28 2 1 2015
15:11:29 2 1 2015
15:11:30 2 1 2015
15:11:31 2 1 2015
15:11:32 2 1 2015
15:11:33 2 1 2015
15:11:34 2 1 2015
15:11:35 2 1 2015
15:11:36 2 1 2015
15:11:37 2 1 2015
15:11:38 2 1 2015
15:11:39 2 1 2015
15:11:40 2 1 2015
15:11:41 2 1 2015
15:11:42 2 1 2015
15:11:43 2 1 2015
15:11:44 2 1 2015
15:11:45 2 1 2015
15:11:46 2 1 2015
15:11:47 2 1 2015
15:11:48 2 1 2015
15:11:49 2 1 2015
15:11:50 2 1 2015
15:11:51 2 1 2015
15:11:52 2 1 2015
15:11:53 2 1 2015
15:11:54 2 1 2015
15:11:55 2 1 2015
15:11:56 2 1 2015
15:11:57 2 1 2015
15:11:58 2 1 2015
15:11:59 2 1 2015
Time is updated
15:12:01 2 1 2015

!(http://saxonia-devils.eu/extern/DCF77 TEST.png)