anlegen einer Datei auf SDkarte

Gruess Euch,

ich moechte Euch um Rat fragen, habe bereits ueber einen Tag damit verbracht mit der Fehlersuche aber keine Loesung gefunden.

Ich habe zwei Sateliten auf unterschiedlichen Orten welche Daten auf 433 MHz an ein und selben Empfaenger senden.
Die Aufgabe des Empfaengers ist es, immer dann wenn Daten gesendet werden diese zu empfangen und auf eine SD-karte zu schreiben.

Das Senden und Empfangen funktioniert und laeuft.
Im Testbetrieb werden alle paar Sekunden Daten gesendet, im Echtbetrieb sollen dann alle paar Minuten Daten gesendet werden.

Nicht funktionieren tut das Schreiben von Daten auf die SD-Karte (SD card datalogger)

Habe die Tutorials / Standards ‘Non-blocking Write’ und ‘SD card datalogger’ mit meiner PIN-Belegung, samt des installierten Empfaengers ausprobiert. Die SD-Karte, mitsamt anlegen einer Datei und der Eintragung von Daten funktioniert weshalb ich Hardwareprobleme oder Falschbelegung von PINs (10/4) ausschliesse.

Anbei mein Sketch und Foto von Ausgabe am Monitor.

Vielen Dank im voraus fuer Eure Unterstuetzung.

_tmp2_433_EmpfaengerTest.ino (5.09 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

(deleted)

Hast du denn mal versucht, nur einen String an die SD-Card zu übertragen ?
So wie es im Beispiel auch funktioniert.

Und was mir auch aufgefallen ist, du verwendest für deine Funkübertragung 5000 Baud, das wird sehr unsicher.
VirtualWire ist nur für 2000 Baud spezifiziert.

Danke fuer Eure Ratschlaege, leider bisher ohne Erfolg.
vw_setup(2000); // Bits pro Sekunde von 5000 auf 2000 habe ich bei allen Stationen geandert.
Das Beenden der Schleife bei der Entnahme der Karte habe ich mir vorgemerkt.

// 433 MHz Empfaenger com 5

#include <VirtualWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

/// ---------------------------------------------------------- Empfaenger
// 433 Mhz Sender Empfaenger RF Funk Modul FS1000A xy-mk-5v Arduino
/*  GND > D4
  Data > D5 (gesteckt aber nicht belegt)
  Input > D6
  VCC > D7
*/
int i;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

// ------------------------------------------------------------ RTC
RTC_DS1307 rtc;

// - --------------------------------------------------------- SD-Modul
// XD-204 XD-05 DATA LOGGER SHIELD ARDUINO UNO ERWEITERUNG SD KARTE RTC REAL TIME CLOCK
const int chipSelect = 10;


void setup() {
  Serial.begin(9600);

  /// ---------------------------------------------------------- Empfaenger / Arduino
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(4, OUTPUT);   // GND 0V
  digitalWrite(4, LOW);
  pinMode(7, OUTPUT);   // VCC 5V
  digitalWrite(7, HIGH);
  /// ---------------------------------------------------------- Empfaenger / Arduino

  delay(2000);

  /// ---------------------------------------------------------- Uhr
  rtc.begin();
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running .....");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println(".......RTC adjusted!");
  }
  /// ----------------------------------------------------------- Uhr

  delay(2000);

  // ---------------------------------------------------------- sd card
  pinMode(chipSelect, OUTPUT); // PIN fuer SD
  SD.begin (chipSelect);
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("keine SD Karte gefunden");
    while (1);
  }

  
  // ---------------------------------------------------------- sd card
  delay(1500);
  // ---------------------------------------------------------Kontrollicht
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  // ---------------------------------------------------------Kontrollicht
  delay(500);
  // --------------------------------------------------------- Empfang
  vw_setup(2000);       // Bits pro Sekunde
  vw_set_rx_pin(5);     // Datenleitung
  vw_rx_start();        // Empfänger starten
  // --------------------------------------------------------- Empfang
  delay(2000);//delay boot
}


void loop() {

  if (vw_get_message(buf, &buflen)) {
    int i;

    // Message with a good checksum received, print it.
    Serial.print("income: \t");


    // ---------------------------------------------- empfangene Werte auslesen
    int EinStation = buf[0];
    int EinPacket = buf[1];
    int EinVorzeichen = buf[2];
    float EinWertV = buf[3];
    float EinWertN = buf[4];
    float EinWert = (EinWertV * 100 + EinWertN) / 100;

    float ZweiWertV = buf[5];
    float ZweiWertN = buf[6];
    float ZweiWert = (ZweiWertV * 100 + ZweiWertN) / 100;

    //  ---------------------------------------Kontrollicht an
    digitalWrite(2, HIGH);

    // sd --------------------------------------------------------- sd beschreiben

    DateTime now = rtc.now();

    // open the file. note that only one file can be open at a time .....
    File logFile = SD.open("datalog.txt", FILE_WRITE);

    // if the file is available, write to it:
    if (logFile) {
      logFile.print(now.day(), DEC);
      logFile.print('/');
      logFile.print(now.month(), DEC);
      logFile.print('/');
      logFile.print(now.year(), DEC);
      logFile.print("\t");
      logFile.print(now.hour(), DEC);
      logFile.print(':');
      logFile.print(now.minute(), DEC);
      logFile.print(':');
      logFile.print(now.second(), DEC);
      logFile.print("\t");
      logFile.print(EinStation);
      logFile.print("\t");
      logFile.print(EinPacket);
      logFile.print("\t");
      logFile.print(EinWert);
      logFile.print("\t");
      logFile.print(ZweiWert);
      logFile.println();
      logFile.close();

    }
    // if the file isn't open, errormeldung:
    else {
      Serial.println("error opening datalog.txt");
    }
    
    // sd --------------------------------------------------------- card


    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(',');
    Serial.print("\t");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print (" \t ");
    Serial.print (EinStation);
    Serial.print (" \t ");
    Serial.print (EinPacket);
    Serial.print (" \t ");
    Serial.print (EinWert);
    Serial.print (" \t ");
    Serial.print (ZweiWert);
    Serial.println();

    //  ---------------------------------------Kontrollicht aus
    digitalWrite(2, LOW);
  }

  digitalWrite(2, LOW);  
// todo: SD.end();
}

… und habe auch ohne Erfolg versucht nur eine Variable auf die SD Karte zu uebertragen

wittich:
.... und habe auch ohne Erfolg versucht nur eine Variable auf die SD Karte zu uebertragen

Wenn du das auch mit dem originalen Beispiel nicht schaffst, dann hastdu im Aufbau einen Fehler.

Zeige doch mal ein deutliches Foto deines Aufbaus, wo wir auch Kabelverbindungen erkennen können.

Oder ist deine SD-Karte defekt ?

ich bin mir sicher das die SD-Karte nicht defekt ist da ich diese bei anderen Projekten verwende und dort aktuell funktioniert.

Die gelbe Klemme die Du auf den Fotos siehst fungiert in dieser Phase quasi als Antenne.

Das Steckbrett verwende ich ausschliesslich fuer die Leuchtdiode, das kurze gruene und orange Kabel bei ± ist derzeit nicht in Verwendung.

Unterhalb vom Aufsatz befindet sich ein Arduino UNO.

Habe mittlerweile auch schon probehalber delays eingefuegt … nuetzt auch nichts

Hast Du mit diesem Aufbau auch schon mal versucht ganz ohne Funk einfach "Hallo" in die Datei zu schreiben?

Gruß Tommy

Ok, bei dem Aufbau, kann man ja fast nix falsch machen. Zumindest, was die Verkabelung betrifft.

Und das was Tommy schrieb, hatte ich ja auch schon gefragt.
Wundert mich, das ein Beispiel nicht funktioniert.

Zum Thema Funk möchte ich dir auch noch einen Tipp mitgeben. Dein Empfänger ist sehr schlecht, solltest du mal drüber nachdenken. Wenn der Rest läuft.

das habe ich auch schon gemacht - habe die ganzen Passagen welche den Funk Initialisierung, Auswertung, Berechnung betreffen und in setup() und loop() gestanden sind geloescht, und in loop() “Hallo Welt” hineingeschrieben. Library habe ich stehen gelassen.

Das laeuft bei mir tadellos, wird auf die Karte geschrieben.

Hier der Code ohne Funk …

// 433 MHz Empfaenger com 5

#include <VirtualWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

/// ---------------------------------------------------------- Empfaenger
// 433 Mhz Sender Empfaenger RF Funk Modul FS1000A xy-mk-5v Arduino
/*  GND > D4
  Data > D5 (gesteckt aber nicht belegt)
  Input > D6
  VCC > D7
*/


// ------------------------------------------------------------ RTC
RTC_DS1307 rtc;

// - --------------------------------------------------------- SD-Modul
// XD-204 XD-05 DATA LOGGER SHIELD ARDUINO UNO ERWEITERUNG SD KARTE RTC REAL TIME CLOCK
const int chipSelect = 10;


void setup() {
  Serial.begin(9600);

  /// ---------------------------------------------------------- Empfaenger / Arduino
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(4, OUTPUT);   // GND 0V
  digitalWrite(4, LOW);
  pinMode(7, OUTPUT);   // VCC 5V
  digitalWrite(7, HIGH);
  /// ---------------------------------------------------------- Empfaenger / Arduino

  delay(2000);

  /// ---------------------------------------------------------- Uhr
  rtc.begin();
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running .....");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println(".......RTC adjusted!");
  }
  /// ----------------------------------------------------------- Uhr

  delay(2000);

  // ---------------------------------------------------------- sd card
  pinMode(chipSelect, OUTPUT); // PIN fuer SD
  SD.begin (chipSelect);
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("keine SD Karte gefunden");
    while (1);
  }

 
  // ---------------------------------------------------------- sd card
  delay(1500);
  // ---------------------------------------------------------Kontrollicht
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  // ---------------------------------------------------------Kontrollicht
  delay(500);


  delay(2000);//delay boot
}


void loop() {
    // open the file. note that only one file can be open at a time .....
    File logFile = SD.open("datalog.txt", FILE_WRITE);

    // if the file is available, write to it:
    if (logFile) {
      logFile.print("Hallo Welt");
      logFile.println();
      logFile.close();
    }
    // if the file isn't open, errormeldung:
    else {
      Serial.println("error opening datalog.txt");
    }
   
    // sd --------------------------------------------------------- card

    Serial.print ("Hallo Welt");
    Serial.println();

    //  ---------------------------------------Kontrollicht aus
    digitalWrite(2, LOW);

}

Guten Morgen,

weiter habe ich analog meinem vorhergehenden Post -

alles unveraendert lassen, jedoch nur im loop() alles was mit dem Funkempfang und Datenauswertung zu tun hat, wie zuvor entfernt

alsoso:

void loop() {
    // open the file. note that only one file can be open at a time .....
    File logFile = SD.open("datalog.txt", FILE_WRITE);

    // if the file is available, write to it:
    if (logFile) {
      logFile.print("Hallo Welt Version 2");
      logFile.println();
      logFile.close();
    }
    // if the file isn't open, errormeldung:
    else {
      Serial.println("error opening datalog.txt");
    }
   
    // sd --------------------------------------------------------- card

    Serial.print ("Hallo Welt 2 funktioniert nicht");
    Serial.println();

    //  ---------------------------------------Kontrollicht aus
    digitalWrite(2, LOW);

}

Das Ergebnis ist: es wird keine Datei angelegt .....

also denke ich: der Fehler muss irgendwo im setup() liegen. ??

wittich:
also denke ich: der Fehler muss irgendwo im setup() liegen. ??

Auch das ist möglich.
Allerdings hast du doch geschrieben, es hat schon funktioniert (Post #10).

Warum baust du da nicht drauf auf ? Das wäre doch der richtige Weg.

Somit verstehe ich dein aktuelles Problem nicht.

Edit:
Eine Alternative wäre noch die Library “SDFat.h” zu verwenden.
Teste es doch mal damit.

Und sicher ist, beide Libraries laufen bei mir mit dem Beispiel “Datalogger” an einem SD-Cardreader solo und einem Uno.

Ok....ich habe mir deinen Testsketch nochmal angesehen und einen Fehler entdeckt:

Diese beiden Zeilen im Setup() darfst du löschen:

 // ---------------------------------------------------------- sd card

  //pinMode(chipSelect, OUTPUT); // PIN fuer SD
  //SD.begin (chipSelect);

Dann funktioniert auch dein Testsketch bei mir.

wittich:
also denke ich: der Fehler muss irgendwo im setup() liegen. ??

Kannst Du ausschliessen, das die vw-lib da reinmistet?

Aus der Doku VirtualWire: VirtualWire.h File Reference

Parameters
    [in]	pin	The Arduino pin number for transmitting data. Defaults to 12.

Da liegt aber MISO drauf.
Gilt in der Form auch für vw_set_ptt_pin() der auf 10 default liegt.

Wenn Du die lib ausklammerst und die vw_ -Variablen im Setup und im loop
if (vw_get_message(buf, &buflen)) auskommentierst (die Klammer danach kannst Du in die nächste Zeile schieben) und die Variablen direkt festlegst, sollte auf der SD-Karte was rauskommen.

Kannst auch versuchen das umzubiegen.
Ich glaube PIN 8 und 9 ist bei Dir noch frei. Versuch mal

vw_set_tx_pin(8);
vw_set_ptt_pin(9);

reinzubauen.

my_xy_projekt:
.....
Kannst auch versuchen das umzubiegen.
Ich glaube PIN 8 und 9 ist bei Dir noch frei. Versuch mal

vw_set_tx_pin(8);

vw_set_ptt_pin(9);



reinzubauen.

Beim TO geht es hier um den Empfänger, der allerdings im letzten Sketch komplett entfernt wurde.
Der Empfänger benötigt keine tx-Daten und auch kein ptt-Pin.

Somit trifft das hier nicht zu.

HotSystems:
Somit trifft das hier nicht zu.

Ich würd das nicht ausschliessen.
Wenn ich den Sketch des OP nehme, den virtualwire ausklammer, und den buf manuell befülle, schreibt der Sketch auf die Karte. Auch ohne Veränderung von

pinMode(chipSelect, OUTPUT); // PIN fuer SD
SD.begin (chipSelect);

:wink:

// 433 MHz Empfaenger com 5


//#include <VirtualWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>



/// ---------------------------------------------------------- Empfaenger
// 433 Mhz Sender Empfaenger RF Funk Modul FS1000A xy-mk-5v Arduino
/*  GND > D4
  Data > D5 (gesteckt aber nicht belegt)
  Input > D6
  VCC > D7
*/
int i;
//uint8_t buf[VW_MAX_MESSAGE_LEN];
//uint8_t buflen = VW_MAX_MESSAGE_LEN;
uint8_t buf[]={1,2,3,4,5,6,7};
// ------------------------------------------------------------ RTC
RTC_DS1307 rtc;

// - --------------------------------------------------------- SD-Modul
// XD-204 XD-05 DATA LOGGER SHIELD ARDUINO UNO ERWEITERUNG SD KARTE RTC REAL TIME CLOCK
const int chipSelect = 10;



void setup() {
  Serial.begin(9600);

  /// ---------------------------------------------------------- Empfaenger / Arduino
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(4, OUTPUT);   // GND 0V
  digitalWrite(4, LOW);
  pinMode(7, OUTPUT);   // VCC 5V
  digitalWrite(7, HIGH);
  /// ---------------------------------------------------------- Empfaenger / Arduino

  delay(2000);

  /// ---------------------------------------------------------- Uhr
  rtc.begin();
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running .....");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println(".......RTC adjusted!");
  }
  /// ----------------------------------------------------------- Uhr

  delay(2000);

  // ---------------------------------------------------------- sd card
  pinMode(chipSelect, OUTPUT); // PIN fuer SD
  SD.begin (chipSelect);
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("keine SD Karte gefunden");
    while (1);
  }
  Serial.println("SD Karte intialisiert");
  // ---------------------------------------------------------- sd card
  delay(1500);
  // ---------------------------------------------------------Kontrollicht
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  // ---------------------------------------------------------Kontrollicht
  delay(500);
  // --------------------------------------------------------- Empfang
  //vw_setup(5000);       // Bits pro Sekunde
  //vw_set_rx_pin(5);     // Datenleitung
  //vw_rx_start();        // Empfänger starten
  // --------------------------------------------------------- Empfang
  delay(2000);//delay boot
}


void loop() {

  //if (vw_get_message(buf, &buflen)) 
  {
    int i;

    // Message with a good checksum received, print it.
    Serial.print("income: \t");


    // ---------------------------------------------- empfangene Werte auslesen
    int EinStation = buf[0];
    int EinPacket = buf[1];
    int EinVorzeichen = buf[2];
    float EinWertV = buf[3];
    float EinWertN = buf[4];
    float EinWert = (EinWertV * 100 + EinWertN) / 100;

    float ZweiWertV = buf[5];
    float ZweiWertN = buf[6];
    float ZweiWert = (ZweiWertV * 100 + ZweiWertN) / 100;

    //  ---------------------------------------Kontrollicht an
    digitalWrite(2, HIGH);

    // sd --------------------------------------------------------- sd beschreiben

    DateTime now = rtc.now();

    // open the file. note that only one file can be open at a time .....
    File logFile = SD.open("log.txt", FILE_WRITE);

    // if the file is available, write to it:
    if (logFile) {
      logFile.print(now.day(), DEC);
      logFile.print('/');
      logFile.print(now.month(), DEC);
      logFile.print('/');
      logFile.print(now.year(), DEC);
      logFile.print("\t");
      logFile.print(now.hour(), DEC);
      logFile.print(':');
      logFile.print(now.minute(), DEC);
      logFile.print(':');
      logFile.print(now.second(), DEC);
      logFile.print("\t");
      logFile.print(EinStation);
      logFile.print("\t");
      logFile.print(EinPacket);
      logFile.print("\t");
      logFile.print(EinWert);
      logFile.print("\t");
      logFile.print(ZweiWert);
      logFile.println();
      logFile.close();

    }
    // if the file isn't open, errormeldung:
    else {
      Serial.println("error opening datalog.txt");
    }
    
    // sd --------------------------------------------------------- card


    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(',');
    Serial.print("\t");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.print (" \t ");
    Serial.print (EinStation);
    Serial.print (" \t ");
    Serial.print (EinPacket);
    Serial.print (" \t ");
    Serial.print (EinWert);
    Serial.print (" \t ");
    Serial.print (ZweiWert);
    Serial.println();

    //  ---------------------------------------Kontrollicht an
    digitalWrite(2, LOW);


  }

  digitalWrite(2, LOW);

}

Und warum soll er eine Krücke bauen, wenn es auch sauber geht ?

Ich bezog meinen Post #15 auf die von dir geschriebene Pinbelegung, die in diesem Fall def. nicht nötig ist.
In diesem Sketch sendet er nicht, also braucht er die Pins nicht.

Hier die Lösung:

Falsch:

 vw_setup(5000);       // Bits pro Sekunde
  vw_set_rx_pin(5);     // Datenleitung
  vw_rx_start();        // Empfänger starten

Richtig:

 vw_set_rx_pin(5);     // Datenleitung
  vw_setup(5000);       // Bits pro Sekunde
  vw_rx_start();        // Empfänger starten

Ein Blick in die Lib und wie das ganze aufgebaut ist, macht deutlich, das du erst den PIN angeben musst und damit das Setup startest. Wenn Du das anders herum machst, belegt vw_set_rx_pin() den default 11 als input und blockiert den MOSI. (in der VirualWire.cpp static uint8_t vw_rx_pin = 11;)

Hier mit nem UNO und selben Cardreader/RTC-Modul getestet. Die lib benötigt den Empfänger nicht, produziert aber den Fehler..

Na dann viel Erfolg!

HotSystems:
In diesem Sketch sendet er nicht, also braucht er die Pins nicht.

Ich bin beim überfliegen der lib davon ausgegangen, das ständig alle Pins initialisiert werden - auch wenn nur rx benötigt wird.

Da steht ab Zeile 420:

// Set up digital IO pins
pinMode(vw_tx_pin, OUTPUT);
pinMode(vw_rx_pin, INPUT);
pinMode(vw_ptt_pin, OUTPUT);

Vielleicht kann ja noch jemand anderes draufschaun und mir sagen wo das setup welches in Zeile 360 beginnt vorher aufhört. Der Zweig beginnt in Zeile 310 mit der Bedingung. Ich hab eine Stelle oder Bedingung zum Ausstieg nicht gefunden.