Hallo zusammen
Ich versuche in meinem aktuellen Projekt, Daten auf einer SD-Karte zu speichern. Dazu nutze ich ein Arduino UNO mit einem Ethernet Shield 2. Das Speichern der Daten funktioniert soweit. Wenn ich das entsprechende File im bei einem Neustart im setup öffne (und wieder schliesse), kann ich das File später (im callback) nicht mehr öffnen.
Wenn ich das File im setup nicht öffne, kann ich es jedoch im callback beschreiben.
Vielen Dank schon im Voraus für eure Antworten
//SPI, Ethernet und SD Library
#include <FrameWorkHelper.h>
//Library für MQTT
#include <PubSubClient.h>
//MAC-Adresse wird festgelegt.
byte mac [] = {0xA8, 0x61, 0x0A, 0xAE, 0x51, 0x3F};
//Client und Server IP-Adressen werden festgelegt.
IPAddress server(192, 168, 1, 40);
//Arduino als Client festlegen
EthernetClient ethClient;
PubSubClient client (ethClient);
float x = 0; //x für grosses Display
float y = 0; //y für kleines Display
float xOUT = 0;
float yOUT = 0;
#define W5100_PIN 10
#define SDCS_PIN 4
File myFile;
File myFile2;
void setup () {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
Serial.begin (9600); //Serieller Monitor wird gestartet.
// Enable SD Card
pinMode(SDCS_PIN, OUTPUT);
digitalWrite(SDCS_PIN, LOW);
pinMode(W5100_PIN, OUTPUT);
digitalWrite(W5100_PIN, HIGH);
//SD-Karte starten
if (!SD.begin(4)) {
Serial.println("initialization failed!");
}
else {
Serial.println("initialization done.");
}
myFile = SD.open("values_x.txt", FILE_READ);
if (myFile) {
Serial.print("x = ");
Serial.println(myFile.read());
myFile.close();
}
myFile2 = SD.open("values_y.txt", FILE_READ);
if (myFile2) {
Serial.print("y = ");
Serial.println(myFile2.read());
myFile2.close();
}
// Enable Ethernet
digitalWrite(SDCS_PIN, HIGH);
digitalWrite(W5100_PIN, LOW);
//MQTT Parameter
client.setServer(server, 1883);
client.setCallback (callback);
//Netzwerkverbindung aufbauen
Ethernet.begin (mac);
Serial.println (Ethernet.localIP());
delay (2000);
//MQTT-Login
if (client.connect("Arduino3", "xy", "xy")) {
Serial.println ("Verbindung erfolgreich");
client.subscribe("topic");
Serial.println("subscribed to 'topic'");
Serial.println();
}
}
//handle incoming messages:
void callback(char* topic, byte* payload, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageTemp += (char)payload[i];
}
Serial.println();
//topic überprüfen & Nachrichten verarbeiten
if (String(topic) == "topic") {
if (messageTemp == "x+") {
x += 12.75;
}
else if (messageTemp == "x-") {
x -= 12.75;
}
else if (messageTemp == "y+") {
y += 12.75;
}
else if (messageTemp == "y-") {
y -= 12.75;
}
}
if (x < 0) { //verhindern, dass x unter 0 ist
x = 0;
}
if (y < 0) { //verhindern, dass y unter 0 ist
y = 0;
}
if (x > 255) { //verhindern, dass x über 255 ist
x = 255;
}
if (y > 255) { //verhindern, dass y über 255 ist
y = 255;
}
int yOUT = round(y);
Serial.print ("kleines LCD (y)= ");
Serial.println(yOUT);
analogWrite(5, yOUT);
int xOUT = round(x);
Serial.print("grosses LCD (X)= ");
Serial.println(xOUT);
analogWrite(6, xOUT);
// Enable SD Card
pinMode(SDCS_PIN, OUTPUT);
digitalWrite(SDCS_PIN, LOW);
pinMode(W5100_PIN, OUTPUT);
digitalWrite(W5100_PIN, HIGH);
//File löschen, neu anlegen und beschreiben
SD.remove("values_x.txt");
myFile = SD.open("values_x.txt", FILE_WRITE);
if (myFile) {
Serial.println("writing to 'values_x'");
myFile.seek(0);
myFile.print(xOUT);
myFile.close();
}
//File2 löschen, neu anlegen und beschreiben
SD.remove("values_y.txt");
myFile2 = SD.open("values_y.txt", FILE_WRITE);
if (myFile2) {
Serial.println("writing to 'values_y'");
myFile2.seek(0);
myFile2.print(yOUT);
myFile2.close();
}
// Enable Ethernet
digitalWrite(SDCS_PIN, HIGH);
digitalWrite(W5100_PIN, LOW);
}
void loop() {
client.loop();
}