SD Karte tut nicht nach unterbrechen/ ändern der Stromzufuhr

Guten Abend,
ich bin ein neuling und will ein Datenloggerprogrammieren, nun funktioniert alles bis auf die SD Karte.
Sobald ich die Stromquelle von USB auf 9V 1A Netzteil änere oder nur das USB aus und Wieder einstecke funktioniert die SD Karte nicht mehr obwohl das Sonstige programm abläuft... ( habe testweise eine blinkende Led eingebaut)

Wenn ich das programm hochade und nicht vom PC trenne funktioniert alles!!
Ich habe auch schon mut verschidenen Wiederständen in den Datenleitungen MOSI = 11 , MISO = 12, SCK = 13, CS = 10, es handelt sich um eine micro SD Karte in einem Micro SD Shield.

Ich habe ein Arduino R3 Uno und lese ein LDR und ein Windsensor aus, über ein rtc Modul hole ich die Aktuelle Zeit. Die Daten werden gesammelt und Verrechnet und alle 15 Min bzw. jede Stunde abgespeichert.

Im anhang ist mein sketch...
ich bin jetzt echt ratlos... und dankbar um jede Hilfe!!

mfg
Friederich Eberle

Datenlogger_UNO.ino (3.96 KB)

Ohne genaue Angaben deiner verwendeten Teile wird ein Hilfe schwer.

Poste bitte Hyperlinks der Teile, die du verwendest.
Und damit alle, auch mobile User deinen Sketch lesen können, poste den bitte hier in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Okey :slight_smile: Hier der Code:

#include <SD.h>
#include <SPI.h>
#include <DS3231.h>

DS3231  rtc(SDA, SCL);

int Sonne       = 0;
int SonneInput  = 0;
int impulse     = 0;
int SEC         = 0;

float Vwind     = 0;
float Ewind     = 0;

const int chipSelect = 10;

File myFile;
File myFile2;
File myFile3;
Time t;

//    SD Imput   
//    ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
//    ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
//    ** SCK - pin 13 on Arduino Uno/Duemilanove/Diecimila
//    ** CS - pin 10 depends on your SD card shield or module.

//    Realtime Clock Imput
//    SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//    SCL pin   -> Arduino Analog 5 or the dedicated SCL pin

//    Windsensor Input    -> Digital  PIN 2
//    Termperatur Sensor  -> Digital  PIN 3
//    Schalter1 Input     -> Digital  PIN 4
//    Schalter2 Input     -> Digital  PIN 5
//    LDR Input           -> Analog   A0



void setup() {  
  Serial.begin(9600); 
  
  pinMode(2, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(A0, INPUT);
  pinMode(7, OUTPUT);
  pinMode(10, OUTPUT);
  
  rtc.begin();
  rtc.setDOW(TUESDAY);
  rtc.setTime(21, 59, 30);
  rtc.setDate(21,02, 2018);

  attachInterrupt(digitalPinToInterrupt(2), count_pulse, RISING);

    Serial.print("Initializing SD card...");

  if (!SD.begin(10)) {
    Serial.println("Card failed, or not present");
    return;
  }
  else {Serial.println("card initialized.");}

  myFile = SD.open("TEST.txt", FILE_WRITE);
  myFile.print("Test");
  myFile.close();
}

void loop() { 
  rtc.begin();
  t = rtc.getTime();

  digitalWrite(7, HIGH);
  delay(500);
  digitalWrite(7, LOW);
  delay(500);
  
    if (digitalRead(5) == false){
      SEC++;      
      
      SonneInput  = analogRead(A0) - 30;    
      
      Vwind   = Vwind   +  (impulse * 0.2);  
      Ewind   = Ewind   +  ((impulse *0.2) * (impulse *0.2) * (impulse *0.2));    
      Sonne   = Sonne   +  SonneInput; 
       
      if (digitalRead(4) == true && SEC % 3 == 0 ){
        Serial.println(rtc.getTimeStr()); 
        Serial.print(SonneInput); 
        Serial.println(" Durchschnitt LDR");                                   
        Serial.print((impulse *0.2)); 
        Serial.println(" Windgeschwindigkeit im Durchschitt"); 
        Serial.print(((impulse *0.2) * (impulse *0.2) * (impulse *0.2))); 
        Serial.println(" Windenergie im Durchschitt");
      }
      
      impulse     = 0;
      SonneInput  = 0; 
       
      if  (  t.sec == 0 and ( t.min == 0 or t. min == 15 or t.min == 30 or t.min == 45 ))  { 
          
          Serial.println(rtc.getTimeStr()); 
          Serial.print(Sonne / SEC); 
          Serial.println(" Durchschnitt LDR");                                   
          Serial.print(Vwind / SEC); 
          Serial.println(" Windgeschwindigkeit im Durchschitt");

          Serial.println("Schleie 15Min ausgeführt");
          
          myFile = SD.open("V_WD.txt", FILE_WRITE);
          myFile.print(t.date);
          myFile.print(" ");
          myFile.print(t.hour);
          myFile.print(":");
          myFile.print(t.min);
          myFile.print(" , ");
          myFile.print(Vwind / SEC);
          myFile.close();

          myFile2 = SD.open("Sonne.txt", FILE_WRITE);
          myFile2.print(t.date);
          myFile2.print(" ");
          myFile2.print(t.hour);
          myFile2.print(":");
          myFile2.print(t.min);
          myFile2.print(" , ");
          myFile2.println((Sonne / SEC));
          myFile2.close();         

          Sonne       = 0;
          Vwind       = 0;                        
          SEC         = 0;         
      }
      if (t.sec == 0 and t.min == 0){

        Serial.println("Schleie 60Min ausgeführt");

        myFile3 = SD.open("EW_hour.txt", FILE_WRITE);
        myFile3.print(t.date);
        myFile3.print(" ");
        myFile3.print(t.hour);
        myFile3.print(" , ");
        myFile3.print(Ewind);
        myFile3.close();

        Ewind       = 0;
      }
    } 
}   

void count_pulse(){
  impulse++;
}

Echtzeitmodul: https://eckstein-shop.de/RTC-DS3231-AT24C32-Memory-Real-Time-Clock-IIC-Modul
SD karten modul: https://www.ebay.de/itm/micro-SD-TF-Card-Memory-Modul-Karte-Slot-Kartenadapter-cardreader-Arduino-L0046-/222805556494?_trksid=p2385738.m4383.l4275.c

Ich denk ein LDR ist klar und der Windsensor ist ein Impulsgenarator mit Reedkontakt das sollte auch so verständlich sein denk ich.

Danke für die Schnelle Antwort!

CCleaner:
....
Danke für die Schnelle Antwort!

Gerne, aber ich sehe keine Hyperlinks. Das sind nur URL.

Hallo,

für die Beantwortung dieser Frage braucht man keinen Sketsh ..... Uno und SD geht nur in den wenigsten Fällen. Meistens nur wenn die SD sehr klein ist und sonst nichts benötigt wird. Zu wenig Speicherplatz.
Es könnte sein das es spezielle Libs gibt. Aber diese sind mir noch nicht unter gekommen.

Gruss Temucin

PS: Sollte ich mich da fatal irren ( das sind meine Erfahrungen ), dann wäre ein Beispiel für eine 1GB SD die zusammen mit der Rtc Lib funktioniert echt cool.

temucin:
Hallo,

für die Beantwortung dieser Frage braucht man keinen Sketsh ..... Uno und SD geht nur in den wenigsten Fällen. Meistens nur wenn die SD sehr klein ist und sonst nichts benötigt wird. Zu wenig Speicherplatz.

Na toll....das hilft dem TO unwahrscheinlich weiter. Echt stark.

Woher willst du wissen, wie groß der Sketch ist, wenn du den nicht kennst.
Telepathische Fähigkeiten ?

Z.B. wird im Sketch kein F-Macro verwendet, das ist hier aber schon wichtig, um Ram zu sparen.
Und bei "richtiger" Programmierung funktioniert das auch mit dem Uno zusammen.

Es steht doch da, dass der Sketch grundsätzlich funktioniert. Nur wenn im laufenden Betrieb die Stromversorgung geändert wird, gibt es Ausfälle. Ich würde einen Stütz-Elko (200-1000µF) für die 5V des Arduinos ausprobieren. Anderer Weg: Kappe die 5V im USB-Kabel oder Anschluss und versorge den Arduino immer über das Netzteil.

Da das SD-Karten-Modul aus der URL einen Spannungsregler und Level-Shifter hat, solltest du ohne Widerstände in den Datenleitungen auskommen.

Guten Tag,

ich habe nun den ertsten tip mit dem Kondensator getestet mi (1000µ Farad) und siehe da plötzlich tut alles!!

wenn ich das richtig versteh ist der Kondensator ein Puffer zum aufrechthalten der Spannung oder?

Vielen Dank für den Tip! darauf währ ich nie gekommen!

Auch wenn dadurch Dein Problem gelöst ist, rate ich Dir das F() MAkro zu benutzten da es in allen Fällen von xxx.print("Text"); RAM spart. Der Text wird dadurch nicht ins RAM kopiert.

Beispiel: statt
Serial.println("Card failed, or not present");
schreibst Du
Serial.println(F("Card failed, or not present"));
Grüße Uwe