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
}
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.
Sorry, anbei der gesamte Sende-Code.
Das mit dem Array macht natürlich Sinn
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();
}