This forum is archived, go to the new forum!

This is the old fritzing discussion forum. Search it for valuable information from 2009 to 2015.

Arduino Ethernet Wetterkamera

4711engel 4 years, 5 months ago

Hallo zusammen,
ich habe mich längere Zeit mit dem Arduino und der Auswertung von Sensoren (shields) beschäftigt und eine Wetterstation als Prototyp erstellt. Diese habe ich dann mittels Ethernet Board und DDNS so über das Internet erreichbar gemacht. Man kann nun die Daten auch auf dem Handy auf der Wiese auslesen.
Die dafür nötige kleine Webpage läuft auf dem Arduino (UNO).
Nun möchte ich diese Wetterstation erweitern und mittels einer cam von adafruit (VC0706) Wettercam-Fotos ergänzen. Der Nutzer soll die Möglichkeit bekommen über das Internet ein Foto zu machen. Dieses soll dann auf der SD-Card abgespeichert (jeweils überschrieben) und dann über die Webpage angezeigt werden. So sieht er die Wetterdaten und hat ein Foto der Umgebung.

Da ich noch keine größere Erfahrung mit dem Laden und Speichern von Bildern auf dem SD-Teil des Ethernet-Boards habe, ergibt sich das erste Problem. Im ersten Schritt möchte ich nur das dort gespeicherte Bild "IMAGE.JPG" auf der Webpage darstellen. Klappt leider noch nicht. Es gibt eben wohl kein so richtiges Dateisystem, obwohl das Bild direkt auf Root liegt.

Vielleicht kennt sich jemand damit aus und kann mir helfen.

Den zweiten Teil (Foto aufnehmen) als Funktion habe ich erst einmal auskommentiert. Läuft noch nicht. Kommt dann danach. Schritt für Schritt.

Hoffe auf Hilfe vom Forum und maile gern meinen Sketch.

Gruß

Ulli

 

 

Sketch:

 

/*
 Arduino Ethernet Camera
 Take a picture using the adafruit_vc0706 , save it on SD-Card
 and print it over ethernet on a internet browser
 */

#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <SoftwareSerial.h>    
#include <Wire.h>
#include <Adafruit_VC0706.h>
#define chipSelect 4

byte mac[] = {0x90, 0xA2, 0xDA, 0x0F, 0x1E, 0x28};  
byte ip[] = { 192, 168, 178, 45 }; // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 178, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };  
EthernetServer server(80);                             //server port     
String readString;
#define chipSelect 4


// **************  void setup  ***********************

void setup() {

  // When using hardware SPI, the SS pin MUST be set to an
  // output (even if not connected or used).  If left as a
  // floating input w/SPI on, this can cause lockuppage.
#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
  if(chipSelect != 4) pinMode(4, OUTPUT); // SS on Uno, etc.
#endif
#endif

  // Open serial communications:
  Serial.begin(9600);    
 // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
   
}

// **************  void loop  ***********************

void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
       if (client.available()) {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
         }

         //if HTTP request has ended
         if (c == '\n') {          
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
 //          client.println("Refresh: 1");  // refresh the page automatically every 1 sec
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<TITLE>Ethernet-Camera</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY BGColor=#D0F0D0>");
           client.println("<H1 align=center><Big><TT>Arduino Ethernet-Camera</TT></Big></H1>");
           client.println("<hr />");
           client.println("<TABLE Bordercolor=#000000 cellspacing=6 align=center border=0>");
           client.println("<TD>");
           client.println("<a href=\"/?button1\"\"><button>Take a picture </button></a>");
           client.println("</TD>");
           client.println("</TABLE>");
           client.println("<br />");     
           client.println("<TABLE Bordercolor=#000000 cellspacing=6 align=center border=0>");
           client.println("<TD>");
 //  Show the taken picture in the Browser     
           client.println("<IMG SRC='file://SD/IMAGE.JPG'>");
           client.println("</TD>");
           client.println("</TABLE>");
           client.println("<br />");     
           client.println("<br />");
           client.println("<p>Arduino_Ethernet_Camera.ino</p>");  
           client.println("<br />");
           client.println("</BODY>");
           client.println("</HTML>");    
           delay(1);
           //stopping client
           client.stop();
           //controls the Arduino if you press the buttons
         if (readString.indexOf("?button1") >0){
               Serial.println("Foto wird aufgenommen und gespeichert");
               takingPicture();
             }
            //clearing string for next read
          readString="";   
         }
        }
      }
     }
}

/**********************FUNCTION FOTO aufnehmen *********************/

void takingPicture(){
 
 
  Serial.println("Take a Picture starts");
 
 
/*   LATER


#if ARDUINO >= 100
// On Uno: camera TX connected to pin 2, camera RX to pin 3:
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
// On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:
//SoftwareSerial cameraconnection = SoftwareSerial(69, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

   Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);



   Serial.println("VC0706 Camera snapshot test");
  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  // Print out the camera version information (optional)
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

 

  // Set the picture size - you can choose one of 640x480, 320x240 or 160x120
  // Remember that bigger pictures take longer to transmit!
 
  cam.setImageSize(VC0706_640x480);        // biggest
  //cam.setImageSize(VC0706_320x240);        // medium
  //cam.setImageSize(VC0706_160x120);          // small

  // You can read the size back from the camera (optional, but maybe useful?)
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Image size: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
  if (imgsize == VC0706_320x240) Serial.println("320x240");
  if (imgsize == VC0706_160x120) Serial.println("160x120");
   Serial.println("Snap in 3 secs...");
  delay(3000);

  if (! cam.takePicture())
    Serial.println("Failed to snap!");
  else
    Serial.println("Picture taken!");
 
  // Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE.JPG");
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
      return;
    }
 
 
  // 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("Storing ");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  pinMode(8, 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);
    if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();

  time = millis() - time;
  Serial.println("done!");
  Serial.print(time); Serial.println(" ms elapsed");


  imgFile.close();
            Serial.println("end of taking picture");
 
 
*/        
            
}

4711engel 4 years, 5 months ago

Hi,
gibt es denn niemand in diesem Forum mit Programmiererfahrung, der mir helfen könnte?
Ich habe schon einiges probiert, aber ohne Erfolg.
Wenn ich den Button drücke, dann wird zwar der Bildschirm refreshed , aber ich schaffe es nicht die function "takingPicture ()" richtig aufzurufen, um ein Foto zu machen und die Datei auf der SD upzudaten. Vielleicht ist auch ein Ptrogrammierfehler in dieser Funktion?!?

Über Tipps würde ich mich sehr freuen, damit ich einen Schritt weiter komme und auch durch die Lösung selber lernen kann.



Kennt vielleicht jemand eine Arduino-Gruppe in Berlin? Gemeinsam gehts immer besser.

Gruß Ulli