daiqx2 发表于 2012-6-12 09:24:52

wed server+串口摄像头,有人感兴趣吗?

通过浏览器远程拍照和看照片,稍为改动就是远程报警器…

黑马 发表于 2012-6-12 09:27:44

淘宝有个四百块的wifi摄像头,带若干控制接口,不过成像似乎不怎么样,价格也偏高

daiqx2 发表于 2012-6-12 09:31:50

串口摄像头控制类库和wed server类库网上下载的,与sd操作读写文件,可以通过浏览器打开远程文件,不是一般只支持html输出的。人多有兴趣就的话就大家交流一下

Randy 发表于 2012-6-12 09:47:34

兴趣是有,但是不太懂这一块,占位看你们交流!

daiqx2 发表于 2012-6-12 12:14:43

几十块的串口摄像头就行,好像叫vc0776忘记了,回去就传代码。uno的ram不够用,mega才可以顺畅跑起来,大家要有心理准备。

沧海笑1122 发表于 2012-6-12 15:03:29

感兴趣,串口摄像头(好像也叫jpg相机)近百元吧,2560控制,就地存在SD上,通过webserver调用,是这个意思吧?需要w5100吗?等着学习。

arduino-tinker 发表于 2012-6-12 15:50:05

非常感兴趣!正想为我的小车配一个摄像头!

daiqx2 发表于 2012-6-12 16:04:46

是用w5100+sd那种官方模块。串口摄像头30
万像素的淘宝大神是六七十块,二百万象素的一百多的

daiqx2 发表于 2012-6-12 16:11:28

本来就想做个远程报警拍照的东西,然后做一个安卓客户端去轮询状态,然后调出现场照片。不过实验了硬件大部分功能可以实现后就没有搞下去,没意思了感觉上

daiqx2 发表于 2012-6-12 16:16:22

在这里抛砖引玉。用stm32读模拟摄像头然后再wed服务器才是实现这个最好选择。低成本,好效果,高速度。

飞翔的红猪 发表于 2012-6-12 16:33:51

楼主的代码和方案该抛出来了:D

daiqx2 发表于 2012-6-12 16:59:28

因为最近才发现这里有一个arduino的好地方,这几天一直在外地,今晚或明天回家把它翻出来。只要有一个人感兴趣就会放出来的。

Randy 发表于 2012-6-12 17:17:58

daiqx2 发表于 2012-6-12 16:59 static/image/common/back.gif
因为最近才发现这里有一个arduino的好地方,这几天一直在外地,今晚或明天回家把它翻出来。只要有一个人感兴 ...

你现在才发现这里是好地方啊,这里可是国内最好的Arduino论坛哦!期待您的代码。

故意 发表于 2012-6-12 17:33:58

{:soso_e113:}来这里的目的就是为了这个

daiqx2 发表于 2012-6-12 19:40:50

// -*- c++ -*-
//
// Copyright 2010 Ovidiu Predescu <[email protected]>
// Date: December 2010
// Updated: 08-JAN-2012 for Arduno IDE 1.0 by <[email protected]>
//

#include <pins_arduino.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Flash.h>
#include <SD.h>
#include <TinyWebServer.h>
#include <Adafruit_VC0706.h>
#include <SoftwareSerial.h>
/****************VALUES YOU CHANGE*************/
// The LED attached to PIN X on an Arduino board.
const int LEDPIN = 7;

// pin 4 is the SPI select pin for the SDcard
const int SD_CS = 4;

// pin 10 is the SPI select pin for the Ethernet
const int ETHER_CS = 10;

// Don't forget to modify the IP to an available one on your home network
byte ip[] = { 192, 168, 1, 177 };
/*********************************************/

static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// The initial state of the LED
int ledState = LOW;
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);
boolean has_cam=false;
void setLedEnabled(boolean state) {
ledState = state;
digitalWrite(LEDPIN, ledState);
}

inline boolean getLedState() { return ledState; }

boolean file_handler(TinyWebServer& web_server);
boolean blink_led_handler(TinyWebServer& web_server);
boolean led_status_handler(TinyWebServer& web_server);
boolean index_handler(TinyWebServer& web_server);

TinyWebServer::PathHandler handlers[] = {
// Work around Arduino's IDE preprocessor bug in handling /* inside
// strings.
//
// `put_handler' is defined in TinyWebServer
{"/", TinyWebServer::GET, &index_handler },
{"/upload/" "*", TinyWebServer::PUT, &TinyWebPutHandler::put_handler },
{"/blinkled", TinyWebServer::POST, &blink_led_handler },
{"/ledstatus" "*", TinyWebServer::GET, &led_status_handler },
{"/" "*", TinyWebServer::GET, &file_handler },
{NULL},
};

const char* headers[] = {
"Content-Length",
NULL
};

TinyWebServer web = TinyWebServer(handlers, headers);

boolean has_filesystem = true;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
SdFile imgFile;
uint16_t jpglen;
int32_t time;
byte wCount;
boolean WriteFileing=false;
char Filenamenow;
void send_file_name(TinyWebServer& web_server, const char* filename) {
if (!filename) {
    web_server.send_error_code(404);
    web_server << F("Could not parse URL");
} else {
    TinyWebServer::MimeType mime_type
      = TinyWebServer::get_mime_type_from_filename(filename);
    web_server.send_error_code(200);
    web_server.send_content_type(mime_type);
    web_server.end_headers();
    if (file.open(&root, filename, O_READ)) {
      Serial << F("Read file "); Serial.println(filename);
      web_server.send_file(file);
      file.close();
    } else {
      web_server << F("Could not find file: ") << filename << "\n";
    }
}
}

boolean file_handler(TinyWebServer& web_server) {
char* filename = TinyWebServer::get_file_from_path(web_server.get_path());
send_file_name(web_server, filename);
free(filename);
return true;
}

boolean blink_led_handler(TinyWebServer& web_server) {
web_server.send_error_code(200);
web_server.send_content_type("text/plain");
web_server.end_headers();
// Reverse the state of the LED.
setLedEnabled(!getLedState());
Client& client = web_server.get_client();
if (client.available()) {
    char ch = (char)client.read();
    if (ch == '0') {
      setLedEnabled(false);
    } else if (ch == '1') {
      setLedEnabled(true);
      PicSave();
    }
}
return true;
}

boolean led_status_handler(TinyWebServer& web_server) {
web_server.send_error_code(200);
web_server.send_content_type("text/plain");
web_server.end_headers();
Client& client = web_server.get_client();
client.println(getLedState(), DEC);
return true;
}

boolean index_handler(TinyWebServer& web_server) {
send_file_name(web_server, "INDEX.HTM");
return true;
}

void file_uploader_handler(TinyWebServer& web_server,
                           TinyWebPutHandler::PutAction action,
                           char* buffer, int size) {
static uint32_t start_time;
static uint32_t total_size;

switch (action) {
case TinyWebPutHandler::START:
    start_time = millis();
    total_size = 0;
    if (!file.isOpen()) {
      // File is not opened, create it. First obtain the desired name
      // from the request path.
      char* fname = web_server.get_file_from_path(web_server.get_path());
      if (fname) {
        Serial << F("Creating ") << fname << "\n";
        file.open(&root, fname, O_CREAT | O_WRITE | O_TRUNC);
        free(fname);
      }
    }
    break;

case TinyWebPutHandler::WRITE:
    if (file.isOpen()) {
      file.write(buffer, size);
      total_size += size;
    }
    break;

case TinyWebPutHandler::END:
    file.sync();
    Serial << F("Wrote ") << file.fileSize() << F(" bytes in ")
           << millis() - start_time << F(" millis (received ")
         << total_size << F(" bytes)\n");
    file.close();
}
}

void setup() {
Serial.begin(9600);
Serial << F("Free RAM: ") << FreeRam() << "\n";

pinMode(LEDPIN, OUTPUT);
setLedEnabled(false);

pinMode(SS_PIN, OUTPUT);        // set the SS pin as an output
                              // (necessary to keep the board as
                              // master and not SPI slave)
digitalWrite(SS_PIN, HIGH);        // and ensure SS is high

// Ensure we are in a consistent state after power-up or a reset
// button These pins are standard for the Arduino w5100 Rev 3
// ethernet board They may need to be re-jigged for different boards
pinMode(ETHER_CS, OUTPUT);         // Set the CS pin as an output
digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for
                              // configuration)
pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
digitalWrite(SD_CS, HIGH);         // Turn off the SD card! (wait for
                              // configuration)

// initialize the SD card.
Serial << F("Setting up SD card...\n");
// Pass over the speed and Chip select for the SD card
if (!card.init(SPI_FULL_SPEED, SD_CS)) {
    Serial << F("card failed\n");
    has_filesystem = false;
}
// initialize a FAT volume.
if (!volume.init(&card)) {
    Serial << F("vol.init failed!\n");
    has_filesystem = false;
}
if (!root.openRoot(&volume)) {
    Serial << F("openRoot failed");
   
    has_filesystem = false;
}

if (has_filesystem) {
    // Assign our function to `upload_handler_fn'.
    TinyWebPutHandler::put_handler_fn = file_uploader_handler;
   if(initCam()>0)
   has_cam=true;
}

// Initialize the Ethernet.
// Serial << F("Setting up the Ethernet card...\n");
Ethernet.begin(mac, ip);

// Start the web server.
// Serial << F("Web server starting...\n");
web.begin();

Serial << F("Ready to accept HTTP requests.\n");
}

void loop() {
if (has_filesystem) {
    web.process();
    Writefiles();
}
}
uint8_t initCam()
{
if (!cam.begin()) {
   // serial.println("Camera Found:");
//} else {
    Serial.println("No camera found?");
    return 0;
}
// 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("-----------------");
//}

cam.setImageSize(VC0706_640x480);      // biggest
//serial.print("Image size: ");
Serial.println("640x480");
return 1;
}
uint8_t PicSave()
{if(WriteFileing)
    return 0;
   if(has_cam==false)
    return 0;
if(!cam.takePicture())
    Serial.println("Failed to snap!");
// else
   // serial.println("Picture taken!");

// Create an image with the name IMAGExx.JPG
char filename;
strcpy(filename, "IMAGE00.JPG");
for (int i = 0; i < 40; i++) {
    filename = '0' + i/10;
    filename = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! checkExists(root,filename)) {
   //*//*if(i==19)
   //*Delxx(20,40);
    //* if(i==39)
   //*Delxx(0,20);
   
   strcpy(Filenamenow, "IMAGE00.JPG");
   Filenamenow = '0' + i/10;
    Filenamenow = '0' + i%10;
      break;
    }
}

// Open the file for writing

   imgFile.open(&root,filename, O_CREAT | O_WRITE);

// Get the size of the image (frame) taken
jpglen = cam.frameLength();
Serial.print("Storing ");
Serial.print(jpglen, DEC);
Serial.print(" byte image.");
time = millis();
//pinMode(8, OUTPUT);
// Read all the data up to # bytes!
wCount = 0; // For counting # of writes
WriteFileing=true;

// Serial.println(" ms elapsed");
return 1;
}
void Writefiles()
{
if (!WriteFileing)
return;
if (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;
   return;
}
imgFile.close();

time = millis() - time;
Serial.println("done!");
Serial.print(time);
Serial.print(Filenamenow);
WriteFileing=false;
}
boolean checkExists(SdFile& parentDir, char *filePathComponent) {

SdFile child;

boolean exists = child.open(parentDir, filePathComponent, O_RDONLY);

if (exists) {
   child.close();
}

return exists;
}
void delExists(SdFile& parentDir, char *filePathComponent) {

SdFile child;

boolean exists = child.open(parentDir, filePathComponent, O_WRITE);

if (exists) {
   child.remove();
   child.close();
    Serial.println("del!");
    Serial.println(filePathComponent);
}


}
void Delxx(int starf,int endf)
{
char filename;
strcpy(filename, "IMAGE00.JPG");
for (int i = starf; i < endf; i++) {
    filename = '0' + i/10;
    filename = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    delExists(root,filename);
}


}
页: [1] 2 3 4
查看完整版本: wed server+串口摄像头,有人感兴趣吗?