ich befasse mich mit dem Abspeichern von Messwerten auf eine SD-Karte. Der Aufbau sollte soweit passen.
Ein Testprogramm hat bereits funktioniert.
Nun müsste ich aber noch wissen, in welche Teile des Bsp. Codes ich meine eigenen Bausteine einfügen muss, damit alles soweit klappt, wie ich es möchte.
Hier der genutzte Code
/////////////////////////////////////////////////////////////////
// Arduino SD Card Tutorial v1.00 //
// Get the latest version of the code here: //
// http://educ8s.tv/arduino-sd-card-tutorial //
/////////////////////////////////////////////////////////////////
#include <SD.h>
#include <SPI.h>
int CS_PIN = 10;
File file;
void setup()
{
Serial.begin(9600);
initializeSD();
createFile("test.txt");
writeToFile("This is sample text!");
closeFile();
openFile("prefs.txt");
Serial.println(readLine());
Serial.println(readLine());
closeFile();
}
void loop()
{
}
void initializeSD()
{
Serial.println("Initializing SD card...");
pinMode(CS_PIN, OUTPUT);
if (SD.begin())
{
Serial.println("SD card is ready to use.");
} else
{
Serial.println("SD card initialization failed");
return;
}
}
int createFile(char filename[])
{
file = SD.open(filename, FILE_WRITE);
if (file)
{
Serial.println("File created successfully.");
return 1;
} else
{
Serial.println("Error while creating file.");
return 0;
}
}
int writeToFile(char text[])
{
if (file)
{
file.println(text);
Serial.println("Writing to file: ");
Serial.println(text);
return 1;
} else
{
Serial.println("Couldn't write to file");
return 0;
}
}
void closeFile()
{
if (file)
{
file.close();
Serial.println("File closed");
}
}
int openFile(char filename[])
{
file = SD.open(filename);
if (file)
{
Serial.println("File opened with success!");
return 1;
} else
{
Serial.println("Error opening file...");
return 0;
}
}
String readLine()
{
String received = "";
char ch;
while (file.available())
{
ch = file.read();
if (ch == '\n')
{
return String(received);
}
else
{
received += ch;
}
}
return "";
}
Bisher kenne ich void setup und void loop
Nun würde ich gerne sobald der Arduino läuft eine Temperaturmessung starten lassen.
Anfangs soll danngleichzeitig das Schreiben in die Text-Datei erfolgen. Erstmal für ein paar Sekunden. Später dann über einen Taster-Befehl.
Nun scheint es aber in diesem Code so zu sein, dass noch im Setup auf die Karte geschrieben wird. (This is a sample text).
In die loop funktion scheinen die Zeilen aber auch nicht zu gehören, da zumindest das Schreiben ja auch wieder aufhören soll.
Und was ab void initializeSD passiert ist mir auch noch gar nicht klar.
Soll ich in meinem Fall einen loop Befehl unter void Setup packen?
Das was im Testsketch im Setup funktioniert, wird auch, zwar abgewandelt, in der loop funktionieren.
Du darfst da natürlich nur einmalig, bzw. dann wenn du es brauchst, auslösen.
Z.B. über einen Taster.
Nochmal ne Frage:
Das Abspeichern klappt mittlerweile ganz gut.
Allerdings nur auf meinem Uno. Eigentlich war die Nutzung eines Nanos angedacht. Ich fürchte, dass das SD-Modul die 5V Eingangsspannung braucht. Die habe ich aber versuchsweise auch über ein Powermodul zugeführt und nur die Datenpins an den Nano angeschlossen. Hätte erwartet, dass das klappt.
Oder unterscheidet sich der Code für Uno und Nano? (Mal abgesehen davon, was ich in der IDE als Board auswähle...)
Das gleiche Problem habe ich nämlich auch noch mit meinem Temperatursensor =( Am Uno perfekt, am Nano passiert nichts.
Da UNO und NANO der gleiche Chip sind und NUR anders aussehen (ok, der Nano hat A6 und A7, Die beim Uno nicht rausgeführt sind), ist jeder Sketch unter Uno und Nano tauschbar (sofern A6/A7 nicht im Boot sind).
Wenn man mehrere Spannungen benutzt, werden Deren GND miteinander verbunden.
Ein Plus-Pol einer Batterie alleine ist ohne den zugehörigen Minus 'Nichts' - und genau Das sieht der Nano/Uno dann auch davon - Nichts.
MfG
PS: Die GND werden normal sternförmig miteinander verbunden, damit keine Schleifen entstehen, wo sich Ausgleichsströme tummeln - in der Musik unter dem Begriff 'Brummschleife' bekannt - und dort extrem unerwünscht.
@Tommy56: So etwas simples sollte es nicht sein, damit hatte ich bisher keine Probleme.
Ich war nicht ganz genau. Ich habe hier keinen Nano, sondern einen Nano 33 BLE in Verwendung.
Zu diesem habe ich gerade den Abschnitt zu 3,3 und 5 V gelesen.
Daher nun nochmal die Frage: Sind die üblichen SDModule sowohl mit 5V als auch mit 3,3 Volt zu betreiben?
@Hot Systems: Fritzing kennt den Nano 33 BLE leider nicht. Wenn ich hier noch länger rumprobieren, wird auch mal ein Schaltbild gezeichnet.
Um den Fehler hier aber doch auszuschließen:
SD -> Nano 33 BLE
GND - GND (wahlweise auf Nano 33 BLE als auch auf externem Power Modul mit 5 V)
VCC - 3,3 V (wahlweise auf Nano 33 BLE als auch auf externem Power Modul mit 5 V)
MISO - D12
MOSI - D11
SCK - D13
CS - 4 (wo es mit dem Code auf dem UNO läuft, 10 wurde auch mal probiert)
Dann noch der Code
#include <SPI.h>
#include <SD.h>
int tempPin = 0;
int buttonApin = 9;
int ledPin = 7;
bool status;
int Messzeit = 11;
//Messzeit in Sekunden
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
status = false;
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
if (SD.exists("example.txt")) {
Serial.println("example.txt exists.");
} else {
Serial.println("example.txt doesn't exist.");
}
Serial.println("Creating example.txt...");
}
void loop()
{
if (digitalRead(buttonApin) == LOW) {
digitalWrite(ledPin, HIGH);
status = true;
}
if (status == true) {
myFile = SD.open("example.txt", FILE_WRITE);
myFile.println("Hier beginnt eine neue Messung:");
myFile.println("Zeit [s], Temperaturen T1, T2 [°C]");
for (int i=0; i <= Messzeit; i++) {
int tempReading = analogRead(tempPin);
// This is OK
double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK ); // Temp Kelvin
float tempC = tempK - 273.15; // Convert Kelvin to Celcius
Serial.println(i);
myFile.print(i);
myFile.print(" , ");
myFile.print(tempC);
Serial.println(tempC);
delay(1000);
}
myFile.println("Ende der Messung");
myFile.close();
digitalWrite(ledPin, LOW);
status = false;
}
}
@Rentner: Wahrscheinlich ja, vllt auch nicht. Am UNO klappt alles ganz wunderbar. Heute habe ich die Sensorkabel gelötet und einen 24h Testlauf im Zimmer gestartet. Mit diesem Arduino könnte es am Mo losgehen =)
@combie: Hm, von solch einer Bastelei zum Beschreiben der SD-Karte wurde mir abgeraten...
@Tommy56: Was meinst du mit dem verdrahten beider Ground-Anschlüsse? Jeweils ein Jumperkabel zu -Leiste am Board? Würde nicht ein Anschluss ausreichen? Was macht das für einen Unterschied?
@HotSystems: Unter üblich habe ich die ersten 3 Treffer gemeint, die man bei Amazon und ebay erhält, wenn man Arduino SD-Module eingibt. Aber deiner Antwort entnehme ich, dass es welche für 3,3 V, 5V oder 3,3-5 V gibt.
Wir haben dann wohl eines mit 5 V Eingangsspannung erwischt. Bei AZdelivery war leider kein Datenblatt zum Runterladen dabei.
Seitdem ich aber den 5V Pin beim Arduino Nano 33 BLE gebrückt habe, kann ich die SD-Karte nutzen. (Was allerdings komisch ist, da ich genau das vorher mit der externen Spannungszuführung im Prinzip schon gemacht habe. Zu dem Zeitpunkt muss es wohl noch einen Fehler an anderer Stelle gegeben haben.)
Ich gehe schon davon aus, dass es machbar ist. Aber unserer Elektriker am Institut meinte, dass man leicht auch zu viel Temperatur in das Bauteil einbringt und leicht etwas kaputtmachen kann.
Außerdem hätte ich nach einer Anleitung suchen müssen.
Und da das SD-Modul nun funktioniert, habe ich das Problem sowieso nicht mehr.
HotSystems:
Ach ja....und das sollen wir so wissen ?
Müssen und sollen tun wir gar nichts. Das nächste Mal kann ich mich ja klarer ausdrücken. Oder schneller auf die Fragen reagieren, solange das Problem noch von Belang ist. Müssen wir wohl nicht weiter ausdisktutieren.