Guten Tag zusammen,
hab jetzt schon jede idee durch, die mir eingefallen ist und die ich ergoogelt habe, jedoch komme ich auf keinen grünen Zweig.
Evtl könnt ihr mir erklären warum und einen Lösungsvorschlag bieten.
Kenntnisse in Sachen Arduino: Anfänger mit Grundkenntnissen
Fall:
Ich versuche mir einen Datenlogger für 2 - n Tempertaturwerte aufzubauen. Ausgabe über LCD und Aufzeichnung auf SD-Karte mit Timestamp von einem TinyRTC.
LCD Angeschlossen und Funktionstüchtig? - Check!
TinyRTC Angeschlossen und Funktionstüchtig? - Check!
SD-Modul Angeschlossen und Funktionstüchtig? - Check!
Differenzverstärker für PT100 Aufgebaut, Angeschlossen und Funktionstüchtig? - Check!
Was heißt: Ich kann Daten ans Display senden und bekomme sie auch korrekt Angezeigt.
Kann Datum und Uhrzeit auslesen und zb. ans Display senden.
Kann ebenso auch schon zb. den ausgelesen Temperaturwert zb ans Display senden und in eine Datei schreiben.
Nun könnte man zurecht Fragen: Was willste dann hier? Läuft doch alles?
Nicht ganz: Ich möchte das Programm gerne so Aufbauen, dass man alle wichtigen Parameter, die man später auch gerne mal ändern möchte, Global (also über void setup() ) einstellbar machen.
Ebenso soll der Dateiname im späteren Betrieb mit dem aktuellen Datum versehen werden.
Z.B.:
datalog_25.08.2013.txt
Demnach geht es in diesem Konkreten um den Befehlt "SD.open".
Es gibt noch an anderer Stelle Probleme, doch in diesem Thread würde ich mich gerne auf diese Baustelle konzentrieren.
Der Befehl verlangt laut "SD.h" als erstes ein char und anschließend eine Angabe über den Modus.
SD.open(char *filename, uint8_t mode = FILE_READ)
Da ich anscheinend das mit den Variablentypen und "Sternchen" noch nicht so ganz verstanden habe stehe ich nun vor einem Problem.
Ich fange mal klein an:
Schreibe ich den Code so:
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 10;
File dataFile;
// Globale Einstellungen
char logfile[] = "datalog.txt";
RTC_DS1307 rtc;
LiquidCrystal lcd (9, 8, 5, 4, 3, 2);
////Variablen für Temperaturerfassung anlegen
int temp_pin = A0; //Analogen Eingangs-PIN mappen
int temp_raw = 0; //Variable für den rohen Eingangswert (0-1023)
int temp_value = 0; //Variable für den umgerechneten Rohdatenwert in °C
// #################################
// #################################
void setup ()
{
//Librarys initialisieren
Serial.begin(9600);
Wire.begin();
rtc.begin();
lcd.begin(20,4); //LCD Zeichen und Zeilen einstellen
//Pinmodes Definieren
pinMode(10, OUTPUT); //'ChipSelect' PIN für die SD-Karte
pinMode(temp_pin, INPUT); //Analoger Eingangspin für den Differenzverstärker
//SD-Karte initialisierung und Debugging-infos
Serial.println("Initializing SD card...");
lcd.setCursor(0,0);
lcd.print("Init SD card");
delay(500);
//Bereitschaft der SD-Karte prüfen
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
lcd.setCursor(0,1);
lcd.print("Karte defekt oder");
lcd.setCursor(0,2);
lcd.print("nicht vorhanden");
// don't do anything more:
while (1);
}
Serial.println("card initialized.");
lcd.setCursor(0,1);
lcd.print("Success!");
delay(1000);
//Bereitschaft der RealTimeClock prüfen
Serial.println("Checking RTC");
lcd.setCursor(0,2);
lcd.print("Checking RTC");
delay(800);
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
lcd.setCursor(0,3);
lcd.print("Failed!");
// following line sets the RTC to the date & time this sketch was compiled
//RTC.adjust(DateTime(__DATE__, __TIME__));
while (1);
}
Serial.println("RTC is running.");
lcd.setCursor(0,3);
lcd.print("RTC ready.");
delay(800);
lcd.clear();
delay(800);
Serial.println("Checking Logfile");
lcd.setCursor(0,0);
lcd.print("Checking Logfile");
delay(1000);
dataFile = SD.open(logfile, FILE_WRITE);
if (! dataFile) {
Serial.println("Failed!");
lcd.setCursor(0,1);
lcd.print("Failed!");
delay(800);
// Wait forever since we cant write data
while (1) ;
}
Serial.println("Logfile ready.");
lcd.setCursor(0,1);
lcd.print("Logfile ready.");
delay(800);
Serial.println("Start logging");
lcd.setCursor(0,2);
lcd.print("Start logging to");
lcd.setCursor(0,3);
lcd.print(logfile);
delay(800);
}
//########################################
//########################################
void loop () {
// Rohdaten Temperatur vom Differenzverstärker auslesen - PIN A0
temp_raw = analogRead(temp_pin);
// Rohdaten Temperatur auf 0-100°C mappen
temp_value = map (temp_raw, 0, 1023, 0, 100);
//Temp in die Logfile, Serial Monitor und LCD Schreiben
Serial.println(temp_value); //Temperatur auf Serialmonitor ausgeben
lcd.clear();
lcd.print(temp_value); //Temperatur auf LC-Dispaly ausgeben
dataFile.println(temp_value); //Logfile öffnen und log_string schreiben
dataFile.flush(); //Logfile speichern und schließen
delay(5000);
}
mit char logfile[] = "datalog.txt";
dann klappt damit die übergabe von "datalog.txt" an "SD.open" einwandfrei.
Damit wäre das "Problem" der globalen Einstellungen ganz oben im Code ja eigentlich kein Problem.
Schwierig wirds jetzt, wenn ich den Namen aus mehreren Variablen zusammen setzen will:
Mal ganz einfach nur Dateinamen und Endung verbinden:
char file[] = "datalog";
char endung[] = ".txt";
char logfile[] = file + endung;
Alleine schon das verursacht beim Kompilieren
error: invalid operands of types 'char [8]' and 'char [5]' to binary 'operator+'
Man kann auf chars kein "+" operator verwenden, OK. Aber wie verbinde ich die denn dann?
Wenn ichs so schreibe:
char file = 'datalog';
char endung = '.txt';
char logfile = file + endung;
gibt mir "Serial.println(logfile);" auch nur Müll heraus und beim Kompilieren mit SD.open() gibts dann folgendes vor den Latz: " error: invalid conversion from 'char' to 'char*'"
Ich komm da nicht weiter.
Gruß