Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« on: April 16, 2012, 01:20:15 pm » |
Hallo allerseits, ich muss mich schon wieder an Euch wenden, ich bin dabei mir einen Temperatur-Logger zu basteln. Hardware steht und funktioniert in einzelnen Sketchen. Was ich nur nicht verstehe, wie ich Daten auf der SD Karte speichere (in Log.txt) um die dann später Visuell darzustellen. In der Log.txt sollen die Daten wie folgt auf tauchen: Datum Uhrzeit Temperatur 16.4.2012 20:02 24.50°C Kann mir jemand den Code dafür zeigen und vieleicht erklären ?  Hier mein Sketch bis jetzt ( bitte nicht meckern, der ist total unübersichtlich, aber funktioniert...)  #include <SD.h> #include <SPI.h> #include <Ethernet.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include "RTClib.h"
#define ONE_WIRE_BUS 6
RTC_DS1307 RTC;
OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress outsideThermometer = { 0x28, 0x65, 0x35, 0xC3, 0x03, 0x00, 0x00, 0x35 };
//LED blinkt jede Minute für 5sekunden int ledPIN = 5; // LED liegt am (digitalen) Pin 5 long previousMillis = 0; long previousLEDmillis = 0; long LogInterval = 30000; // Zeit LED AUS (60000 = 1 min) long ledInterval = 10000; // Zeit LED AN (10000 = 10 sec) boolean ledON = false;
// Ethernet EInrichten byte mac[] = { 0xDE, 0xAD, 0xED, 0xEF, 0xFE, 0xBE }; byte ip[] = { 192, 168, 178, 216 }; byte gateway[] = { 192, 168, 178, 1 }; byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);
// SD Card const int chipSelect = 9; // CS is pin 9
void setup(void) { Ethernet.begin(mac, ip); // initialize the ethernet device, mac, ip); server.begin(); // start listening for clients
// Setzt den ledPin (Pin 5) als Ausgang pinMode(ledPIN, OUTPUT); // start serial port Serial.begin(57600); Serial.print("Pruefe ob SD Card vorhanden..."); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(9, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("Karte vorhanden und initialisiert."); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); RTC.adjust(DateTime(__DATE__, __TIME__)); } // Start up the library sensors.begin(); DEC; sensors.setResolution(outsideThermometer, 9); }
void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); if (tempC == -127.00) { Serial.print("Error getting temperature"); } else { Serial.print(tempC); } }
void loop(void) { DateTime now = RTC.now(); delay(10000); Serial.print(now.day(), DEC); Serial.print('.'); Serial.print(now.month(), DEC); Serial.print('.'); Serial.print(now.year(), DEC); Serial.print(' '); Serial.print(now.hour(), DEC); Serial.print(':'); if (now.minute()<10) { Serial.print("0"); } Serial.print(now.minute(), DEC); Serial.print(' '); sensors.requestTemperatures(); float tempoutsideThermometer = sensors.getTempC(outsideThermometer); printTemperature(outsideThermometer); Serial.print(char(176)); // Gibt das ° Grad-Zeichen aus Serial.print("C"); Serial.println();
// Ausgabe auf Website EthernetClient client = server.available(); if (client) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html><head>"); client.println("<meta http-equiv='refresh' content='10'>"); client.println("<title>Arduino Webserver</title>"); client.println("</head>"); client.println("<body>"); //---Überschrift--- client.println("<br><hr />"); client.println("<h1><div align='center'>Arduino Webserver powered by Cetax</div></h1>"); client.println("<hr /><br>"); //---Überschrift--- client.println("Die Temperatur betraegt "); client.println("<h2>"); client.println(tempoutsideThermometer); client.println("°C"); client.println("</h2>"); client.println("</BODY></HTML>"); delay(10); client.stop();//close the connection with the client } //LED Loop unsigned long currentMillis = millis(); unsigned long currentLEDmillis = millis();
if (ledON) { if(currentLEDmillis - previousMillis > ledInterval) { previousLEDmillis = currentLEDmillis; ledON = false; digitalWrite(ledPIN, LOW); } } if(currentMillis - previousMillis > LogInterval) { previousMillis = currentMillis; currentLEDmillis = 0; digitalWrite(ledPIN, HIGH); ledON = true; }
} Einpaar Beispiel habe ich schon gelesen, aber ich verstehe nicht wie ich es für meinen Temperatur-Logger umsetze  z.B.: http://www.ladyada.net/make/logshield/lighttemp.htmlVielen Dank für Eure Hilfe...
|
|
|
|
« Last Edit: April 22, 2012, 02:28:42 am by Cetax »
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #2 on: April 16, 2012, 02:32:58 pm » |
Hi, ok, habe mir den Sketch geholt und alles was mit dem Lichtsensor zu tun hat gelöscht. Und versucht das zu ändern was mit meinem DS18B20 zu tun hat, aber ich bekomme mehrere Fehlermeldungen die mir garnichts sagen  Hier der von mir geänderte Code: #include <SD.h> #include <Wire.h> #include "RTClib.h" #include <SPI.h> #include <OneWire.h> #include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // DS18B20 an Pin 6 anngeschlossen
OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0x03, 0xF6, 0xC2, 0x03, 0x00, 0x00, 0xA7 };
// how many milliseconds between grabbing data and logging it. 1000 ms is once a second #define LOG_INTERVAL 1000 // mills between entries (reduce to take more/faster data)
// how many milliseconds before writing the logged data permanently to disk // set it to the LOG_INTERVAL to write each time (safest) // set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to // the last 10 reads if power is lost but it uses less power and is much faster! #define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card uint32_t syncTime = 0; // time of last sync()
#define ECHO_TO_SERIAL 1 // echo data to serial port #define WAIT_TO_START 0 // Wait for serial input in setup()
// the digital pins that connect to the LEDs #define redLEDpin 2 #define greenLEDpin 3
// The analog pins that connect to the sensors //#define tempPin 6 //#define tempPin 1 // analog 1 //#define BANDGAPREF 14 // special indicator that we want to measure the bandgap
//#define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter! //#define bandgap_voltage 1.1 // this is not super guaranteed but its not -too- off
RTC_DS1307 RTC; // define the Real Time Clock object
// for the data logging shield, we use digital pin 10 for the SD cs line const int chipSelect = 9;
// the logging file File logfile;
void error(char *str) { Serial.print("error: "); Serial.println(str); // red LED indicates error digitalWrite(redLEDpin, HIGH);
while(1); }
void setup(void) { Serial.begin(9600); Serial.println(); sensors.begin(); DEC; // Start up the library sensors.setResolution(insideThermometer, 9); // use debugging LEDs pinMode(redLEDpin, OUTPUT); pinMode(greenLEDpin, OUTPUT); #if WAIT_TO_START Serial.println("Type any character to start"); while (!Serial.available()); #endif //WAIT_TO_START
// initialize the SD card Serial.print("Initializing SD card..."); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(9, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { error("Card failed, or not present"); } Serial.println("card initialized."); // create a new file char filename[] = "LOGGER00.CSV"; for (uint8_t i = 0; i < 100; i++) { filename[6] = i/10 + '0'; filename[7] = i%10 + '0'; if (! SD.exists(filename)) { // only open a new file if it doesn't exist logfile = SD.open(filename, FILE_WRITE); break; // leave the loop! } } if (! logfile) { error("couldnt create file"); } Serial.print("Logging to: "); Serial.println(filename);
// connect to RTC Wire.begin(); if (!RTC.begin()) { logfile.println("RTC failed"); #if ECHO_TO_SERIAL Serial.println("RTC failed"); #endif //ECHO_TO_SERIAL }
logfile.println("millis,stamp,datetime,light,temp,vcc"); #if ECHO_TO_SERIAL Serial.println("millis,stamp,datetime,light,temp,vcc"); #endif //ECHO_TO_SERIAL // If you want to set the aref to something other than 5v //analogReference(EXTERNAL); } void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); if (tempC == -127.00) { Serial.print("Error getting temperature"); } else { //Serial.print("C: "); Serial.print(tempC); } }
void loop(void) { DateTime now;
// delay for the amount of time we want between readings delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL)); digitalWrite(greenLEDpin, HIGH); // log milliseconds since starting uint32_t m = millis(); logfile.print(m); // milliseconds since start logfile.print(", "); #if ECHO_TO_SERIAL Serial.print(m); // milliseconds since start Serial.print(", "); #endif
// fetch the time now = RTC.now(); // log time logfile.print(now.unixtime()); // seconds since 1/1/1970 logfile.print(", "); logfile.print('"'); logfile.print(now.year(), DEC); logfile.print("/"); logfile.print(now.month(), DEC); logfile.print("/"); logfile.print(now.day(), DEC); logfile.print(" "); logfile.print(now.hour(), DEC); logfile.print(":"); logfile.print(now.minute(), DEC); logfile.print(":"); logfile.print(now.second(), DEC); logfile.print('"'); #if ECHO_TO_SERIAL Serial.print(now.unixtime()); // seconds since 1/1/1970 Serial.print(", "); Serial.print('"'); Serial.print(now.year(), DEC); Serial.print("/"); Serial.print(now.month(), DEC); Serial.print("/"); Serial.print(now.day(), DEC); Serial.print(" "); Serial.print(now.hour(), DEC); Serial.print(":"); Serial.print(now.minute(), DEC); Serial.print(":"); Serial.print(now.second(), DEC); Serial.print('"'); #endif //ECHO_TO_SERIAL
sensors.requestTemperatures(); float tempinsideThermometer = sensors.getTempC(insideThermometer); //damit wird die Temperatur an tempinsideThermometer gegeben
// analogRead(tempPin); // delay(10); //int tempReading = analogRead(tempPin); //int tempReading = digitalRead(tempPin); // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0 // float voltage = tempReading * aref_voltage / 1024; //float temperatureC = (voltage - 0.5) * 100 ; //float temperatureF = (temperatureC * 9 / 5) + 32; logfile.print(", "); logfile.print(tempinsideThermometer); #if ECHO_TO_SERIAL Serial.print(", "); Serial.print(tempinsideThermometer); #endif //ECHO_TO_SERIAL
// Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
logfile.println(); #if ECHO_TO_SERIAL Serial.println(); #endif // ECHO_TO_SERIAL
digitalWrite(greenLEDpin, LOW);
// Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card // which uses a bunch of power and takes time if ((millis() - syncTime) < SYNC_INTERVAL) return; syncTime = millis(); // blink LED to show we are syncing data to the card & updating FAT! digitalWrite(redLEDpin, HIGH); logfile.flush(); digitalWrite(redLEDpin, LOW); } Die Fehlermeldungen zu Posten, würde glaub ich den Rahmen sprengen... Sind sehr viele..
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 132
|
 |
« Reply #3 on: April 16, 2012, 02:43:31 pm » |
habe deinen Code übernommen und #include <RTC_DS1307.h> hinzugefügt. Nun wird alles ohne Probleme kompiliert Binary sketch size: 24538 bytes (of a 126976 byte maximum)
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #4 on: April 16, 2012, 03:39:48 pm » |
Nabend... also, habe es jetzt hinbekommen, hatte die falsche SD-Libraries. Jetzt klappt es. Vielen Dank. Zwei Fragen noch, wie kann ich es ändern, das er mir statt einer *.CSV eine *.TXT Datei erstellt? Habe es so probiert: // create a new file //char filename[] = "LOGGER00.CSV"; char filename[] = "DATALOG.TXT"; for (uint8_t i = 0; i < 100; i++) { filename[6] = i/10 + '0'; filename[7] = i%10 + '0'; if (! SD.exists(filename)) { // only open a new file if it doesn't exist logfile = SD.open(filename, FILE_WRITE); break; // leave the loop! } } Aber das hat nicht geklappt  Und wo ändere was, damit er nicht andauernd eine Neue Datei anfägt? Ich möchte, das er immer in die selbe Datei schreibt, auch wenn er mal neu gestartet wird. Vielen Dank für die tolle Hilfe bis jetzt, Suuper Forum mit klasse Leuten hier ! Daumen hoch !!
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #5 on: April 16, 2012, 03:42:43 pm » |
Hallo, wenn ich das einfüge meckert er wieder. habe deinen Code übernommen und #include <RTC_DS1307.h> hinzugefügt. Nun wird alles ohne Probleme kompiliert Binary sketch size: 24538 bytes (of a 126976 byte maximum) Aber ich habe es zum laufen bekommen (siehe Post drüber) Aber Danke für die schnelle Hilfe.
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Offline
Full Member
Karma: 1
Posts: 132
|
 |
« Reply #6 on: April 16, 2012, 03:52:04 pm » |
versuch es damit char filename[] = "DATALOG.TXT"; logfile = SD.open(filename, FILE_WRITE | O_APPEND);
|
|
|
|
« Last Edit: April 16, 2012, 04:20:21 pm by thewknd »
|
Logged
|
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #7 on: April 17, 2012, 02:26:12 pm » |
Hi thewknd, danke für den Code, funktioniert Super... VIELEN DANK !!! Nu läuft ja alles so wie es soll... Eigentlich... Es ist ja schön und gut das die Daten auf der SD-Karte geschrieben werden, aber wie kann ich denn jetzt von Extern, darauf zugreifen, um sie auszuwerten bzw. Grafisch darzustellen? Also Ethernet ist hinzugefügt und er zeigt mir auf der mini HP die aktuell gemessene Temperatur an. Ich würde gern per wget die Log-Datei auf einem anderen Rechner lesen/speichern wget http://192.168.178.216/DATALOG.TXT Oder wie macht Ihr das ?
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
0
Offline
Full Member
Karma: 3
Posts: 149
Arduino rocks
|
 |
« Reply #8 on: April 17, 2012, 03:45:33 pm » |
Hallo,
ich bereite die auf SD-Karte geschriebenen Daten mit dem Arduino so auf, dass ich sie mit dem Programm LogView per USB lesen und darstellen kann. Finde die Darstellung echt gut gelungen. Ein entsprechendes Beispiel findes Du in der Datei LogLesen.pde, die ich Dir schonmal geschickt habe. Habe die Daten aber auch schon in eine Exel-Datei verwandelt. Eine graphische Auswertung sollte damit auch möglich sein.
Gruss Kalli
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 18
Posts: 1299
|
 |
« Reply #9 on: April 18, 2012, 03:08:58 am » |
Kurze Frage, welches Ethernet-Shield verwendest Du? Wenn es das mit dem WIZ5100 Chip ist (ist das teurere Shield) ist, dann sollte das Übertragen größerer Datenmengen kein Problem sein. Bei dem "billig" Shield mit ENC28J60 wird das schwierig, da die Lib nicht mehrere TCP-Pakete in einer Verbindung verschicken kann, damit kannst Du ohne komplizierte Anpssungen der Lib nicht mehr als knapp 1500 Bytes auf einen Request verschicken. Das Problem hatten hier schon mehre Leute im Forum. Ansonsten kannst Du Dich an das Beispiel "WebServer" der Ethernet Bibliothek halten, da findest Du Code mit dem man auf einen HTTP-Request Daten verschickt. Aufpassen musst Du beim gleichzeitigen Benutzen der SD-Karte und des Ethernet-Chips, da beide die SPI Schnittstelle verwenden.
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #10 on: April 18, 2012, 05:14:13 am » |
Hi, also ich nutze das mit dem WIZ5100 Chip. @ Kalli: Mit USB geht nicht, da das Ding so verbaut wird, das es zu weit von einem PC weg ist und nur Netzwerkanschluss hat. Also, habe es mit wget versucht, leider holt er nur die HTML Datei bzw. das was sie anzeigt ab. Mit dem BeispielSkript "Webserver" werde ich mich jetzt mal beschäftigen... Mal sehen ob ich's verstehe... 
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #11 on: April 18, 2012, 05:19:38 am » |
Hallo Kalli, erstmal vielen Dank für Dateien. Ich weiss nicht was die Datei LogLesen.pde genau macht.  Bereitet sie die Daten so auf, das man sie von der SD Karte auslesen kann? Z.B. mit einem Texteditor? Hallo,
ich bereite die auf SD-Karte geschriebenen Daten mit dem Arduino so auf, dass ich sie mit dem Programm LogView per USB lesen und darstellen kann. Finde die Darstellung echt gut gelungen. Ein entsprechendes Beispiel findes Du in der Datei LogLesen.pde, die ich Dir schonmal geschickt habe. Habe die Daten aber auch schon in eine Exel-Datei verwandelt. Eine graphische Auswertung sollte damit auch möglich sein.
Gruss Kalli
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Germany
Offline
Full Member
Karma: 1
Posts: 224
|
 |
« Reply #12 on: April 18, 2012, 05:39:20 am » |
Also, wenn ich das richtig sehe, dann wird hier(siehe Code) der Request mit einer leeren Seite quittiert. Wenn ich wget http://192.168.178.216/ aufrufe, lädt er mir eine leere Datei runter, weil ja nix angegeben ist, oder versteh ich das falsch? EthernetClient client = server.available(); if (client) { // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); Wenn das bis jetzt richtig wäre, müsste ich doch beim letzten client.println(); die Datei (DATALOG.TXT) angeben, damit ich sie runterladen kann, Oder föllig miss verstanden?  Noch eine Frage,habe bei google irgendwie nix gefunden, kann den Sketch/Code auf die SD-Karte packen? Mein Sketch hat jetzt schon 29660bytes von max 32256bytes
|
|
|
|
|
Logged
|
*greatz*
CeTax
www dot blinkmann dot de
|
|
|
|
Offline
Edison Member
Karma: 18
Posts: 1299
|
 |
« Reply #13 on: April 18, 2012, 08:40:00 am » |
client.println(); die Datei (DATALOG.TXT) angeben, damit ich sie runterladen kann, Oder föllig miss verstanden?  Noch eine Frage,habe bei google irgendwie nix gefunden, kann den Sketch/Code auf die SD-Karte packen? Mein Sketch hat jetzt schon 29660bytes von max 32256bytes Im Prinzip schon, aber nicht die Datei gibst Du an, sondern Du musst diese Schrittweise einlesen und an den Client ausgeben. Datei auf der SD-Card öffnen, Daten aus der Datei lesen und per client.print() an den Client schicken. Und hier greift dann ggf. das Problem des gleichzeitigen Lesens von SD und Senden per Ethernet. Achtung, das leere client.println(); ist wichtig. Damit weiss der Browser (wget) das der HTTP-Header zuende ist und die Daten anfangen. Also erst nach dem leeren client.println(); Deine Ausgabe einbauen.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Full Member
Karma: 3
Posts: 149
Arduino rocks
|
 |
« Reply #14 on: April 18, 2012, 12:45:46 pm » |
Hallo Stefan, Ich weiss nicht was die Datei LogLesen.pde genau macht. Bereitet sie die Daten so auf, das man sie von der SD Karte auslesen kann? Z.B. mit einem Texteditor?
Generell erfolgt die Ausgabe der Daten auf SD-Karte in einem Format, das man mit jedem Texteditor lesen kann. Mein Logger unterteilt sich in zwei Teile (mit Dil-Schalter einstellbar). Im ersten Teil erfolgt die Ausgabe der Daten, bis der 1. Dil-Schalter wieder ausgeschaltet wird. Im zweiten Teil werden die Daten von der SD-Karte gelesen und etwas aufbereitet per USB an LogView übergeben. Es hat sich herausgestellt, dass das byteweise Lesen von der SD-Karte und die Ausgabe per USB teilweise fehlerhaft ist. Deshalb werden erst die Daten eingelesen und als geschlossener Block über USB ausgegeben. Zur Zeit werden noch Zeit und Temp-Daten in getrennten Dateien ausgegeben. Soll sich aber auch noch ändern. Für eine Exel Datei kann man ganz einfach beide Dateien zusammenfügen, da es Text-Dateien sind. In dem Programm können max. 6 DS-18B20 angeschlossen werden. Zur zeit benutze ich vier. Gruss Kalli
|
|
|
|
|
Logged
|
|
|
|
|
|