Arduino sendet nur sporadisch über I2C

Hallo zusammen,

ich versuche in regelmäßigen Abständen (1h) eine Textdatei von einer SD-Karte von einem Arduino Nano zu einem Arduino Mega zu senden.

Dies klappt auch die ersten paar Mal (meistens 8-12 Mal) ganz gut, dann funktioniert das Senden leider nicht mehr. Ich denke es liegt an meiner Programmierung und irgendein interner Speicher läuft voll oder so. Der Arduino Mega wird immer nach dem Senden ausgeschaltet und so jedes mal resettet. Wenn ich den Arduino Nano resette funktioniert es auch wieder, das Problem scheint also beim Arduino Nano zu liegen. Pullup Widerstände habe ich keine verwendet, da der Arduino Mega wohl zwei integriert hat.
Könnt ihr mir sagen, was ich falsch mache? Anbei der Code fürs das Datei-Senden.
Die Variable "Zeile" ist ein String.

Ich würde mich über Tipps freuen!

void Datenuebertragen()
{
  char Zeichen[1];
  
  Serial.println("Senden");
  if (!SD.begin(SD_CHIPSELECT)) 
 {
  Serial.println(F("initialization failed! (No SD card, or not correctly mounted?"));
  return;
  }
  
  myFile = SD.open(DLogFileName);
  if (myFile)
  {

     while (myFile.available())
     {

      Zeichen[1] = myFile.read();

      //wenn kein Zeilenumbruch, dann Zeichen anhängen
      if ((byte)Zeichen[1] != 13 && (byte)Zeichen[1] !=10) 
         {
         Zeile += Zeichen[1] ;
         }
      else
         {
          Zeilesenden(); //Wenn eine Zeile eingelesen ist, dann die Zeile senden
          Zeile="";
          }
      }
    } 
  }

void Zeilesenden()
{
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(Zeile.c_str());              // sends one byte
  Wire.endTransmission();    // stop transmitting 
}

Ich muß mir mal einen Textbaustein basteln um nicht dauernd das gleiche zu schreiben.

Mit diesem Sketchschnipsel kann man nichts anfangen. Gib und den gesamten Sketch.

Grüße Uwe

du legst ein Array mit einem Index an:

char Zeichen[1];

schreibst aber dann in das zweite Feld das es nicht gibt:

      Zeichen[1] = myFile.read();

das passt nicht zusammen.

C++ BEGINNT BEIM ZÄHLEN MIT 0

Mit Codeschnipsel können wir nichts anfangen.
Mach zwei Mustersketche - Sender und Empfänger
Zeige deinen Schaltplan
Zeige Echtbilder von deinem Aufbau aus dem wir jedes Kabel eindeutig erkennen können.

Hallo zusammen,

Sorry, anbei der gesamte Sende-Code.
Das mit dem Array macht natürlich Sinn :man_facepalming:
An sich geht es mir aktuell nur um die Übertragung der Datei "Testdatei.txt" zu den definierten Uhrzeiten. Hier ist der Code. Die beiden Arduinos hängen an der selben Spannungsquelle. Verbunden sind der Nano von A5 auf Mega SCL21 und Nano A4 auf Mega SDA 20.

Viele Grüße

#include "Sodaq_DS3231.h"
#include <Wire.h>
#include <SD.h>

#define SD_CHIPSELECT       10

int powerlow = 4;
int powerhigh = 5;

String Zeile;
String DLogFileName = "Testdatei.txt";

File myFile;
DateTime aktuell;

uint8_t ss;   
uint8_t mm;                        
uint8_t hh;
uint8_t d;
uint8_t m;
uint16_t y;

void setup() 
{
Wire.begin();
Wire.beginTransmission(0x68); //Für Uhr DS3231
rtc.begin();
}

void loop() 
{
Uhrzeit();
checkDatenuebertragung();
delay(60000);
}

void checkDatenuebertragung()
{
if(hh == 00 && mm == 59)
{ 
  
  megaan();
  Datenuebertragen();
  megaaus();

  }  
if(hh == 1 && mm == 59)
{ 
  megaan();
  Datenuebertragen();   
  megaaus();

//... Und so weiter mit den Uhrzeiten für die Datenweitergabe
}
}

void megaaus()
{
  pinMode(powerlow, OUTPUT);
  digitalWrite(powerlow, HIGH);
  delay(200);
  digitalWrite(powerlow, LOW);
}

void megaan()
{
  pinMode(powerhigh, OUTPUT);
  digitalWrite(powerhigh, HIGH);
  delay(200);
  digitalWrite(powerhigh, LOW);
  delay(1000);
}

void Datenuebertragen()
{
  char Zeichen[1];
  
  Serial.println("Senden");
  if (!SD.begin(SD_CHIPSELECT)) 
 {
  Serial.println(F("initialization failed! (No SD card, or not correctly mounted?"));
  return;
  }
  
  myFile = SD.open(DLogFileName);
  if (myFile)
  {

     while (myFile.available())
     {

      Zeichen[0] = myFile.read();

      //wenn kein Zeilenumbruch, dann Zeichen anhängen
      if ((byte)Zeichen[0] != 13 && (byte)Zeichen[0] !=10) 
         {
         Zeile += Zeichen[0] ;
         }
      else
         {
          Zeilesenden(); //Wenn eine Zeile eingelesen ist, dann die Zeile senden
          Zeile="";
          }
      }
    } 
  }

void Zeilesenden()
{
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(Zeile.c_str());              // sends one byte
  Wire.endTransmission();    // stop transmitting 
}

void Uhrzeit()
{
  DateTime aktuell = rtc.now();

  hh = aktuell.hour();
  mm = aktuell.minute();
  ss = aktuell.second();
  y = aktuell.year();
  m = aktuell.month();
  d = aktuell.date();
}

Dem fehlt das endTransmission();, aber das ist vermutlich wurscht. Lass mal zum Test die ganze Uhrzeit weg.

Wenn es immer noch nach einer gewissen Zeit kracht, liegts wohl am
Zeile +=
Das ist SEHR aufwendig, insbesondere bei langen Zeilen.

Hallo Michael,

ich habe die Zeile mit dem "+=" geändert und bis jetzt läuft es stabil, daran wird es wohl gelegen haben :clap:
Vielen Dank!

Grüße

Die Zeile solltest Du raus nehmen, die ist überflüssig.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.