I²C - Bus Übertragungsproblem

Hallo !

Ich möchte meine Daten von einem MPU 6050 - über USB Buchsen und einem USB Kabel zu meinem Arduino leiten. Das Problem ist aber, wenn ich alles korrekt verkable und anschließe funktioniert das Programm nicht. Wenn ich den Sensor direkt über Jumpwire mit dem Arduino verbinde funktioniert alles perfekt wie es sollte.

An den USB - Buchsen sind folgende Sachen angeschlossen:

  1. VCC - 5Volt Arduino
  2. SDA - Datenleitung I²C Bus
  3. SCL - Datenleitung I²C Bus
  4. GND - Arduino

Das USB Kabel ist ein normales USB A zu USB A.

An was könnte hier es scheitern ?
Muss ich das Metallgehäuse der Buchsen mit GND verbinden? (Dies habe ich bereits versucht)

Ich hoffe ihr könnt mir damit helfen.

LG

Wie lang ist dein Kabel und hast du die Pullup-Widerstände am I2C Bus angeschlossen. Da müssen 4,7 k gegen + 5 Volt.

Der Titel deines Thread ist aber falsch, auch wenn du ein USB-Kabel verwendest ist es doch I2C.

Das Kabel ist 3 Meter lang.

Nein die habe ich nicht.

Das heißt dann brauche ich von 5Volt 2x 4,7k auf einmal SDA und SDL richtig ?

LG

Speedcore016:
Das Kabel ist 3 Meter lang.

Nein die habe ich nicht.

Das heißt dann brauche ich von 5Volt 2x 4,7k auf einmal SDA und SDL richtig ?

LG

Ja unbedingt, bei der Länge ist das ein Muss.
Ohnehin sind die 3 Meter schon kritisch.

Die Pullup Widerstände können auch kleiner sein bis zu 1,5kOhm.

Grüße Uwe

uwefed:
Die Pullup Widerstände können auch kleiner sein bis zu 1,5kOhm.

Grüße Uwe

Ja, das stimmt absolut und ist bei längeren Kabeln sogar zu empfehlen.

@Speedcore016
Du solltest aber bitte deinen Threadtitel ändern, damit auch jeder erkennen kann, was gemeint ist.

Eine sehr gute Erklärung zu I2C habe ich bei Nick Gammon gefunden:
http://gammon.com.au/i2c
Dort ist m.E. alles darüber zu erfahren was man über I2C wissen muss oder sollte. Ich selbst arbeite mich gerade mit Begeisterung durch dieses Dokument.

Kommen die Signale auch wirklich an den richtigen Pins an? Nicht daß im Kabel irgendwelche Anschlüsse gekreuzt werden…

Hallo !

Ich habe nun auf SDA und SCL Widerstände angeschlossen von 5 Volt. Diese sind 1,5kOhm groß.
Mein Problem besteht weiter aber es ist komischer geworden.

Wenn ich diesen Code probiere, welcher nur zum Testen des Sensors MPU-6050 ist funktioniert die Übertragung der Daten perfekt.

#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h"

#endif

MPU6050 mpu;

#define OUTPUT_READABLE_REALACCEL

#define LED_PIN 13  // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

bool dmpReady = false; 
uint8_t mpuIntStatus; 
uint8_t devStatus;      
uint16_t packetSize;  
uint16_t fifoCount;     
uint8_t fifoBuffer[64];

Quaternion q;           
VectorInt16 aa;        
VectorInt16 aaReal;     
VectorInt16 aaWorld;   
VectorFloat gravity;   
float euler[3];        
float ypr[3];        


uint8_t teapotPacket[14] = { '

Benutze ich meinen Code für mein Projekt gibt dieser von Anfang an 0.00 aus, aber ich verstehe nicht warum.
, 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };
volatile bool mpuInterrupt = false;    
void dmpDataReady() {
   mpuInterrupt = true;
}

void setup() {
   #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
       Wire.begin();
       TWBR = 24;
   #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
       Fastwire::setup(400, true);
   #endif
   
   Serial.begin(115200);
   while (!Serial);
   Serial.println(F("Initializing I2C devices..."));
   mpu.initialize();

Serial.println(F("Testing device connections..."));
   Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
   delay(1000);

Serial.println(F("Initializing DMP..."));
   devStatus = mpu.dmpInitialize();

mpu.setXGyroOffset(220);
   mpu.setYGyroOffset(76);
   mpu.setZGyroOffset(-85);
   mpu.setZAccelOffset(1788);
   mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_16);

if (devStatus == 0) {
       Serial.println(F("Enabling DMP..."));
       mpu.setDMPEnabled(true);

Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
       attachInterrupt(0, dmpDataReady, RISING);
       mpuIntStatus = mpu.getIntStatus();
       
       Serial.println(F("DMP ready! Waiting for first interrupt..."));
       dmpReady = true;
       packetSize = mpu.dmpGetFIFOPacketSize();
   } else {
       Serial.print(F("DMP Initialization failed (code "));
       Serial.print(devStatus);
       Serial.println(F(")"));
   }
   pinMode(LED_PIN, OUTPUT);
 
}
void loop() {
 
 float x = mpu.getAccelerationX()/2048.0;
 float y = mpu.getAccelerationY()/2048.0;
 float z = mpu.getAccelerationZ()/2048.0;
 
 Serial.println(sqrt(xx+yy+z*z));
 delay(25);  
}


Benutze ich meinen Code für mein Projekt gibt dieser von Anfang an 0.00 aus, aber ich verstehe nicht warum.

Dann wird der jetzige Fehler an deinem Sketch liegen.
Zeige uns bitte deinen Sketch, sonst können wir nicht sagen, wo der Fehler ist.

Da hast du Recht :=)

Hier ist mein Code:

#include <EEPROM.h>
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include <stdlib.h>
#include <SD.h>
#include <SPI.h>


#define FILE_BASE_NAME "Data"
unsigned long temps = millis();

File file;

MPU6050  mpu;

char str[20];
float anz1;
int anz2;

const int buttonPin = 4;    
const int ledPin = 5;     

int ledState = HIGH;       
int buttonState1;             
int lastButtonState1 = LOW;  
long lastDebounceTime = 0; 
long debounceDelay = 50;

const uint8_t CS_PIN = 53;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

int numTones = 1;
int tones[] = {261};
int speakerPin = 6;

int button = 7;
int switchPin[6];
int led[20];

int x11;
double x22;

unsigned long end_time;
unsigned long end_time1;
unsigned long end_time2;
unsigned long end_time3;

double ss1;

int buttonState;
int lastButtonState;

double gforce;
double gearth;

double x;
double y;
double z;

double stufe;
int var;

unsigned long timer;

int counter = 22;
int switchcounter = 8;

void setup ()
{
  Serial.begin(9600);
  
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);

  Serial.println("Initializing the SD Card...");
    if(!SD.begin(53)){
    Serial.println("Initialization failed!!!");
    return;
  }
  Serial.println("Initialzation complete");

  int i;
  for(i = 0; i < 6; i++){
    switchPin[i] = switchcounter;
    switchcounter++;
  }
  
  for(i = 0; i < 20; i++){
    if(counter == 27 || counter == 33 || counter == 39){
      counter++;
    }
    led[i] = counter;
    counter++;
  }

  mpu.dmpInitialize();
  mpu.setXGyroOffset(220);
  mpu.setYGyroOffset(76);
  mpu.setZGyroOffset(-85);
  mpu.setZAccelOffset(1788);
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_16);
  delay(500);
  
  pinMode(button, INPUT_PULLUP);
  for(i = switchPin[0]; i <= switchPin[5]; i++){
    pinMode(i, INPUT_PULLUP);
  }
  /*for(i = led[0]; i <= led[19]; i++){
    pinMode(i, OUTPUT);
  }*/
    for(i = 0; i < 20; i++){             //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      pinMode(led[i], OUTPUT);
  }
  while(digitalRead(button) == false){
     for(i = led[0]; i <= led[19]; i++){
        digitalWrite(i, i); 
        
        
        if(digitalRead(button) == true){
          break;
        }
        delay(333); 
      }

      if(i >= led[19]){
      x = mpu.getAccelerationX()/2048.0;
      y = mpu.getAccelerationY()/2048.0;
      z = mpu.getAccelerationZ()/2048.0;
      gearth = sqrt(x*x+y*y+z*z);
      Serial.println(gearth);
      int x11 = (gearth*100);
      EEPROM.write(2, x11);
      delay(2000);
    }
    end_time=millis()+1000;
  }
}

 void loop()
 {
  
  static bool fertig;
  
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState1) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState1) {
      buttonState1 = reading;
      if (buttonState1 == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState);
  lastButtonState1 = reading;

   if(((digitalRead(ledPin) == HIGH) && fertig))
   {
     if(millis() - temps >= 30)
     {
      fertig = false;
        temps = millis();  
       }
     }
   if (digitalRead(ledPin) == LOW) {
       fertig = true;
       temps = millis();
       delay(10);
   }
   if((fertig == true)&&(digitalRead(ledPin) == HIGH)){ 
    Serial.println("ERFÜLLT");
      while (SD.exists(fileName)) {
        if (fileName[BASE_NAME_SIZE + 1] != '9') {
        fileName[BASE_NAME_SIZE + 1]++;
    }   else if (fileName[BASE_NAME_SIZE] != '9') {
        fileName[BASE_NAME_SIZE + 1] = '0';
        fileName[BASE_NAME_SIZE]++;
        } else {
        Serial.println(F("Can't create file name"));
        return;
      }
    }
    file = SD.open(fileName, FILE_WRITE);
 
    if (!file) {
    Serial.println(F("open failed"));
    return;
    }
    Serial.print(F("opened: "));
    Serial.println(fileName);

    if((fertig == false)&&(digitalRead(ledPin) == LOW)){
      
    file.close();
    }
   
   file = SD.open(fileName, FILE_WRITE);
   
   if (file)
  {
    file.println("Hoechste einwirkende g-Kraft pro Sekunde:");
    Serial.println("Hoechste einwirkende g-Kraft pro Sekunde:");
    file.close();
  }
  else
  {
    Serial.println("Error in opening the file");
  }
   }
   
  x22 = (EEPROM.read(2));
  double x33 = (x22/100);
  
  int i;
  x = mpu.getAccelerationX()/2048.0;
  y = mpu.getAccelerationY()/2048.0;
  z = mpu.getAccelerationZ()/2048.0;

  if((millis()>=end_time2)){
     end_time2=millis()+200;
     gforce = (sqrt(x*x+y*y+z*z)-x33)*stufe;
     Serial.println(gforce);
     {

  for(i=switchPin[0];i<=switchPin[5];i++){
    if(digitalRead(i)==false){
      stufe = 1+((double)i-switchPin[0])/(switchPin[5]-switchPin[0]);
      var = 1+i-switchPin[0];
      buttonState = var;
    }
  }

  if(buttonState != lastButtonState){
    timer = millis();
  }
  lastButtonState = buttonState;
  if(millis() - timer >= 1300){
    var = 0;
  }
  
  int varComparer = 1;
  double comparer = 0.075;
  
  for (i = 0; i < 20; i++){
    if (i < 13){ 
      digitalWrite(led[i], (gforce >= comparer && var == 0) || var >= varComparer);
      if ( i % 2){
        varComparer++;
      }
    }
    else{
      digitalWrite(led[i], (gforce >= comparer && var == 0));
    }
    comparer += 0.075;
  }  
  
   if((millis()>=end_time3)&&(gforce >= 1.05)){
   end_time3=millis()+100;
   tone(speakerPin, tones[200]);
  }
  else
  {
    noTone(speakerPin);
  }

  if((gforce > ss1)&&(digitalRead(5) == HIGH)){
    ss1 = gforce;
    anz1=ss1;
    anz2=(anz1-(int)anz1)*100;
     if ((int)anz1==0 && anz2 < 0)
      { anz2=anz2*(-1);
        sprintf(str,"-%2i,%02i", (int)anz1, anz2); 
      }
       else
       { if(anz2 < 0)anz2=anz2*(-1);
        sprintf(str,"%3i,%02i", (int)anz1, anz2);
        }
     Serial.println(str); 
  }
  
  if((millis()>=end_time)&&(digitalRead(5) == HIGH)){
     ss1 = 0;
     Serial.println("Ruecksetzen");
     end_time=millis()+1100;
     Serial.println(str);
    }
 if((millis()>=end_time1)&&(digitalRead(5) == HIGH)){
     end_time1=millis()+1000;
     Serial.println(str);
     file = SD.open(fileName, FILE_WRITE);
     if (file)
      {
      file.println(str);
      Serial.println("Kraft gespeichert");
      file.close();
      }
       else
      {
      Serial.println("Error in opening the file");
   
       }
 }

     }
 }
   
 }

Ich habe den Sketch angesehen, kann so aber keinen Fehler finden.
Das liegt evtl. auch daran, dass der Sketch etwas unstrukturiert aufgebaut ist.

Kannst du nicht den Sketch in "Funktionen" aufteilen, in die du die einzelnen Funktionen (Sensor, SD, Anzeige, EEProm) dann einbaust und diese aus der Loop aufrufst.

Das macht das Ganze übersichtlicher und man kann durch deaktivieren einzelne Funktionen ausschalten.

So wird es für uns u.U. schwer den Fehler zu finden.

Wie sieht es denn mit der Funktion aus, wenn der Sensor direkt am Arduino betrieben wird?

Ich hab den Sketch angesehen und Fehler gefunden. Ein klassischer Arrayüberlauf, der aber in diesem Fall nur einen Wert aus dem Nirgendwo herholt.

int tones = {261};
...
tone(speakerPin, tones[200]);

Funktioniert das?
char fileName = FILE_BASE_NAME "00.csv";

Grüße Uwe

uwefed:
Ich hab den Sketch angesehen und Fehler gefunden. Ein klassischer Arrayüberlauf, der aber in diesem Fall nur einen Wert aus dem Nirgendwo herholt.

int tones = {261};

tone(speakerPin, tones[200]);

Funktioniert das?
char fileName = FILE_BASE_NAME “00.csv”;

Grüße Uwe

Du bist eben der Profi. :wink:

uwefed:
Funktioniert das?
char fileName = FILE_BASE_NAME "00.csv";

Ja. Vorausgesetzt FILE_BASE_NAME ist ein "...".

const char Text[] PROGMEM = "Man "
                            "kann "
                            "Strings "
                            "auch "
                            "so "
                            "schrei"
                            "ben.";
void setup() {
  Serial.begin(115200);
  Serial.print(F("Text = '"));
  Serial.print((const __FlashStringHelper*)Text);
  Serial.println(F("'"));
}
void loop() {}
Text = 'Man kann Strings auch so schreiben.'

Alles grundsätzlich hat schon funktioniert, ich habe auch den Aufbau auf einer Steckplatte nebenbei und dort funktioniert wirklich alles und der Sensor schickt seine Werte ohne Probleme zum Arduino.

Aber ich werde dann den Code aufteilen auf die einzelnen Funktionen damit ihr es einfacher habt.

Speedcore016:
Alles grundsätzlich hat schon funktioniert, ich habe auch den Aufbau auf einer Steckplatte nebenbei und dort funktioniert wirklich alles und der Sensor schickt seine Werte ohne Probleme zum Arduino.

Dann muss da ja noch ein Hardwarefehler sein, den wir ohne Schaltung und Foto nicht finden können.

Aber ich werde dann den Code aufteilen auf die einzelnen Funktionen damit ihr es einfacher habt.

Nicht nur wir, auch für dich wird es zukünftig einfacher, Anpassungen und Erweiterungen einzusetzen.

Hier ist mein Code:

#include <EEPROM.h>
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include <stdlib.h>
#include <SD.h>
#include <SPI.h>


#define FILE_BASE_NAME "Data"
unsigned long temps = millis();

File file;

MPU6050  mpu;

char str[20];
float anz1;
int anz2;

const int buttonPin = 4;    
const int ledPin = 5;     

int ledState = HIGH;       
int buttonState1;             
int lastButtonState1 = LOW;  
long lastDebounceTime = 0; 
long debounceDelay = 50;

const uint8_t CS_PIN = 53;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

int numTones = 1;
int tones[] = {261};
int speakerPin = 6;

int button = 7;
int switchPin[6];
int led[20];

int x11;
double x22;

unsigned long end_time;
unsigned long end_time1;
unsigned long end_time2;
unsigned long end_time3;

double ss1;

int buttonState;
int lastButtonState;

double gforce;
double gearth;

double x;
double y;
double z;

double stufe;
int var;

unsigned long timer;

int counter = 22;
int switchcounter = 8;

void setup ()
{
  Serial.begin(9600);
  
//Initialisierung der Ein / Ausgänge  
  
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);

//Initialisierung der SD Karte

  Serial.println("Initializing the SD Card...");
    if(!SD.begin(53)){
    Serial.println("Initialization failed!!!");
    return;
  }
  Serial.println("Initialzation complete");

//Einlesen des 6 Stufigen Drehschalters

  int i;
  for(i = 0; i < 6; i++){
    switchPin[i] = switchcounter;
    switchcounter++;
  }
  
//Ausnahmen Deklaration gewissen Pins

  for(i = 0; i < 20; i++){
    if(counter == 27 || counter == 33 || counter == 39){
      counter++;
    }
    led[i] = counter;
    counter++;
  }

//Sensor MPU60-50

  mpu.dmpInitialize();
  mpu.setXGyroOffset(220);
  mpu.setYGyroOffset(76);
  mpu.setZGyroOffset(-85);
  mpu.setZAccelOffset(1788);
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_16);
  delay(500);
  
  pinMode(button, INPUT_PULLUP);
  for(i = switchPin[0]; i <= switchPin[5]; i++){
    pinMode(i, INPUT_PULLUP);
  }
    for(i = 0; i < 20; i++){             
      pinMode(led[i], OUTPUT);
  }
  while(digitalRead(button) == false){
     for(i = led[0]; i <= led[19]; i++){
        digitalWrite(i, i); 
        
        
        if(digitalRead(button) == true){
          break;
        }
        delay(333); 
      }

//Speichern der Erdanziehungskraft in Gearth

      if(i >= led[19]){
      x = mpu.getAccelerationX()/2048.0;
      y = mpu.getAccelerationY()/2048.0;
      z = mpu.getAccelerationZ()/2048.0;
      gearth = sqrt(x*x+y*y+z*z);
      Serial.println(gearth);
      int x11 = (gearth*100);
      EEPROM.write(2, x11);
      delay(2000);
    }
    end_time=millis()+1000;
  }
}

 void loop()
 {

//Starten der Speicherung der Werte 
   
  static bool fertig;
  
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState1) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState1) {
      buttonState1 = reading;
      if (buttonState1 == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState);
  lastButtonState1 = reading;

   if(((digitalRead(ledPin) == HIGH) && fertig))
   {
     if(millis() - temps >= 30)
     {
      fertig = false;
        temps = millis();  
       }
     }
   if (digitalRead(ledPin) == LOW) {
       fertig = true;
       temps = millis();
       delay(10);
   }
   if((fertig == true)&&(digitalRead(ledPin) == HIGH)){ 
    Serial.println("ERFÜLLT");
      while (SD.exists(fileName)) {
        if (fileName[BASE_NAME_SIZE + 1] != '9') {
        fileName[BASE_NAME_SIZE + 1]++;
    }   else if (fileName[BASE_NAME_SIZE] != '9') {
        fileName[BASE_NAME_SIZE + 1] = '0';
        fileName[BASE_NAME_SIZE]++;
        } else {
        Serial.println(F("Can't create file name"));
        return;
      }
    }
    file = SD.open(fileName, FILE_WRITE);
 
    if (!file) {
    Serial.println(F("open failed"));
    return;
    }
    Serial.print(F("opened: "));
    Serial.println(fileName);

    if((fertig == false)&&(digitalRead(ledPin) == LOW)){
      
    file.close();
    }
   
   file = SD.open(fileName, FILE_WRITE);
   
   if (file)
  {
    file.println("Hoechste einwirkende g-Kraft pro Sekunde:");
    Serial.println("Hoechste einwirkende g-Kraft pro Sekunde:");
    file.close();
  }
  else
  {
    Serial.println("Error in opening the file");
  }
   }

//Einlesen des EEPROMS
   
  x22 = (EEPROM.read(2));
  double x33 = (x22/100);
  
//Sensor MPU-6050
  
  int i;
  x = mpu.getAccelerationX()/2048.0;
  y = mpu.getAccelerationY()/2048.0;
  z = mpu.getAccelerationZ()/2048.0;

  if((millis()>=end_time2)){
     end_time2=millis()+200;
     gforce = (sqrt(x*x+y*y+z*z)-x33)*stufe;
     Serial.println(gforce);
     {

//Einschalten der Pins mit weiterschalten der Stufe, mit einem Timer       
       
  for(i=switchPin[0];i<=switchPin[5];i++){
    if(digitalRead(i)==false){
      stufe = 1+((double)i-switchPin[0])/(switchPin[5]-switchPin[0]);
      var = 1+i-switchPin[0];
      buttonState = var;
    }
  }

  if(buttonState != lastButtonState){
    timer = millis();
  }
  lastButtonState = buttonState;
  if(millis() - timer >= 1300){
    var = 0;
  }
  
  int varComparer = 1;
  double comparer = 0.075;
  
    
//Beginn des Schalten der Leuchtdioden

  for (i = 0; i < 20; i++){
    if (i < 13){ 
      digitalWrite(led[i], (gforce >= comparer && var == 0) || var >= varComparer);
      if ( i % 2){
        varComparer++;
      }
    }
    else{
      digitalWrite(led[i], (gforce >= comparer && var == 0));
    }
    comparer += 0.075;
  }  
  
//Ende des Schalten der Leuchtdioden  
  
//Beginn des Summers 
  
   if((millis()>=end_time3)&&(gforce >= 1.05)){
   end_time3=millis()+100;
   tone(speakerPin, tones[200]);
  }
  else
  {
    noTone(speakerPin);
  }

//Ende des Summers 


//Beginn der Datenspeicherung 

  if((gforce > ss1)&&(digitalRead(5) == HIGH)){
    ss1 = gforce;
    anz1=ss1;
    anz2=(anz1-(int)anz1)*100;
     if ((int)anz1==0 && anz2 < 0)
      { anz2=anz2*(-1);
        sprintf(str,"-%2i,%02i", (int)anz1, anz2); 
      }
       else
       { if(anz2 < 0)anz2=anz2*(-1);
        sprintf(str,"%3i,%02i", (int)anz1, anz2);
        }
     Serial.println(str); 
  }
  
  if((millis()>=end_time)&&(digitalRead(5) == HIGH)){
     ss1 = 0;
     Serial.println("Ruecksetzen");
     end_time=millis()+1100;
     Serial.println(str);
    }
 if((millis()>=end_time1)&&(digitalRead(5) == HIGH)){
     end_time1=millis()+1000;
     Serial.println(str);
     file = SD.open(fileName, FILE_WRITE);
     if (file)
      {
      file.println(str);
      Serial.println("Kraft gespeichert");
      file.close();
      }
       else
      {
      Serial.println("Error in opening the file");
   
       }
 }

     }
 }
 
 //Ende der Datenspeicherung 
   
 }

Ok, du hast den Sketch etwas dokumentiert, aber wo hast du die angekündigten Funktionen versteckt?

Funktionen sind Programmteile die außerhalb der Loop laufen und aus der Loop aufgerufen werden.
Hier fälschlicherweise auch gern Unterprogramme genannt.

Funktion bedeutet beispielsweise:

// Aufruf der Funktion aus der Loop
void loop() {

EEprom_Lesen();

// dein übriger Code in der Loop

}

// Eigentliche Funktion
void EEprom_Lesen() {

// hier kommt der zur Funktion gehörende Code rein

}

Funktionen sind C Jargon. Ansonsten nennen sie sich Unterprogramme, schon um sie von mathematischen Funktionen zu unterscheiden :-]