INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ethernet-Wetter-Cam
17.06.2015, 14:56
Beitrag #25
RE: Ethernet-Wetter-Cam
Hi,
als erstes muss das hier im HTML stehen:
Code:
<img src="IMAGE.JPG">
.
Dadurch sendet der client dann nochmal ein GET fuer IMAGE.JPG. Das musst Du dann im Sketch behandeln. Das hattest Du frueher schonmal drin:
Code:
if (StrContains(HTTP_req, "GET /IMAGE.JPG")) {
                        webFile = SD.open("IMAGE.JPG");
                        if (webFile) {
                            client.println("HTTP/1.1 200 OK");
                            client.println();
                        }
                    }
Wenn Du dort vor dem "webFile = SD.open" den ganzen Kram zum Schiessen und Abspeichern des Fotos einfuegst, dann sollte das gehen.

Um Dein ganzes Coding mal etwas uebersichtlicher zu machen solltest Du Dich ausserdem mit Funktionen befassen. (http://www.arduino.cc/en/pmwiki.php?n=Re...eclaration).

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.06.2015, 15:58
Beitrag #26
RE: Ethernet-Wetter-Cam
(17.06.2015 14:56)Thorsten Pferdekämper schrieb:  Hi,
als erstes muss das hier im HTML stehen:
Code:
<img src="IMAGE.JPG">
.
Dadurch sendet der client dann nochmal ein GET fuer IMAGE.JPG. Das musst Du dann im Sketch behandeln. Das hattest Du frueher schonmal drin:
Code:
if (StrContains(HTTP_req, "GET /IMAGE.JPG")) {
                        webFile = SD.open("IMAGE.JPG");
                        if (webFile) {
                            client.println("HTTP/1.1 200 OK");
                            client.println();
                        }
                    }
Wenn Du dort vor dem "webFile = SD.open" den ganzen Kram zum Schiessen und Abspeichern des Fotos einfuegst, dann sollte das gehen.

Um Dein ganzes Coding mal etwas uebersichtlicher zu machen solltest Du Dich ausserdem mit Funktionen befassen. (http://www.arduino.cc/en/pmwiki.php?n=Re...eclaration).

Hi Thorsten,
mit dem Thema Funktionen hast Du natürlich recht. Das wird mein nächstes "Projekt". Dann wird dieser Spaghetti-Code überarbeitet.

Ich habe den if-Teil eingefügt. Nur weiß ich noch nicht, wie ich den img src - Code einfügen soll, da es ja keine HTML-Datei auf der SD gibt. Muss der hinter die Zeile client.println("HTTP/1.1 200 OK");
mit client.println davor?

Hier der aktuelle Code, der so noch kein Bild zeigt, aber der kryptische Text ist weg:

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Adafruit_VC0706.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include "DHT22.h"


int eingang= A0;   //Photosensor-Eingang
int sensorWert = 0;
#define REQ_BUF_SZ   20
#define chipSelect 4

#define DHTPIN 3     // data pin 3
#define DHTTYPE DHT22   // DHT22  (AM2302)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor your DHTPIN
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT22 mySensor(DHTPIN);

Adafruit_BMP085 bmp;  //Druck-Sensor

// Connect pin SDA of the sensor to 20
// Connect pin SCL of the sensor to 21
// Connect pin Gnd of the sensor to GROUND
// Connect pin VIN of the sensor to +5V

// MAC address from Ethernet shield sticker under board
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x1E, 0x28};
IPAddress ip(192, 168, 178, 45); // IP address, may need to change depending on network
byte gateway[] = { 192, 168, 178, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);  // create a server at port 80

File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer




Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);   // connect RX(Blau) to pin 18 and TX(weiss) to pin19


void setup() {
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
// Open serial communications and wait for port to open:
Serial.begin(9600);
  Wire.begin();

  if (!bmp.begin()) {
     Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
     while (1) {}
  }

// start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  Serial.println(Ethernet.localIP());  



    Serial.println(F("Ini SD"));
    if (!SD.begin(4)) {
        Serial.println(F("SD failed!"));
        return;    // init failed
    }

    if (!SD.exists("IMAGE.JPG")) {
        Serial.println(F("ERROR - Can't find IMAGE.JPG file!"));
        return;  // can't find picture file
    }
    Serial.println(F("IMAGE.JPG found"));

}


void loop() {


  //Photosensor
  int wert =analogRead(eingang);
  sensorWert = map(wert, 0, 1023, 0, 19);
  
  // Measure the Druck
  int p = bmp.readPressure()/100+2;

    Serial.print(F("Luftdruck:    "));
    Serial.print(p);
    Serial.println(F(" hPa"));

  // Reading temperature or humidity
  mySensor.readData();
  float h = mySensor.getHumidity();
  float t = mySensor.getTemperatureC();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println(F("Failed to read from DHT"));
  } else {
    Serial.print(F("Feuchte:    "));
    Serial.print(h);
    Serial.println(F(" %"));
    Serial.print(F("Temperatur: "));
    Serial.print(t);
    Serial.println(F(" C"));
    Serial.print(F("Helligkeit 1....20: "));
    Serial.println(sensorWert);
    Serial.println(F(" "));
    delay(5000);
  }

  // listen for incoming clients
  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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
        
        client.println("<!DOCTYPE HTML>");
      client.println("<HTML>");
        client.println("<HEAD>");
        client.println("<TITLE>Wetterstation</TITLE>");
        client.println("</HEAD>");    
       client.println("<BODY BGColor=#D0F0D0>");
        client.println("<H1 align=center><Big><TT>Wetterstation</TT></Big></H1>");
        client.println("<HR>");
        client.println("<br />");  
        client.println("<TABLE Bordercolor=#000000 cellspacing=6 align=center border=3>");
        client.println("<TR>");        
        client.println("<TD>"); client.print("<B>Feuchte: </B>"); client.println("</TD>");
        client.println("<TD>"); client.print(h); client.print(" %"); client.println("</TD>");
        client.println("</TR>");
        client.println("<TR>");
        client.println("<TD>"); client.print("<B>Temperatur: </B>"); client.println("</TD>");
        client.println("<TD>"); client.print(t); client.println(" °"); client.println("C"); client.println("</TD>");
        client.println("</TR>");
        client.println("<TR>");
        client.println("<TD>"); client.print("<B>Luftdruck: </B>"); client.println("</TD>");
        client.println("<TD>"); client.print(p); client.println(" hPa"); client.println("</TD>");
        client.println("</TR>");
        client.println("<TR>");
        client.println("<TD>"); client.print("<B>Helligkeit 1....20: </B>"); client.println("</TD>");
        client.println("<TD>"); client.println(sensorWert); client.println("</TD>");
        client.println("</TR>");
        client.println("</TABLE>");  
        client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("<br />");

                          
// ***************Start TakingPicture **********************************************
       delay(10000);
                          Serial.println(F("VC0706 test"));
                        
                        
                              // Try to locate the camera
                             if (cam.begin()) {
                                 Serial.println(F("Camera Found:"));
                              } else {
                                 Serial.println(F("No camera found?"));
                                 return;
                               }

                               // Existing image remove
                                 SD.remove("IMAGE.JPG");

                               // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
                                  //cam.setImageSize(VC0706_640x480);        // biggest
                                  cam.setImageSize(VC0706_320x240);        // medium
                                  //cam.setImageSize(VC0706_160x120);          // small

                                  Serial.println(F("Snap in 3 secs..."));
                                    delay(3000);

                                   if (! cam.takePicture())
                                       Serial.println(F("Failed to snap!"));
                                    else
                                       Serial.println(F("Picture taken!"));
  
                                    // Create an image with the name IMAGE.JPG
                                       char filename[10];
                                       strcpy(filename, "IMAGE.JPG");
                                    // Open the file for writing
                                       File imgFile = SD.open(filename, FILE_WRITE);

                                    // Get the size of the image (frame) taken  
                                       uint16_t jpglen = cam.frameLength();
                                        Serial.print(F("Storing "));
                                        Serial.print(jpglen, DEC);
                                        Serial.print(F(" byte image."));

                                       int32_t time = millis();
  
                                       pinMode(4, OUTPUT);
                                       // Read all the data up to # bytes!
                                       byte wCount = 0; // For counting # of writes
                                     while (jpglen > 0) {
                                       // read 32 bytes at a time;
                                       uint8_t *buffer;
                                       uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
                                       buffer = cam.readPicture(bytesToRead);
                                       imgFile.write(buffer, bytesToRead);
                                       jpglen -= bytesToRead;
                                      }
                                       imgFile.close();
                                       time = millis() - time;
                                       Serial.println(F("done!"));
                                       Serial.print(time); Serial.println(F(" ms elapsed"));                                
                              
// ***************** End TakingPicture *************************************************
// Get picture from SD and print in the browser

                   if (StrContains(HTTP_req, "GET /IMAGE.JPG")) {
                        webFile = SD.open("IMAGE.JPG");
                        if (webFile) {
                            client.println("HTTP/1.1 200 OK");
                            client.println();
                        }
                    }      
              
                    
                        
         client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("<br />");                
        client.println("<Small>Ethernet-Weather-Station_---DHT22_BMP085_Photosen-CAM--MEGA.ino</Small>");
      client.println("</BODY>");
     client.println("</HTML>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

/**********************StrClear *********************/

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}
/**********************StrContains *********************/
// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}



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

Gruß.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.06.2015, 16:24
Beitrag #27
RE: Ethernet-Wetter-Cam
Hi,
kann es sein, dass Du Dein eigenes Programm ueberhaupt nicht verstehst? Sorry for that, aber daran musst Du zuerst arbeiten.
Das mit dem Spaghetti-Code verhindert auch, dass Du es verstehst. Momentan ist alles irgendwie zusammengematscht.
Mach Dir mal ein paar Funktionen:
1. Eine Funktion, die die Haupt-HTML-Seite (also das, was vorher in der index.html auf der SD-Karte war), auf einen HTTP-Client ausgibt.
2. Eine Funktion, die das Kamera-Bild aufnimmt und auf die SD-Karte speichert.
3. Eine Funktion, die das Kamera-Bild von der SD-Karte liest und auf einen HTTP-Client ausgibt.

...und dann sehen wir weiter.
Gruss,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.06.2015, 20:35 (Dieser Beitrag wurde zuletzt bearbeitet: 17.06.2015 20:39 von 4711engel.)
Beitrag #28
RE: Ethernet-Wetter-Cam
(17.06.2015 16:24)Thorsten Pferdekämper schrieb:  Hi,
kann es sein, dass Du Dein eigenes Programm ueberhaupt nicht verstehst? Sorry for that, aber daran musst Du zuerst arbeiten.
Das mit dem Spaghetti-Code verhindert auch, dass Du es verstehst. Momentan ist alles irgendwie zusammengematscht.
Mach Dir mal ein paar Funktionen:
1. Eine Funktion, die die Haupt-HTML-Seite (also das, was vorher in der index.html auf der SD-Karte war), auf einen HTTP-Client ausgibt.
2. Eine Funktion, die das Kamera-Bild aufnimmt und auf die SD-Karte speichert.
3. Eine Funktion, die das Kamera-Bild von der SD-Karte liest und auf einen HTTP-Client ausgibt.

...und dann sehen wir weiter.
Gruss,
Thorsten


Hi,
ich habe jetzt erst einmal den Kamera-Aufnahme-Teil "TakingPicture" als Funktion rausgenommen. Damit schrumpft die loop schon einmal. In der Loop werden die Sensoren ausgelesen, dann das Bild aufgenommen und abgespeichert auf SD. Dann wird der HTML-Teil aufgebaut: Sensordaten. Also alle Teile, die regelmäßig (endlos) wiederholt werden müssen.
Da ich einfach noch nicht weiß, wie das genau mit dem WebServer/WebClient funktioniert, habe ich auch noch keine Idee, wie ich das Bild als Bild auf den Browser ausgeben kann. Also Teil 3. Da werde ich mir erst einmal die Tutorials anschauen.

Aktueller Code:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Adafruit_VC0706.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include "DHT22.h"


int eingang= A0;   //Photosensor-Eingang
int sensorWert = 0;
#define REQ_BUF_SZ   20
#define chipSelect 4

#define DHTPIN 3     // data pin 3
#define DHTTYPE DHT22   // DHT22  (AM2302)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor your DHTPIN
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT22 mySensor(DHTPIN);

Adafruit_BMP085 bmp;  //Druck-Sensor

// Connect pin SDA of the sensor to 20
// Connect pin SCL of the sensor to 21
// Connect pin Gnd of the sensor to GROUND
// Connect pin VIN of the sensor to +5V

// MAC address from Ethernet shield sticker under board
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x1E, 0x28};
IPAddress ip(192, 168, 178, 45); // IP address, may need to change depending on network
byte gateway[] = { 192, 168, 178, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);  // create a server at port 80

File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer




Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);   // connect RX(Blau) to pin 18 and TX(weiss) to pin19


void setup() {
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
// Open serial communications and wait for port to open:
Serial.begin(9600);
  Wire.begin();

  if (!bmp.begin()) {
     Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
     while (1) {}
  }

// start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  Serial.println(Ethernet.localIP());  



    Serial.println(F("Ini SD"));
    if (!SD.begin(4)) {
        Serial.println(F("SD failed!"));
        return;    // init failed
    }

    if (!SD.exists("IMAGE.JPG")) {
        Serial.println(F("ERROR - Can't find IMAGE.JPG file!"));
        return;  // can't find picture file
    }
    Serial.println(F("IMAGE.JPG found"));

}


void loop() {

  //Photosensor
  int wert =analogRead(eingang);
  sensorWert = map(wert, 0, 1023, 0, 19);
  
  // Measure the Druck
  int p = bmp.readPressure()/100+2;

    Serial.print(F("Luftdruck:    "));
    Serial.print(p);
    Serial.println(F(" hPa"));

  // Reading temperature or humidity
  mySensor.readData();
  float h = mySensor.getHumidity();
  float t = mySensor.getTemperatureC();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println(F("Failed to read from DHT"));
  } else {
    Serial.print(F("Feuchte:    "));
    Serial.print(h);
    Serial.println(F(" %"));
    Serial.print(F("Temperatur: "));
    Serial.print(t);
    Serial.println(F(" C"));
    Serial.print(F("Helligkeit 1....20: "));
    Serial.println(sensorWert);
    Serial.println(F(" "));
  }

// ***************Start TakingPicture **********************************************
     TakingPicture();    


// ****************Ausgabe browser *************************************************

  // listen for incoming clients
  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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();        
          client.println("<!DOCTYPE HTML>");
         client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Wetterstation</TITLE>");
          client.println("</HEAD>");    
         client.println("<BODY BGColor=#D0F0D0>");
          client.println("<H1 align=center><Big><TT>Wetterstation</TT></Big></H1>");
          client.println("<HR>");
          client.println("<br />");  
          client.println("<TABLE Bordercolor=#000000 cellspacing=6 align=center border=3>");
          client.println("<TR>");        
          client.println("<TD>"); client.print("<B>Feuchte: </B>"); client.println("</TD>");
          client.println("<TD>"); client.print(h); client.print(" %"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Temperatur: </B>"); client.println("</TD>");
          client.println("<TD>"); client.print(t); client.println(" °"); client.println("C"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Luftdruck: </B>"); client.println("</TD>");
          client.println("<TD>"); client.print(p); client.println(" hPa"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Helligkeit 1....20: </B>"); client.println("</TD>");
          client.println("<TD>"); client.println(sensorWert); client.println("</TD>");
          client.println("</TR>");
          client.println("</TABLE>");  
          client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("<br />");                        


// *******GetPicture  from SD and print in the browser ******************************
          Serial.println(F("Get Picture from SD"));
          
          client.println ("<img src=\"/IMAGE.JPG\" />");
                    if (StrContains(HTTP_req, "GET /IMAGE.JPG")) {
                             webFile = SD.open("IMAGE.JPG");
                             if (webFile) {
                                 client.println("HTTP/1.1 200 OK");
                                 client.println();
                                }
                            }    


// ***********************      
      client.println("</BODY>");
     client.println("</HTML>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
   delay(10000);
}   //  end void loop

// ***********  END ************************************************************


/********************TakingPicture - Function******************/
void TakingPicture (){

    Serial.println(F("VC0706 test"));
                        
                        
    // Try to locate the camera
    if (cam.begin()) {
           Serial.println(F("Camera Found:"));
       } else {
           Serial.println(F("No camera found?"));
           return;
                      }

     // Existing image remove
     SD.remove("IMAGE.JPG");

     // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
   //cam.setImageSize(VC0706_640x480);        // biggest
     cam.setImageSize(VC0706_320x240);        // medium
   //cam.setImageSize(VC0706_160x120);          // small

     Serial.println(F("Snap in 3 secs..."));
     delay(3000);

     if (! cam.takePicture())
          Serial.println(F("Failed to snap!"));
        else
          Serial.println(F("Picture taken!"));
  
      // Create an image with the name IMAGE.JPG
      char filename[10];
      strcpy(filename, "IMAGE.JPG");
      // Open the file for writing
      File imgFile = SD.open(filename, FILE_WRITE);

      // Get the size of the image (frame) taken  
      uint16_t jpglen = cam.frameLength();
      Serial.print(F("Storing "));
      Serial.print(jpglen, DEC);
      Serial.print(F(" byte image."));

      int32_t time = millis();
  
      pinMode(4, OUTPUT);
      // Read all the data up to # bytes!
      byte wCount = 0; // For counting # of writes
      while (jpglen > 0) {
         // read 32 bytes at a time;
         uint8_t *buffer;
         uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
         buffer = cam.readPicture(bytesToRead);
         imgFile.write(buffer, bytesToRead);
         jpglen -= bytesToRead;
                           }
      imgFile.close();
      time = millis() - time;
      Serial.println(F("done!"));
      Serial.print(time); Serial.println(F(" ms elapsed"));                                

}  // End TakingPicture.  Picture saved on SD

  
/**********************StrClear - Function*********************/

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}
/**********************StrContains - Function*********************/
// searches for the string find in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 17:48
Beitrag #29
RE: Ethernet-Wetter-Cam
Ich habe mir nun einige Foren und Tutorials angesehen, um zu verstehen, wie die Logik dieses Clients funktioniert, um das Bild IMAGE.JPG von der SD auszugeben.
Laut Tutorial http://startingelectronics.org/tutorials...ver-image/
sollte es nun wohl so funktionieren, wie ich es in meinem Code nun verwendet habe. Funktioniert aber leider noch nicht.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Adafruit_VC0706.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include "DHT22.h"


int eingang= A0;   //Photosensor-Eingang
int sensorWert = 0;
#define REQ_BUF_SZ   20
#define chipSelect 4

#define DHTPIN 3     // data pin 3
#define DHTTYPE DHT22   // DHT22  (AM2302)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor your DHTPIN
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT22 mySensor(DHTPIN);

Adafruit_BMP085 bmp;  //Druck-Sensor

// Connect pin SDA of the sensor to 20
// Connect pin SCL of the sensor to 21
// Connect pin Gnd of the sensor to GROUND
// Connect pin VIN of the sensor to +5V

// MAC address from Ethernet shield sticker under board
byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x1E, 0x28};
IPAddress ip(192, 168, 178, 45); // IP address, may need to change depending on network
byte gateway[] = { 192, 168, 178, 1 };
byte subnet[] = { 255, 255, 255, 0 };
EthernetServer server(80);  // create a server at port 80

File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer




Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);   // connect RX(Blau) to pin 18 and TX(weiss) to pin19


void setup() {
    // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
// Open serial communications and wait for port to open:
Serial.begin(9600);
  Wire.begin();

  if (!bmp.begin()) {
     Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
     while (1) {}
  }

// start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();

  Serial.println(Ethernet.localIP());  



    Serial.println(F("Ini SD"));
    if (!SD.begin(4)) {
        Serial.println(F("SD failed!"));
        return;    // init failed
    }

    if (!SD.exists("IMAGE.JPG")) {
        Serial.println(F("ERROR - Can't find IMAGE.JPG file!"));
        return;  // can't find picture file
    }
    Serial.println(F("IMAGE.JPG found"));

}


void loop() {

// ***************Start TakingPicture **********************************************
     TakingPicture();    


// ****************Ausgabe browser *************************************************

  // listen for incoming clients
  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("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 2");  // refresh the page automatically every 5 sec
          client.println();        
          client.println("<!DOCTYPE HTML>");
         client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Wetterstation</TITLE>");
          client.println("</HEAD>");    
         client.println("<BODY BGColor=#D0F0D0>");
          client.println("<H1 align=center><Big><TT>Wetterstation</TT></Big></H1>");
          client.println("<HR>");
          client.println("<br />");  
          client.println("<TABLE Bordercolor=#000000 cellspacing=6 align=center border=3>");
                    mySensor.readData();
          client.println("<TR>");        
          client.println("<TD>"); client.print("<B>Feuchte: </B>"); client.println("</TD>");
          client.println("<TD>"); client.print(mySensor.getHumidity()); client.print(" %"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Temperatur: </B>"); client.println("</TD>");
          client.println("<TD>"); client.print(mySensor.getTemperatureC()); client.println(" °"); client.println("C"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Luftdruck: </B>"); client.println("</TD>");
                int p = bmp.readPressure()/100;
          client.println("<TD>"); client.print(p); client.println(" hPa"); client.println("</TD>");
          client.println("</TR>");
          client.println("<TR>");
          client.println("<TD>"); client.print("<B>Helligkeit 1....20: </B>"); client.println("</TD>");
                int wert =analogRead(eingang);
                sensorWert = map(wert, 0, 1023, 0, 19);
          client.println("<TD>"); client.println(sensorWert); client.println("</TD>");
          client.println("</TR>");
          client.println("</TABLE>");  
          client.println("<br />"); client.println("<br />"); client.println("<br />"); client.println("<br />");                        


// *******GetPicture  from SD and print in the browser ******************************
   Serial.println(F("Get Picture from SD"));
  
       if (!SD.exists("IMAGE.JPG")) {
        Serial.println(F("ERROR - Can't find IMAGE.JPG file!"));
        return;  // can't find picture file
        }
        Serial.println(F("IMAGE.JPG found"));
  
       if (StrContains(HTTP_req, "GET / ")
                                 ||  (StrContains(HTTP_req, "GET /IMAGE.JPG"))) {
                        webFile = SD.open("IMAGE.JPG");
                        if (webFile) {
                            client.println("HTTP/1.1 200 OK");
                            client.println();
                           }
                    }
         if (webFile) {
                 while(webFile.available()) {
                 client.write(webFile.read()); // send web page to client
                        }
                 webFile.close();
                    }
                    
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
  
  

// ***********************      
      client.println("</BODY>");
     client.println("</HTML>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
   delay(10000);
}   //  end void loop

// ***********  END ************************************************************


/********************TakingPicture - Function******************/
void TakingPicture (){

    Serial.println(F("VC0706 test"));
                        
                        
    // Try to locate the camera
    if (cam.begin()) {
           Serial.println(F("Camera Found:"));
       } else {
           Serial.println(F("No camera found?"));
           return;
                      }

     // Existing image remove
     SD.remove("IMAGE.JPG");

     // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
   //cam.setImageSize(VC0706_640x480);        // biggest
     cam.setImageSize(VC0706_320x240);        // medium
   //cam.setImageSize(VC0706_160x120);          // small

     Serial.println(F("Snap in 3 secs..."));
     delay(3000);

     if (! cam.takePicture())
          Serial.println(F("Failed to snap!"));
        else
          Serial.println(F("Picture taken!"));
  
      // Create an image with the name IMAGE.JPG
      char filename[10];
      strcpy(filename, "IMAGE.JPG");
      // Open the file for writing
      File imgFile = SD.open(filename, FILE_WRITE);

      // Get the size of the image (frame) taken  
      uint16_t jpglen = cam.frameLength();
      Serial.print(F("Storing "));
      Serial.print(jpglen, DEC);
      Serial.print(F(" byte image."));

      int32_t time = millis();
  
      pinMode(4, OUTPUT);
      // Read all the data up to # bytes!
      byte wCount = 0; // For counting # of writes
      while (jpglen > 0) {
         // read 32 bytes at a time;
         uint8_t *buffer;
         uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
         buffer = cam.readPicture(bytesToRead);
         imgFile.write(buffer, bytesToRead);
         jpglen -= bytesToRead;
                           }
      imgFile.close();
      time = millis() - time;
      Serial.println(F("done!"));
      Serial.print(time); Serial.println(F(" ms elapsed"));                                

}  // End TakingPicture.  Picture saved on SD

  
/**********************StrClear - Function*********************/

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}
/**********************StrContains - Function*********************/
// searches for the string find in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}

Ich habe einfach noch keine Idee woran es liegen könnte.
Eigentlich sollte doch der GET auf der root der SD / die Datei IMAGE.JPG suchen und dann an den Browser geben. Dass die Datei dort liegt, wurde ja schon bestätigt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 19:25
Beitrag #30
RE: Ethernet-Wetter-Cam
Hi,
mach doch mal das mit den Funktionen. Dann wird das ganze vielleicht klarer.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 19:34
Beitrag #31
RE: Ethernet-Wetter-Cam
(18.06.2015 19:25)Thorsten Pferdekämper schrieb:  Hi,
mach doch mal das mit den Funktionen. Dann wird das ganze vielleicht klarer.
Gruß,
Thorsten



Hi,
also der "TakingPicture" code im sketch ist ja schon als eigene Funktion ausgelagert. In der loop befindet sich nur der HTML webcode und in der Mitte dann der Teil, der das Bild ausgeben soll. ich denke, mehr muss nicht raus. Wenn die Bildausgabe klappt, dann wird das auch eine Funktion.
Aber aktuell steckt ja hier noch das Problem.
Gruß.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 20:05
Beitrag #32
RE: Ethernet-Wetter-Cam
Ok, wenn Du besser weisst, wie es geht, dann mach es so, wie Du denkst.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino UNO und Ethernet Shield 2 POE und Fritzbox 3272 tr3 2 168 19.11.2016 10:46
Letzter Beitrag: tr3
  Ethernet Modul Enc28j60 Pin13 LED Schalten BennIY 16 521 27.09.2016 20:30
Letzter Beitrag: BennIY
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 384 05.06.2016 14:16
Letzter Beitrag: avoid
  Daten per Ethernet Shield 2 senden Mark79 3 869 22.03.2016 19:29
Letzter Beitrag: Mark79
  array von Php --> Arduino zu senden (ethernet) Mourti 0 447 27.01.2016 22:11
Letzter Beitrag: Mourti
  Port B vom Arduino Ethernet einlesen magifix 0 354 08.01.2016 10:46
Letzter Beitrag: magifix
  BARCODE Abfrage über Ethernet Shield Wampo 3 797 05.12.2015 12:11
Letzter Beitrag: Wampo
  Probleme mit SPI - Ethernet und nRF24L01 itsy 35 2.993 21.11.2015 19:59
Letzter Beitrag: ardu_arne
  Problem mit der Ethernet Library (client.connect) ardu_arne 3 654 06.10.2015 17:06
Letzter Beitrag: ardu_arne
  Probleme mit Ethernet-Shild und <wire.h> Arne 5 1.006 08.09.2015 21:18
Letzter Beitrag: Arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste