Show Posts
Pages: [1] 2
1  International / Deutsch / Re: Eigenes Sensorshield - MQ7 MQ2 DHT22, LCD, SD-Card, Webserver on: August 04, 2013, 12:53:01 am
Für Interessierte anbei der bisherige Code (der bei weitem nicht perfekt ist).
Der Code ist leider zu groß fürs Forum, daher gibts den im Anhang.
Verbesserungen werden immer gerne angenommen.

UPDATE: Mittlerweile ist der Code erweitert worden

+ DCF77 für Zeit
+ E-Mail Benachrichtigung bei Alarm
+ zusätzlicher DS1820 Temperatursensor.
... und etwas aufgeräumt im Code. Bei Interesse bitte melden.
2  International / Deutsch / Re: Strings für Jahr und Datum bauen on: August 03, 2013, 09:38:03 am
mittels

Code:
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

wird mir eingebaut in die loop() Schleife immer "5481" ausgegeben. Ich denke das ist genug freier Speicher.
Die Sktechgröße beträgt 39.236 Bytes von 258.048 Bytes.


EDIT:
Ich habs! Die Lösung ist
Code:
dir.seek(0);

Code:
void printDirectoryNOLAN(File dir)
{
  dir.seek(0);
  Serial.println("Lese SD-Card");
  File entry =  dir.openNextFile();
  while (entry)
  {
    Serial.println(entry.name());
    entry.close();
    entry = dir.openNextFile();
  }
  dir.rewindDirectory();
}

bzw.

Code:
void printDirectory(File dir, EthernetClient client) {
  dir.seek(0);
  client.print("vorhandene Dateien");
  Serial.println("SD-Card vorhandene Dateien");
   while(true) {
     File entry =  dir.openNextFile();
     if (! entry) {
       Serial.println("break");
       break;
     }
    client.print("<li><a href=\"");
    client.print(entry.name());
    Serial.print("Name: ");
    Serial.println(entry.name());
    client.print("\">");
    client.print(entry.name());
    client.println("</a>");
    entry.close();
   }
}

Beides funktioniert.
3  International / Deutsch / Re: Strings für Jahr und Datum bauen on: August 03, 2013, 08:07:04 am

[/quote]
Vielleicht solltest Du in Deinen Code zum Schreiben in Datei mal etwas Fehlerbehandlungs-Code einbauen.
[/quote]

Die Dateien werden fehlerfrei auf die SD geschrieben.

Code:
if(currentMillis - previousMillisLog > intervalLog) {
  previousMillisLog = currentMillis;
    myFile = SD.open(LogName, FILE_WRITE);
    if (myFile) {
     Serial.print(F("Writing to "));
    Serial.println(LogName);
    Serial.print(hour());
    Serial.print(":");
    Serial.println(minute());
    lcd.clear() ;
    lcd.print(Ethernet.localIP());
    lcd.setCursor(0, 1) ;
    lcd.print(hour());
    lcd.print(":");
    lcd.print(minute());
    lcd.print("h UTC");
    float humidity = dht.getHumidity();
    float temperature = dht.getTemperature();
    myFile.print(hour());
    myFile.print(":");
    myFile.print(minute());
    myFile.print(";");
    myFile.print(humidity);
    myFile.print(";");
    myFile.print(temperature);
    myFile.print(";");
    myFile.print(sensorValueMQ2);
    myFile.print(";");
    myFile.println(sensorValueMQ7);
    myFile.close();
    Serial.println(F("Writing done."));
    }
    else {
    Serial.println(F("FEHLER BEIM SCHREIBEN!"));
    }
  }

Code:
void printDirectoryNOLAN(File dir)
{
  Serial.println("Lese SD-Card");
  File entry =  dir.openNextFile();
  while (entry)
  {
    Serial.println(entry.name());
    entry.close();
    entry = dir.openNextFile();
  }
  dir.rewindDirectory();
}
4  International / Deutsch / Re: Strings für Jahr und Datum bauen on: August 03, 2013, 07:14:32 am
Das ist leider auch nicht die Lösung smiley-sad

Ich habe mal die SD.cpp bearbeitet:

Code:
//  if (mode & (O_APPEND | O_WRITE))
 //   file.seekSet(file.fileSize());
 // return File(file, filepath);
 
 
  if (mode & (O_APPEND | O_WRITE)) {
    file.seekSet(file.fileSize());
  } else if (mode & (O_READ)) {
    file.seekSet(0);
  }
return File(file, filepath);

bringt aber auch nichts.
5  International / Deutsch / Re: Temperatur messen mit Arduino Mega 2560 on: August 03, 2013, 06:11:39 am
Was für einen Sensor nutzt Du?
6  International / Deutsch / Re: Strings für Jahr und Datum bauen on: August 03, 2013, 06:09:58 am
Scheint ein Bug zu sein...
http://code.google.com/p/arduino/issues/detail?id=904

Weil
Quote
The resolution is simple and does not require any modifications to SD.cpp.
Simply add entry.close() to the example code as shown below

entry.close ist gesetzt.

und laut: http://arduino.cc/de/Reference/FileRewindDirectory  gibt es eine Option dir.rewindDirectory(); 
welche aber auch nicht zum Erfolg führt.
Code:
void printDirectoryNOLAN(File dir) {
  Serial.println("NOLAN : SD-Card vorhandene Dateien");
   while(true) {
     File entry =  dir.openNextFile();
     if (! entry) {
       Serial.println("break");
       dir.rewindDirectory();
       break;
     }
    Serial.print("Name: ");
    Serial.println(entry.name());
    entry.close();
   }
}
7  International / Deutsch / Re: Strings für Jahr und Datum bauen on: August 03, 2013, 05:16:33 am
Danke für den Tipp mit 8.3  smiley
Der Code funktioniert wunderbar. Vielen Dank.

Es stellte sich gerade heraus dass ich noch Probleme mit der SD-karte habe.
Ich habe eine Funktion welche mir alle Dateien auf der SD-karte ausgibt, was solange funktioniert bis ich etwas in die LogDatei schreibe. Danach funktioniert das Ausgeben aller Dateien nicht mehr.


Code:
root = SD.open("/");
printDirectoryNOLAN(root);
root.close();

- Das fuktioniert .....
Code:
void printDirectoryNOLAN(File dir) {
   while(true) {
     File entry =  dir.openNextFile();
     if (! entry) {
       break;
     }
    Serial.println(entry.name());
    entry.close();
   }
}

....aber nur solange wie keine andere Datei geöffent wird. Sobald u.s. Code ausgeführt wurde erhalte ich von "printDirectoryNOLAN" direkt den "break;"

Code:
myFile = SD.open(LogName, FILE_WRITE);
    myFile.print(humidity);
    myFile.print(";");
    myFile.print(temperature);
    myFile.print(";");
    myFile.print(sensorValueMQ2);
    myFile.print(";");
    myFile.print(sensorValueMQ7);
    myFile.close();

Habe gelesen dass immer nur eine Datei geöffnet sein darf, aber ich schließe die Dateien ja auch direkt wieder.
Hat jemand eine Erklärung dafür?

So siehts bisher aus:
8  International / Deutsch / Re: SD-Karte beschreiben on: August 03, 2013, 03:24:34 am
Zunächst die SD-Karte initialisieren, wie im "readWrite" Beispiel der SD beschrieben:

Code:
#include <SD.h>

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 Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
 
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
// nothing happens after setup
}


Danach kannst Du den Wert aus "tempC" schreiben:

Code:
// if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println(tempC);
// close the file:
    myFile.close();
    Serial.println("done.");
9  International / Deutsch / Eigenes Sensorshield - MQ7 MQ2 DHT22, LCD, SD-Card, Webserver on: August 03, 2013, 03:05:52 am
Hallo Forum,

ich baue gerade ein Sensorshield mit MQ-7 (CO-Sensor), MQ-2 (Rauchsensor), LCD-Display, DHT22 für Temperatur und Luftfeuchte, SD-Karte zum Loggen der Werte, Summer für Alarmton, und Webserver zum Anzeigen der Werte sowie Download der Logdatei per HTTP.
Das Ganze soll später auf einem Ethermega laufen. http://www.lipoly.de/index.php?main_page=product_info&products_id=214051 - und ein per Fritzing erstelltes Shield ist auch fast fertig.


Bisher ist folgendes fertig:
- Hardware
- Datum und Uhrzeit werden per NTP gezogen
- Die Werte der Sensoren werden alle 15 Minuten in eine(!) Logdatei auf die SD-Karte geschrieben
- Alarm funktioniert
- Webserver zeigt die Werte an
- Der Webserver zeigt mir alle vorhandenen Dateien auf der SD-Karte an

Was mir noch fehlt:
- Eine Logdatei pro Tag erstellen
- Download der Logdatei per HTTP
- Die vorhanden Dateien auf der SD-Karte werden nur beim ersten Aufruf angezeigt, danach nicht mehr.

Bisher habe ich alles per Try-and-Error sowie "Codeklau" von diversen Internetseiten / Howtos / Foren zum laufen gebracht.
Der Code ist mit Sicherheit alles andere als perfekt.

Zum ersten Problem:
Ich kann mir auf der seriellen Konsole schön das Datum formatieren:
Code:
Jahr = year();
Monat = month();
Tag = day();
Serial.print(Jahr);
Serial.print('-');    
if(Monat < 10)
     Serial.print('0');
Serial.print(Monat);
Serial.print('-');
if(Tag < 10)
    Serial.print('0');      
Serial.println(Tag);

das Ergibt: "2013-08-03"
Wie kann ich mir daraus einen String bauen, damit ich Dateien nach dem Schema "2013-08-03.csv" auf der SD-Karte erstellen kann?
Bzw. prüfen kann, ob schon eine Datei "2013-08-03.csv" existiert?



10  International / Deutsch / Re: GND schalten bei Common Anode on: July 24, 2013, 04:33:05 pm
Danke Serenifly für die Infos.
Eine Frage dazu habe ich noch:
Bei dem Bild wird mein jetziges Problem deutlich: http://cdn.instructables.com/FO5/9SUS/F4VNMDE6/FO59SUSF4VNMDE6.LARGE.gif
Wenn auf der ersten Anzeige (Disp1) alle 7 LED der Segmentanzeige leuchten, (DATA1 bis DATA8) und dann Disp2 dazugeschaltet wird, dann sehe ich auf Disp2 auch alle 7 LED leuchten. Das Problem hätte ich doch auch beim Einsatz von einem 2803? Oder nicht?

11  International / Deutsch / Re: GND schalten bei Common Anode on: July 24, 2013, 02:56:20 pm
Jetzt wirds peinlich... mir fällt gerade wie Schuppen von den Augen dass ich mich anscheinend mit dem multiplexen beschäftigen sollte, es sei denn ich will auf allen 4 Segmenten dieselbe Zahl haben....

Edit:
Was ich eigentlich vor habe:
Ich habe einen Arduino Ethernet, dieser bekommt per POE Strom. Es soll eine SD-Karte eingebaut werden, ein DHT22 Temp+Luftfeuchtemesser. Auf dem Arduino läuft ein kleiner Webserver der die Werte des DHT22 anzeigt. Weiterhin sollen die Werte stündlich auf die SD-Karte geschrieben in eine LogDatei geschrieben werden. Diese Logdatei ist im besten Fall über den Webserver downloadbar. Die aktuelle Uhrzeit kommt per NTP.
Um am Gerät auch die Luftfeuchtigkeit und die Temperatur ablesen zu können soll nun diese 4fach-7Segmentanzeige dienen. Und das ist auch mein größtest Problem.
12  International / Deutsch / Re: GND schalten bei Common Anode on: July 24, 2013, 12:16:18 pm
Sofern Du wirklich die Werte haben willst, so:

Code:
int value = 25;
int zehner = value / 10;
int einer = value % 10;

Wenn Zeichen (Ziffern) gewünscht sind, einfach jeweils '0' addieren.

Vielen Dank, das mit dem teilen klappt so wunderbar. Allerdings erkennt "switch" die Zahlen nicht.
Wie addiere ich die Null da passend zu ?

Code:
int tempeiner = temp % 10;
int tempzehner = temp / 10;
tempeiner = tempeiner + 0;
tempzehner = tempzehner + 0;

 switch (tempeiner) {
   CLEAR();  // Segment löschen
  case 0:   
    SEG4NULL; // Null anzeigen auf letztem Segment
    break;
  case 1:   
    SEG4EINS; // 1 anzeigen auf letztem Segment
    break;
  case 2:   

13  International / Deutsch / Re: GND schalten bei Common Anode on: July 24, 2013, 11:38:50 am
Alles klar, da hatte ich dann einen Denkfehler.
In diesem Projekt plane ich erstmal wirklich 12 Pins für die Anzeige zu "opfern".


Eine Frage noch am Rande:
Ich lese eine Temperatur aus, und habe anschließend einen 2 stelligen Wert vom Typ "int"
(als Beispiel 25) - Wie kann ich diesen Wert nun am einfachsten in "2" und "5" zerpflücken?
14  International / Deutsch / GND schalten bei Common Anode on: July 24, 2013, 08:19:26 am
Hallo zusammen,

ich habe eine 4fach 7-Segementanzeige mit "common anode".
http://img1.cdn.tradevv.com/Y201201M1186283T1G1366376/NFD-5641ABUx-21.pdf

Mittels
Code:
pinMode(Dig1A, OUTPUT)
und
Code:
digitalWrite(Dig1A, LOW);
kann ich den entsprechenden PIN auf GND ziehen und die LED leuchtet.

Wie kann ich die LED nun wieder ausschalten?
Der PIN darf ja nicht GND sein, und HIGH auch nicht.
Oder schaff ich mir lieber 7Segmentanzeigen mit Common Cathode an?
15  International / Deutsch / Re: Arduino Mega - Download Dateien von SD-Card via Browser on: December 19, 2012, 03:41:25 am
Hallo Thombo84,

du musst eine Unterscheidung machen was für eine Anfrage  an den Webserver gestellt wird und dann die Datei anstelle der Webseite zurückliefern.

Wenn ein GET ankommt ohne dass ein weiterer Befehl angehängt ist, so gebe ich die Dateiliste aus.
Klicke ich eine Datei an, so bekomme ich eine neuen Anfrage mit dem Dateinamen. Diesen kann ich abprüfen und sofern diese Datei existiert zurückgeben.
Dann habe ich noch einen Fall mehr eingebaut, der ist natürlich nicht unbedingt nötig. Und zwar kann ich auch eine Steuerung vornehmen in dem ich Befehle mitsende. Die werden mit einem GET? angekündigt.

Code:
// Look for substring such as a request to get the root file
        if (strstr(clientline, "GET / ") != 0)
        {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("<html><body bgcolor='#444444' text='#c0c0c0'>");
          client.println();
         
          // print all the files, use a helper to keep it clean
          client.println("<h2>Files:</h2>");
          ListFiles(client, LS_SIZE);
          client.println("<p><a href='INDEX.HTM'>zur&uuml;ck</a></p></body></html>");
        }
        else if (strstr(clientline, "GET /") != 0)
        {
          // this time no space after the /, so a sub-file!
          char *filename;
         
          filename = clientline + 5; // look after the "GET /" (5 chars)
          // a little trick, look for the " HTTP/1.1" string and
          // turn the first character of the substring into a 0 to clear it out.
          (strstr(clientline, " HTTP"))[0] = 0;
         
          // print the file we want
//          Serial.println(filename);
          // File couldn´t be opened
          if (! file.open(&root, filename, O_READ))
          {           
            //If it is an command, work with it
            if(filename[0] == '?')
            {
              //Function to control Pins, ect.
              ProcessInput(client, filename);
              break;
            }             
            else
            {
            // Print 404
            client.println("HTTP/1.1 404 Not Found");
            client.println("Content-Type: text/html");
            client.println();
            client.println("<h2>File Not Found!</h2>");
            }
            break;           
          }
         
          //It really is a File
//          PgmPrint("Opened!");                   
          client.println("HTTP/1.1 200 OK");
         
          if(strstr(clientline, "HTM") != 0 || strstr(clientline, "TML") != 0)
            client.println("Content-Type: text/html");         
          else
            client.println("Content-Type: text/plain");
          client.println();
         
          int16_t c;
          while ((c = file.read()) > 0)
          {
              // uncomment the serial to debug (slow!)
              //Serial.print((char)c);
              client.print((char)c);
          }
          file.close();
        }
        else
        {
          // everything else is a 404
          client.println("HTTP/1.1 404 Not Found");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<h2>File Not Found!</h2>");
        }

Was ich darüber hinaus noch gemacht habe ist, dass ich unterscheide ob die Datei eine richtige Datei ist oder eine HTML-Seite. Dann kann man im Header den Content-Type setzen und die Seite wird direkt ausgegeben. Ansonsten sieht man nur den Quelltext. Funktioniert mit Bildern hervorragend!

Gruß,
trib

Danke für den Hinweis :-)
Kleine Frage am Rande: Als was hast du "file" deklariert?
Ich versuche das gerade an meinen Sketch anzubinden, bekomme bei
Code:
file.open(&root, entry.name(), O_READ))
aber "file was not declared in this scope"
Pages: [1] 2